From 6524ce8bd9ce7605a4f96a4906e58bbe80cc15e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 17:31:22 +0900 Subject: [PATCH 01/25] chore(release): open dev at 2.83.0 before releasing 2.82.0 (#6875) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- desktop/src-tauri/Cargo.lock | 2 +- desktop/src-tauri/Cargo.toml | 2 +- desktop/src-tauri/tauri.conf.json | 2 +- package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index d2486a72e5a..2bfb0de69c3 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -2645,7 +2645,7 @@ dependencies = [ [[package]] name = "opencodex-desktop" -version = "2.82.0" +version = "2.83.0" dependencies = [ "base64 0.22.1", "dbus", diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index b2676e5f3ca..bed8513efd5 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "opencodex-desktop" -version = "2.82.0" +version = "2.83.0" description = "OpenCodex desktop shell" authors = ["OpenCodex contributors"] license = "MIT" diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 60b72fcd690..80755617547 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "OpenCodex", - "version": "2.82.0", + "version": "2.83.0", "identifier": "com.opencodex.desktop", "build": { "frontendDist": "../ui", diff --git a/package.json b/package.json index e33874fcff7..3166948a182 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.82.0", + "version": "2.83.0", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From 696dadc88f48d4bb2bddd73b233c787adc50ff8c Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 18:31:34 +0900 Subject: [PATCH 02/25] fix(opengateway): lower routed custom tools on the Responses wire (#6877) (#6879) --- .../src/content/docs/guides/providers.md | 2 + src/providers/registry/entries-extended.ts | 4 ++ tests/providers/opengateway-provider.test.ts | 44 ++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/guides/providers.md b/docs-site/src/content/docs/guides/providers.md index b6621a8c2ee..effa0402d31 100644 --- a/docs-site/src/content/docs/guides/providers.md +++ b/docs-site/src/content/docs/guides/providers.md @@ -608,6 +608,8 @@ public `GET /v1/models` and keeps active Chat Completions models (plus the Respo Create a key in the [OpenGateway dashboard](https://opengateway.ai/api-keys), then run `ocx provider add opengateway` or select **OpenGateway** in the dashboard. Chat requests use the configured Bearer key; the public model list does not validate that key. +On the Responses wire OpenGateway rejects replayed native custom tool calls, so the preset +lowers Codex custom tools such as code-mode `exec` to function tools before sending them. **TokenLab** ([sponsor](https://github.com/lidge-jun/opencodex/blob/main/SPONSORS.md)) is an OpenAI-compatible API gateway at [tokenlab.sh](https://tokenlab.sh/r/OPENCODEX), diff --git a/src/providers/registry/entries-extended.ts b/src/providers/registry/entries-extended.ts index b001339a1bc..d8b5785d392 100644 --- a/src/providers/registry/entries-extended.ts +++ b/src/providers/registry/entries-extended.ts @@ -1176,6 +1176,10 @@ export const PROVIDER_REGISTRY_EXTENDED: readonly ProviderRegistryEntry[] = [ "openai/o3-pro": ["text"], }, noVisionModels: ["openai/o3-pro"], + // #6877: on the Responses wire OpenGateway answers 400 once history replays native + // custom_tool_call/custom_tool_call_output items (Codex code-mode exec), and accepts the + // same request after the custom tool is lowered to a function. Same contract as xAI. + supportsResponsesCustomTools: false, // Chat is the broad wire (77/80 active rows). o3-pro is Responses-only, on all // inbounds. Only the two live-verified Sionic models bypass translation for Codex. // Other OpenAI/Anthropic/Gemini rows stay on Chat until their Responses tool replay diff --git a/tests/providers/opengateway-provider.test.ts b/tests/providers/opengateway-provider.test.ts index f18e847b7c7..0e771486929 100644 --- a/tests/providers/opengateway-provider.test.ts +++ b/tests/providers/opengateway-provider.test.ts @@ -1,13 +1,15 @@ import { afterEach, describe, expect, test } from "bun:test"; import fixture from "../fixtures/opengateway-models.json"; +import { createResponsesPassthroughAdapter } from "../../src/adapters/openai-responses"; import { buildCatalogEntries, gatherRoutedModels } from "../../src/codex/catalog"; import { clearModelCache } from "../../src/codex/model-cache"; import { buildModelsRequest } from "../../src/oauth"; -import { deriveInitProviders, deriveProviderPresets, providerConfigSeed } from "../../src/providers/derive"; +import { deriveInitProviders, deriveProviderPresets, enrichProviderFromRegistry, providerConfigSeed } from "../../src/providers/derive"; import { extractProviderModelItems, resolveProviderModelDiscovery, providerModelDiscoverySpecError } from "../../src/providers/model-discovery"; import { PROVIDER_REGISTRY, providerModelWireDefault } from "../../src/providers/registry"; import { withStubbedProviderFetch } from "../helpers/catalog-provider-fetch"; -import type { OcxConfig } from "../../src/types"; +import { withTestTranslatorBudget } from "../helpers/translator-budget"; +import type { OcxConfig, OcxProviderConfig } from "../../src/types"; const entry = PROVIDER_REGISTRY.find(row => row.id === "opengateway")!; const provider = { ...providerConfigSeed(entry), apiKey: "test-key" }; const discovery = resolveProviderModelDiscovery("opengateway", provider); @@ -72,3 +74,41 @@ describe("OpenGateway", () => { } }); }); + +// #6877: on the Responses wire OpenGateway answers 400 to replayed native custom tool history. +describe("OpenGateway Responses custom tools", () => { + // A row written by an older install carries no supportsResponsesCustomTools of its own. + const saved = (): OcxProviderConfig => ({ adapter: "openai-chat", baseUrl: "https://apis.opengateway.ai/v1", apiKey: "test-key" } as OcxProviderConfig); + test("the preset declares native custom tool shapes unsupported, without overriding an explicit value", () => { + expect(entry.supportsResponsesCustomTools).toBe(false); + const inherited = saved(); + enrichProviderFromRegistry("opengateway", inherited); + expect(inherited.supportsResponsesCustomTools).toBe(false); + const explicit = { ...saved(), supportsResponsesCustomTools: true }; + enrichProviderFromRegistry("opengateway", explicit); + expect(explicit.supportsResponsesCustomTools).toBe(true); + }); + test("replayed exec history whose tool is no longer declared reaches the upstream as function calls", () => { + const routed = saved(); + enrichProviderFromRegistry("opengateway", routed); + const adapter = withTestTranslatorBudget(createResponsesPassthroughAdapter({ ...routed, adapter: "openai-responses" })); + const built = adapter.buildRequest({ + modelId: expected[0]!, + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { + model: expected[0], + input: [ + { type: "message", role: "user", content: [{ type: "input_text", text: "list files" }] }, + { type: "custom_tool_call", call_id: "call_exec", name: "exec", input: "text(1)" }, + { type: "custom_tool_call_output", call_id: "call_exec", output: "1" }, + ], + }, + } as Parameters[0], { headers: new Headers() }); + const body = JSON.parse(String(built.body)) as { input: Array> }; + expect(body.input.map(item => item.type)).toEqual(["message", "function_call", "function_call_output"]); + expect(body.input[1]).toMatchObject({ call_id: "call_exec" }); + expect(body.input[2]).toMatchObject({ call_id: "call_exec" }); + }); +}); From be23d016cd9444aa6e1c6821b90ef5895e9fb0b0 Mon Sep 17 00:00:00 2001 From: Epinephrine Date: Sat, 10 Oct 2026 02:31:39 -0700 Subject: [PATCH 03/25] fix(config): coordinate Grok and link writers (#6869) * fix(config): serialize Grok and link writers under existing locks Hold the canonical config lock through Grok injection and cleanup, validate publication destinations, and preserve refresh-only admission. Coordinate link store mutations and revalidate recorded links before activating a bound listener. Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(grok): retain refresh skip on destination drift --------- Co-authored-by: Epinephrine <27862058+luvs01@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- scripts/test-layout/layout.json | 4 +- src/grok/inject.ts | 466 +++++++++--------- src/server/index/link-listener.ts | 47 +- src/server/management/link-routes.ts | 62 ++- structure/remote-link.md | 2 +- structure/runtime.md | 2 +- tests/fixtures/test-layout-expected.json | 4 +- .../xai/grok-config-write-lock.test.ts | 65 +++ tests/server/link-listener-mutation.test.ts | 47 ++ tests/server/link-management-routes.test.ts | 52 ++ 10 files changed, 488 insertions(+), 263 deletions(-) create mode 100644 tests/providers/xai/grok-config-write-lock.test.ts create mode 100644 tests/server/link-listener-mutation.test.ts diff --git a/scripts/test-layout/layout.json b/scripts/test-layout/layout.json index 25df8579a85..02e0808c9c1 100644 --- a/scripts/test-layout/layout.json +++ b/scripts/test-layout/layout.json @@ -126,7 +126,7 @@ "account-import.test.ts": "server", "account-pool-management-api.test.ts": "server", "link-listener-admission.test.ts": "server", - "link-listener-lifecycle.test.ts": "server", + "link-listener-lifecycle.test.ts": "server", "link-listener-mutation.test.ts": "server", "link-join-route.test.ts": "server", "core-link-boundary.test.ts": "lab", "acl-error-classification.test.ts": "lib", @@ -993,7 +993,7 @@ "gpt6-native-rows.test.ts": "codex-integration", "gpt61-sol-rows.test.ts": "codex-integration", "grok-attribution.test.ts": "providers/xai", - "grok-config-inject.test.ts": "providers/xai", + "grok-config-inject.test.ts": "providers/xai", "grok-config-write-lock.test.ts": "providers/xai", "grok-effort-inject.test.ts": "providers/xai", "grok-lifecycle.test.ts": "providers/xai", "grok-management-api.test.ts": "providers/xai", diff --git a/src/grok/inject.ts b/src/grok/inject.ts index 179571cfcb0..082997c0732 100644 --- a/src/grok/inject.ts +++ b/src/grok/inject.ts @@ -3,6 +3,7 @@ import { homedir } from "node:os"; import { join } from "node:path"; import { atomicWriteFile } from "../config"; import { atomicWriteFileNoFollow } from "../config/atomic-write"; +import { assertConfigWriteDestination, publishConfigWrite, withConfigWriteLock, type ConfigWriteLockOutcome } from "../codex/config-write-lock"; import { applyEol, dominantEol, isLoopbackHostname, providerBaseHost } from "../codex/inject"; import { grokDefaultReasoningEffort, @@ -23,7 +24,18 @@ export interface GrokInjectResult { ok: boolean; changed: boolean; message: string; - skippedReason?: "no-grok-home" | "orphaned-marker" | "non-loopback" | "refresh-only"; + skippedReason?: "no-grok-home" | "orphaned-marker" | "non-loopback" | "refresh-only" | "locked" | "unsafe"; + retryable?: boolean; +} + +function grokConfigLockRefusal(failure: Exclude, { ok: true }>): GrokInjectResult { + const retryable = failure.error === "locked"; + return { + ok: false, changed: false, retryable, + skippedReason: retryable ? "locked" : "unsafe", + message: retryable ? "Grok config write refused: another OpenCodex writer is active; retry shortly." + : "Grok config write refused: its destination or lock cannot be verified; files were preserved.", + }; } const BEGIN_MARKER = "# >>> opencodex managed block — do not edit (removed by `ocx stop`) >>>"; @@ -1155,145 +1167,152 @@ export function injectGrokConfig( const configPath = join(grokHome, "config.toml"); const backupPath = join(grokHome, "config.toml.bak-opencodex"); try { - const configExisted = existsSync(configPath); - const rawContent = configExisted ? readFileSync(configPath, "utf8") : ""; - const eol = dominantEol(rawContent); - const originalContent = applyEol(rawContent, "\n"); - const originalRegion = findManagedRegion(originalContent); - if (opts.refreshOnly && (!configExisted || !originalRegion || originalRegion.orphaned - || !opts.refreshOnly.admit() || isSymlink(configPath) || isSymlink(backupPath))) { - return refreshOnlySkipped(); - } - // Ambiguous fence: refuse before the sweep, or "outside the region" could mean the - // entire file. - if (originalRegion?.orphaned) return orphanedMarkerResult("injection"); - const previousManagedModels = managedModelAliases(originalContent, originalRegion); - - // Adopt our own pre-fence entries (#511) BEFORE reserving user aliases, so the stale - // duplicate is replaced instead of routed around forever. Runs inside the normalized - // window so the user's dominant EOL is still restored below. - // Durably marked rows use the full UNFILTERED catalog: explicitly excluded and otherwise - // hidden current models must still lose stale generated tables. Ambiguous pre-marker legacy - // rows are migrated only when this write emits their replacement. Direct callers that do not - // have a separate catalog keep the historical `models` behavior. - const catalogModelIds = opts.catalogModelIds ?? new Set(models.map(model => model.id)); - const emittedModelIds = new Set(models - .filter(model => !opts.excluded?.has(model.id)) - .map(model => model.id)); - const orphans = findOpencodexOrphans(originalContent, originalRegion) - .filter(orphan => - // A provider table carries no alias and no model id: its strict predicate (our key - // + loopback + durable marker) is itself the deletion authority, and a leftover - // collides with the regenerated provider table (duplicate key). - orphan.alias === "" - || (orphan.ownership === "legacy" - // A legacy fingerprint is not durable deletion authority. Migrate it only when this - // same write will replace the row with a marked managed table. - ? emittedModelIds.has(orphan.modelId) - : catalogModelIds.has(orphan.modelId) - || isDisabledProviderModelId( - orphan.modelId, - opts.disabledProviderNamespaces, - opts.comboPublicModelIds, - ))); - const content = removeOrphanTables(originalContent, orphans); - // Removing bytes above the fence MOVES it: recompute rather than adjust arithmetic, - // so the splice below cannot cut the file in the wrong place. - const region = orphans.length > 0 ? findManagedRegion(content) : originalRegion; - - const buildCandidate = (reservedAliases: ReadonlySet): string => { - const block = buildGrokManagedBlock(port, models, opts.hostname, reservedAliases, opts.excluded); - let candidate: string; - if (region) { - candidate = content.slice(0, region.start) + block + content.slice(region.end); - } else if (content.length === 0) { - candidate = `${block}\n`; - } else { - // One separator newline preserves the user's original terminator for stripping. - candidate = `${content}\n${block}\n`; - } - - // Repoint selectors after allocation, so parsing below checks the actual write bytes. - const nextManagedModels = managedModelAliases(candidate, findManagedRegion(candidate)); - const survivors = new Map(); - for (const [alias, modelId] of nextManagedModels) { - if (!survivors.has(modelId)) survivors.set(modelId, alias); - } - const replacements = new Map(); - for (const removed of [ - ...orphans.filter(orphan => orphan.alias !== "") - .map(orphan => ({ alias: orphan.alias, modelId: orphan.modelId })), - ...[...previousManagedModels].map(([alias, modelId]) => ({ alias, modelId })), - ]) { - if (nextManagedModels.get(removed.alias) === removed.modelId) continue; - const replacement = survivors.get(removed.modelId) ?? null; - if (replacement !== removed.alias) replacements.set(removed.alias, replacement); + const locked = withConfigWriteLock(configPath, (held): GrokInjectResult => { + const configExisted = existsSync(configPath); + const rawContent = configExisted ? readFileSync(configPath, "utf8") : ""; + const eol = dominantEol(rawContent); + const originalContent = applyEol(rawContent, "\n"); + const originalRegion = findManagedRegion(originalContent); + if (opts.refreshOnly && (!configExisted || !originalRegion || originalRegion.orphaned + || !opts.refreshOnly.admit() || isSymlink(configPath) || isSymlink(backupPath))) { + return refreshOnlySkipped(); } - return rewriteAliasReferences(candidate, replacements); - }; - - const userContent = region ? content.slice(0, region.start) + content.slice(region.end) : content; - let userContentValid = false; - try { - Bun.TOML.parse(userContent); - userContentValid = true; - } catch { - // Preserve the old, conservative reservation and write behavior for malformed user TOML. - } - let nextContent: string; - if (!userContentValid) { - nextContent = buildCandidate(userModelAliases(content, region, true)); - } else { - const validCandidate = (includeNested: boolean): string | null => { + // Ambiguous fence: refuse before the sweep, or "outside the region" could mean the + // entire file. + if (originalRegion?.orphaned) return orphanedMarkerResult("injection"); + const previousManagedModels = managedModelAliases(originalContent, originalRegion); + + // Adopt our own pre-fence entries (#511) BEFORE reserving user aliases, so the stale + // duplicate is replaced instead of routed around forever. Runs inside the normalized + // window so the user's dominant EOL is still restored below. + // Durably marked rows use the full UNFILTERED catalog: explicitly excluded and otherwise + // hidden current models must still lose stale generated tables. Ambiguous pre-marker legacy + // rows are migrated only when this write emits their replacement. Direct callers that do not + // have a separate catalog keep the historical `models` behavior. + const catalogModelIds = opts.catalogModelIds ?? new Set(models.map(model => model.id)); + const emittedModelIds = new Set(models + .filter(model => !opts.excluded?.has(model.id)) + .map(model => model.id)); + const orphans = findOpencodexOrphans(originalContent, originalRegion) + .filter(orphan => + // A provider table carries no alias and no model id: its strict predicate (our key + // + loopback + durable marker) is itself the deletion authority, and a leftover + // collides with the regenerated provider table (duplicate key). + orphan.alias === "" + || (orphan.ownership === "legacy" + // A legacy fingerprint is not durable deletion authority. Migrate it only when this + // same write will replace the row with a marked managed table. + ? emittedModelIds.has(orphan.modelId) + : catalogModelIds.has(orphan.modelId) + || isDisabledProviderModelId( + orphan.modelId, + opts.disabledProviderNamespaces, + opts.comboPublicModelIds, + ))); + const content = removeOrphanTables(originalContent, orphans); + // Removing bytes above the fence MOVES it: recompute rather than adjust arithmetic, + // so the splice below cannot cut the file in the wrong place. + const region = orphans.length > 0 ? findManagedRegion(content) : originalRegion; + + const buildCandidate = (reservedAliases: ReadonlySet): string => { + const block = buildGrokManagedBlock(port, models, opts.hostname, reservedAliases, opts.excluded); let candidate: string; - try { - candidate = buildCandidate(userModelAliases(content, region, includeNested)); - } catch (error) { - if (error instanceof Error && error.message === "Grok config rewrite refused: Bun could not parse the TOML document safely.") return null; - throw error; + if (region) { + candidate = content.slice(0, region.start) + block + content.slice(region.end); + } else if (content.length === 0) { + candidate = `${block}\n`; + } else { + // One separator newline preserves the user's original terminator for stripping. + candidate = `${content}\n${block}\n`; } - try { - Bun.TOML.parse(applyEol(candidate, eol)); - return candidate; - } catch { - return null; + + // Repoint selectors after allocation, so parsing below checks the actual write bytes. + const nextManagedModels = managedModelAliases(candidate, findManagedRegion(candidate)); + const survivors = new Map(); + for (const [alias, modelId] of nextManagedModels) { + if (!survivors.has(modelId)) survivors.set(modelId, alias); } + const replacements = new Map(); + for (const removed of [ + ...orphans.filter(orphan => orphan.alias !== "") + .map(orphan => ({ alias: orphan.alias, modelId: orphan.modelId })), + ...[...previousManagedModels].map(([alias, modelId]) => ({ alias, modelId })), + ]) { + if (nextManagedModels.get(removed.alias) === removed.modelId) continue; + const replacement = survivors.get(removed.modelId) ?? null; + if (replacement !== removed.alias) replacements.set(removed.alias, replacement); + } + return rewriteAliasReferences(candidate, replacements); }; - nextContent = validCandidate(false) ?? validCandidate(true) ?? ""; - if (nextContent === "") { - throw new Error("Grok config injection refused: neither alias choice produced valid TOML after model-reference rewriting."); - } - } - const output = applyEol(nextContent, eol); - if (output === rawContent) { - return { ok: true, changed: false, message: "Grok config already contains the current opencodex managed block." }; - } - // Back up before a first-time fence write AND before any sweep, since adopting an orphan - // deletes a table the user has in their file. Previously the adjacent-orphan layout got a - // backup only as a side effect of the fence being destroyed (which made `region` falsy); - // preserving the fence must not silently drop that safety net. - if (opts.refreshOnly) { - const refreshOnly = opts.refreshOnly; - atomicWriteFileNoFollow(configPath, output, undefined, { - validateBeforeRename: () => { + const userContent = region ? content.slice(0, region.start) + content.slice(region.end) : content; + let userContentValid = false; + try { + Bun.TOML.parse(userContent); + userContentValid = true; + } catch { + // Preserve the old, conservative reservation and write behavior for malformed user TOML. + } + let nextContent: string; + if (!userContentValid) { + nextContent = buildCandidate(userModelAliases(content, region, true)); + } else { + const validCandidate = (includeNested: boolean): string | null => { + let candidate: string; try { - if (!refreshOnly.admit() || !lstatSync(configPath).isFile() - || readFileSync(configPath, "utf8") !== rawContent) throw new Error(); - } catch { throw new GrokRefreshOnlyRefusal(); } - }, - }); - } else { - if (configExisted && (!region || orphans.length > 0)) copyBackupOnce(configPath, backupPath); - atomicWriteFile(configPath, output); - } - return { - ok: true, - changed: true, - message: region - ? "Updated the opencodex managed block in Grok config." - : "Added the opencodex managed block to Grok config.", - }; + candidate = buildCandidate(userModelAliases(content, region, includeNested)); + } catch (error) { + if (error instanceof Error && error.message === "Grok config rewrite refused: Bun could not parse the TOML document safely.") return null; + throw error; + } + try { + Bun.TOML.parse(applyEol(candidate, eol)); + return candidate; + } catch { + return null; + } + }; + nextContent = validCandidate(false) ?? validCandidate(true) ?? ""; + if (nextContent === "") { + throw new Error("Grok config injection refused: neither alias choice produced valid TOML after model-reference rewriting."); + } + } + + const output = applyEol(nextContent, eol); + if (output === rawContent) { + return { ok: true, changed: false, message: "Grok config already contains the current opencodex managed block." }; + } + // Back up before a first-time fence write AND before any sweep, since adopting an orphan + // deletes a table the user has in their file. Previously the adjacent-orphan layout got a + // backup only as a side effect of the fence being destroyed (which made `region` falsy); + // preserving the fence must not silently drop that safety net. + if (opts.refreshOnly) { + const refreshOnly = opts.refreshOnly; + publishConfigWrite(configPath, held, (destination, hooks) => atomicWriteFileNoFollow(destination, output, undefined, { + ...hooks, + validateBeforeRename: () => { + try { + hooks.validateBeforeRename?.(destination); + if (!refreshOnly.admit() || !lstatSync(configPath).isFile() + || readFileSync(configPath, "utf8") !== rawContent) throw new Error(); + } catch { throw new GrokRefreshOnlyRefusal(); } + }, + })); + } else { + const destination = assertConfigWriteDestination(configPath, held); + if (configExisted && (!region || orphans.length > 0)) copyBackupOnce(destination, backupPath); + publishConfigWrite(configPath, held, (target, hooks) => atomicWriteFile(target, output, undefined, hooks)); + } + return { + ok: true, + changed: true, + message: region + ? "Updated the opencodex managed block in Grok config." + : "Added the opencodex managed block to Grok config.", + }; + }); + if (!locked.ok) return grokConfigLockRefusal(locked); + return locked.value; } catch (error) { if (error instanceof GrokRefreshOnlyRefusal) return refreshOnlySkipped(); return errorResult("inject", error); @@ -1317,95 +1336,100 @@ export function stripGrokConfig(opts: { grokHome?: string } = {}): GrokInjectRes } try { - const rawContent = readFileSync(configPath, "utf8"); - const eol = dominantEol(rawContent); - const content = applyEol(rawContent, "\n"); - const originalRegion = findManagedRegion(content); - if (originalRegion?.orphaned) return orphanedMarkerResult("cleanup"); - - // Remove the fence against its ORIGINAL offsets first. A pre-fence orphan's span is clamped - // at the fence start and can include the separator newline injection added. Sweeping that - // orphan first and then applying this separator undo would remove one additional USER newline. - let stripped: string; - let orphanCount = 0; - if (originalRegion) { - const fullOrphans = findOpencodexOrphans(content, originalRegion) - .filter(orphan => orphan.ownership === "explicit"); - let removalEnd = originalRegion.end; - if (content.startsWith("\n", removalEnd)) removalEnd += 1; - let prefix = content.slice(0, originalRegion.start); - const restOfFile = content.slice(removalEnd); - // Undo the single separator newline injection added. Two cases, mirroring inject: - // "X\n" -> "X\n" + "\n" + block => prefix ends "\n\n", drop one. - // "X" -> "X" + "\n" + block => prefix ends "\n" at EOF, drop it. - // A block the user has appended content after is left alone: we never shrink their bytes. - if (prefix.endsWith("\n\n")) prefix = prefix.slice(0, -1); - else if (restOfFile.length === 0 && prefix.endsWith("\n")) prefix = prefix.slice(0, -1); - // Keep the old fence boundary while sweeping. Concatenating first would let the last - // pre-fence orphan absorb comment-only or bare-key user content appended after the fence. - const prefixOrphans = findOpencodexOrphans(prefix, null) - .filter(orphan => orphan.ownership === "explicit"); - const tailOrphans = findOpencodexOrphans(restOfFile, null) - .filter(orphan => orphan.ownership === "explicit"); - const removedAliases = new Set( - [...fullOrphans, ...prefixOrphans, ...tailOrphans] - .map(orphan => orphan.alias) - // Provider orphans carry no alias; their ranges above already removed the table. - .filter(alias => alias !== ""), - ); - // The backup must cover every removed TABLE, not just aliased rows: provider-only - // orphans carry no alias and would otherwise be swept without any backup. - orphanCount = new Set( - [...fullOrphans, ...prefixOrphans, ...tailOrphans] - .flatMap(orphan => orphanRanges([orphan])), - ).size; - const fullRanges = orphanRanges(fullOrphans); - const prefixRanges = [ - ...orphanRanges(prefixOrphans), - ...fullRanges.filter(range => range.end <= originalRegion.start), - ]; - const tailRanges = [ - ...orphanRanges(tailOrphans), - ...fullRanges - .filter(range => range.start >= removalEnd) - .map(range => ({ start: range.start - removalEnd, end: range.end - removalEnd })), - ]; - // Preserve the original fence as a structural boundary while cleaning references too. - // Joining first can re-parent a headerless tail under the last table in `prefix`. - stripped = removeAliasReferences( - removeTableRanges(prefix, prefixRanges), - removedAliases, - ) + removeAliasReferences( - removeTableRanges(restOfFile, tailRanges), - removedAliases, - false, - ); - } else { - // Retired or otherwise non-emitted OpenCodex tables may intentionally remain outside the - // fence while the integration is enabled. Teardown owns those strictly identified tables - // even after Grok has re-serialized the file and dropped our marker comments. - const orphans = findOpencodexOrphans(content, null) - .filter(orphan => orphan.ownership === "explicit"); - if (orphans.length === 0) { - return { ok: true, changed: false, message: "No opencodex managed block found in Grok config." }; + const locked = withConfigWriteLock(configPath, (held): GrokInjectResult => { + const rawContent = readFileSync(configPath, "utf8"); + const eol = dominantEol(rawContent); + const content = applyEol(rawContent, "\n"); + const originalRegion = findManagedRegion(content); + if (originalRegion?.orphaned) return orphanedMarkerResult("cleanup"); + + // Remove the fence against its ORIGINAL offsets first. A pre-fence orphan's span is clamped + // at the fence start and can include the separator newline injection added. Sweeping that + // orphan first and then applying this separator undo would remove one additional USER newline. + let stripped: string; + let orphanCount = 0; + if (originalRegion) { + const fullOrphans = findOpencodexOrphans(content, originalRegion) + .filter(orphan => orphan.ownership === "explicit"); + let removalEnd = originalRegion.end; + if (content.startsWith("\n", removalEnd)) removalEnd += 1; + let prefix = content.slice(0, originalRegion.start); + const restOfFile = content.slice(removalEnd); + // Undo the single separator newline injection added. Two cases, mirroring inject: + // "X\n" -> "X\n" + "\n" + block => prefix ends "\n\n", drop one. + // "X" -> "X" + "\n" + block => prefix ends "\n" at EOF, drop it. + // A block the user has appended content after is left alone: we never shrink their bytes. + if (prefix.endsWith("\n\n")) prefix = prefix.slice(0, -1); + else if (restOfFile.length === 0 && prefix.endsWith("\n")) prefix = prefix.slice(0, -1); + // Keep the old fence boundary while sweeping. Concatenating first would let the last + // pre-fence orphan absorb comment-only or bare-key user content appended after the fence. + const prefixOrphans = findOpencodexOrphans(prefix, null) + .filter(orphan => orphan.ownership === "explicit"); + const tailOrphans = findOpencodexOrphans(restOfFile, null) + .filter(orphan => orphan.ownership === "explicit"); + const removedAliases = new Set( + [...fullOrphans, ...prefixOrphans, ...tailOrphans] + .map(orphan => orphan.alias) + // Provider orphans carry no alias; their ranges above already removed the table. + .filter(alias => alias !== ""), + ); + // The backup must cover every removed TABLE, not just aliased rows: provider-only + // orphans carry no alias and would otherwise be swept without any backup. + orphanCount = new Set( + [...fullOrphans, ...prefixOrphans, ...tailOrphans] + .flatMap(orphan => orphanRanges([orphan])), + ).size; + const fullRanges = orphanRanges(fullOrphans); + const prefixRanges = [ + ...orphanRanges(prefixOrphans), + ...fullRanges.filter(range => range.end <= originalRegion.start), + ]; + const tailRanges = [ + ...orphanRanges(tailOrphans), + ...fullRanges + .filter(range => range.start >= removalEnd) + .map(range => ({ start: range.start - removalEnd, end: range.end - removalEnd })), + ]; + // Preserve the original fence as a structural boundary while cleaning references too. + // Joining first can re-parent a headerless tail under the last table in `prefix`. + stripped = removeAliasReferences( + removeTableRanges(prefix, prefixRanges), + removedAliases, + ) + removeAliasReferences( + removeTableRanges(restOfFile, tailRanges), + removedAliases, + false, + ); + } else { + // Retired or otherwise non-emitted OpenCodex tables may intentionally remain outside the + // fence while the integration is enabled. Teardown owns those strictly identified tables + // even after Grok has re-serialized the file and dropped our marker comments. + const orphans = findOpencodexOrphans(content, null) + .filter(orphan => orphan.ownership === "explicit"); + if (orphans.length === 0) { + return { ok: true, changed: false, message: "No opencodex managed block found in Grok config." }; + } + orphanCount = orphans.length; + stripped = removeOrphanTables(content, orphans); + stripped = removeAliasReferences( + stripped, + new Set(orphans.map(orphan => orphan.alias).filter(alias => alias !== "")), + ); } - orphanCount = orphans.length; - stripped = removeOrphanTables(content, orphans); - stripped = removeAliasReferences( - stripped, - new Set(orphans.map(orphan => orphan.alias).filter(alias => alias !== "")), - ); - } - if (orphanCount > 0) copyBackupOnce(configPath, join(grokHome, "config.toml.bak-opencodex")); - atomicWriteFile(configPath, applyEol(stripped, eol)); - - return { - ok: true, - changed: true, - message: originalRegion - ? "Removed the opencodex managed block from Grok config." - : "Removed stale opencodex-managed model entries from Grok config.", - }; + const destination = assertConfigWriteDestination(configPath, held); + if (orphanCount > 0) copyBackupOnce(destination, join(grokHome, "config.toml.bak-opencodex")); + publishConfigWrite(configPath, held, (target, hooks) => atomicWriteFile(target, applyEol(stripped, eol), undefined, hooks)); + + return { + ok: true, + changed: true, + message: originalRegion + ? "Removed the opencodex managed block from Grok config." + : "Removed stale opencodex-managed model entries from Grok config.", + }; + }); + if (!locked.ok) return grokConfigLockRefusal(locked); + return locked.value; } catch (error) { return errorResult("strip", error); } diff --git a/src/server/index/link-listener.ts b/src/server/index/link-listener.ts index 3e1bb9465ff..118a68f79e3 100644 --- a/src/server/index/link-listener.ts +++ b/src/server/index/link-listener.ts @@ -8,9 +8,18 @@ import { } from "../../link/store"; import { linkStorePath } from "../../link/paths"; import { linkRouteAllowed } from "../../link/routes"; +import { withConfigMutationLockSync } from "../../config/mutation-lock"; export const LINK_INGRESS_HOSTNAME = "opencodex-link.invalid"; +/** Internal signal: the store's port differs from the port this bind landed on. */ +class LinkListenerPortMismatchError extends Error { + constructor(storedPort: number, boundPort: number) { + super(`stored port ${storedPort} differs from bound port ${boundPort}`); + this.name = "LinkListenerPortMismatchError"; + } +} + export interface LinkListenerStartContext { dispatch: (req: Request, server: Server) => Promise; maxRequestBodySize: number; @@ -118,29 +127,33 @@ export function createLinkListenerLifecycle(deps: LinkListenerDeps = {}): Lin closeWithoutAwait(bound); return; } - if (store.listenerPort === null) { - const port = bound.port; - if (!port || port === 0) { - closeWithoutAwait(bound); - reportFailure("bind", new Error("Bun did not report a concrete listener port"), "bind"); - return; - } - try { + const port = bound.port; + if (!port || port === 0) { + closeWithoutAwait(bound); + reportFailure("bind", new Error("Bun did not report a concrete listener port"), "bind"); + return; + } + try { + // Revalidate the admission and persist a new port in one mutation section. + // Even a known-port bind can race the deletion of its last recorded link. + const needed = withConfigMutationLockSync(() => { const current = readStore(storePath); + if (current.links.length === 0) return false; if (current.listenerPort !== null && current.listenerPort !== port) { - // Another writer fixed a different port while this bind ran. Tunnels target the stored - // port, so serving on this one would strand them: give it up and let the next - // ensureStarted() bind the stored port. - closeWithoutAwait(bound); - reportFailure("listenerPort persistence", new Error(`stored port ${current.listenerPort} differs from bound port ${port}`), "persist"); - return; + throw new LinkListenerPortMismatchError(current.listenerPort, port); } - writeStore(storePath, { ...current, listenerPort: port }); - } catch (error) { + if (current.listenerPort === null) writeStore(storePath, { ...current, listenerPort: port }); + return true; + }); + if (!needed) { closeWithoutAwait(bound); - reportFailure("listenerPort persistence", error, "persist"); + setStatus("off", null, null); return; } + } catch (error) { + closeWithoutAwait(bound); + reportFailure("listenerPort persistence", error, "persist"); + return; } listener = bound as Server; relaySessions = sessions; diff --git a/src/server/management/link-routes.ts b/src/server/management/link-routes.ts index 5c1cf203c01..9d09b8e86f8 100644 --- a/src/server/management/link-routes.ts +++ b/src/server/management/link-routes.ts @@ -14,6 +14,7 @@ import { projectLinkStatus, type LinkStatusDto } from "../../link/status-project import { isLinkPort } from "../../link/ports"; import { joinHome, type ClientLinkJoinDeps } from "../../client/link-join"; import { clientLinkTunnelStatus } from "../../client/link-tunnel"; +import { withConfigMutationLockSync } from "../../config/mutation-lock"; import type { ManagementContext } from "./context"; import { readManagementJsonBodyOr } from "./body"; import { issueApiKeyInProcess, revokeApiKeyInProcess, type IssuedApiKey } from "./oauth-account-routes"; @@ -228,10 +229,12 @@ async function compensateNewLink(ctx: ManagementContext, state: LinkRouteState, if (!revoked) { try { await state.supervisor.stopLink(record.id); } catch { /* retain the record and failure marker */ } try { - const current = readStoreFor(ctx); - if (!current.links.some(link => link.id === record.id)) { - writeStoreFor(ctx, { ...current, links: [...current.links, record] }); - } + withConfigMutationLockSync(() => { + const current = readStoreFor(ctx); + if (!current.links.some(link => link.id === record.id)) { + writeStoreFor(ctx, { ...current, links: [...current.links, record] }); + } + }); } catch { // The in-memory marker still makes the residual visible when persistence is unavailable. } @@ -239,11 +242,16 @@ async function compensateNewLink(ctx: ManagementContext, state: LinkRouteState, } try { await state.supervisor.stopLink(record.id); } catch { return compensationFailure(ctx, state, record, "stop"); } try { - const current = readStoreFor(ctx); - const next = { ...current, links: current.links.filter(link => link.id !== record.id) }; - if (next.links.length !== current.links.length) { - writeStoreFor(ctx, next); - } + // Read→filter→write stays one section of the shared mutation lock: a sibling + // route's create must not land between the read and the rename and vanish. + const next = withConfigMutationLockSync(() => { + const current = readStoreFor(ctx); + const filtered = { ...current, links: current.links.filter(link => link.id !== record.id) }; + if (filtered.links.length !== current.links.length) { + writeStoreFor(ctx, filtered); + } + return filtered; + }); clearCompensationFailed(record.id, compensationPath()); state.compensationFailures?.delete(record.id); if (next.links.length === 0) await state.listener.close(); @@ -362,14 +370,20 @@ async function apply(ctx: ManagementContext, state: LinkRouteState): Promise link.alias === body.alias && link.direction === "hub-initiated")) { + // Duplicate-check and append under one mutation-lock section: two writers + // racing this check could otherwise both pass it and append, losing one link. + const writeOutcome = withConfigMutationLockSync((): "dup" | "written" => { + const current = readStoreFor(ctx); + if (current.links.some(link => link.alias === body.alias && link.direction === "hub-initiated")) return "dup"; + store = { ...current, links: [...current.links, record] }; + writeStoreFor(ctx, store); + return "written"; + }); + if (writeOutcome === "dup") { const compensation = await compensateNewLink(ctx, state, record); if (compensation) return compensation; return fail("link_exists", "A link for this alias already exists.", 409); } - store = { ...current, links: [...current.links, record] }; - writeStoreFor(ctx, store); await state.listener.ensureStarted(); if (state.listener.status().state !== "listening") { const compensation = await compensateNewLink(ctx, state, record); @@ -430,13 +444,18 @@ async function issue(ctx: ManagementContext): Promise { const record = { id, alias: body.alias, direction: "client-initiated" as const, hostKeyFingerprint: null, tunnelPort: body.tunnelPort, apiKeyId: issued.id, createdAt: new Date((ctx.deps.now ?? Date.now)()).toISOString() }; let failureCode = "link_issue_failed"; try { - const current = readStoreFor(ctx); - if (current.links.some(link => link.id === id)) throw new Error("link id collision"); - if (current.links.some(link => link.alias === body.alias && link.direction === "client-initiated")) { + // Same atomic duplicate-check+append as the hub-initiated branch. + const writeOutcome = withConfigMutationLockSync((): "dup" | "written" => { + const current = readStoreFor(ctx); + if (current.links.some(link => link.id === id)) throw new Error("link id collision"); + if (current.links.some(link => link.alias === body.alias && link.direction === "client-initiated")) return "dup"; + writeStoreFor(ctx, { ...current, links: [...current.links, record] }); + return "written"; + }); + if (writeOutcome === "dup") { const compensation = await compensateNewLink(ctx, state, record); return compensation ?? fail("link_exists", "A link for this alias already exists.", 409); } - writeStoreFor(ctx, { ...current, links: [...current.links, record] }); await state.listener.ensureStarted(); if (state.listener.status().state !== "listening") { failureCode = "listener_unavailable"; @@ -538,9 +557,12 @@ async function remove(ctx: ManagementContext, state: LinkRouteState, id: string) if (!revokeKeyIdempotent(ctx, record.apiKeyId)) return fail("key_revoke_failed", "The link key could not be revoked.", 502); let next: LinkStore; try { - const latest = readStoreFor(ctx); - next = { ...latest, links: latest.links.filter(link => link.id !== id) }; - if (next.links.length !== latest.links.length) writeStoreFor(ctx, next); + next = withConfigMutationLockSync(() => { + const latest = readStoreFor(ctx); + const filtered = { ...latest, links: latest.links.filter(link => link.id !== id) }; + if (filtered.links.length !== latest.links.length) writeStoreFor(ctx, filtered); + return filtered; + }); clearCompensationFailed(id, compensationPath()); } catch { return fail("link_remove_failed", "The link record could not be removed.", 503); } state.compensationFailures?.delete(id); diff --git a/structure/remote-link.md b/structure/remote-link.md index 181bda3364f..d812d65cde2 100644 --- a/structure/remote-link.md +++ b/structure/remote-link.md @@ -12,7 +12,7 @@ Every remote `ocx` call goes through `remoteOcxArgv`, which runs `sh -c` with a `src/link/routes.ts` holds the one route and method table for linked traffic; the hub-link listener and the client relay both decide admission from it. -`src/link/store.ts` persists link records in `/link/links.json` with private permissions. Records hold aliases, ports, confirmed host-key fingerprints and data-key ids, never keys. The file is a trust boundary: unknown fields, malformed values and duplicate ids are errors, and `hasLinks` reports false for a damaged file. A null host-key fingerprint is accepted only for a client-initiated link, because the hub never opens SSH to that client. +`src/link/store.ts` persists link records in `/link/links.json` with private permissions. Records hold aliases, ports, confirmed host-key fingerprints and data-key ids, never keys. The file is a trust boundary: unknown fields, malformed values and duplicate ids are errors, and `hasLinks` reports false for a damaged file. A null host-key fingerprint is accepted only for a client-initiated link, because the hub never opens SSH to that client. Link create/delete, compensation, and listener-port persistence re-read and mutate the store under `withConfigMutationLockSync`. A bind revalidates both the stored port and the presence of a recorded link before activation; deleting the last link during bind closes that listener without publishing a port. ## Client-initiated links diff --git a/structure/runtime.md b/structure/runtime.md index f87e4a5fc0d..1dffd973640 100644 --- a/structure/runtime.md +++ b/structure/runtime.md @@ -179,7 +179,7 @@ factory), `relay-eager.ts` (#314 gated eager bounded passthrough relay), `memory (warn-only RSS sampler), `management/system-routes.ts` (`/api/system/*`), and `auth-cors.ts` own server infrastructure (`src/lib/bun-stream-caps.ts` owns the Bun stream-capability gate); and static GUI, WebSocket bridge, port/liveness, decompression, and adapter-resolution helpers live in -their own files. +their own files. `src/grok/inject.ts` holds the shared canonical config-write lock across injection and cleanup. It validates the locked destination before backup and every publication, preserves refresh-only admission and no-follow checks, and distinguishes retryable contention from an unsafe namespace. A refresh-only destination change before rename preserves files and returns the existing refresh skip result. Native Grok and manual editors do not participate in this advisory lock. `src/server/management/link-routes.ts` and `src/server/index/link-listener.ts` put their link-store read/decide/write sections under the existing config mutation transaction; SSH and other asynchronous work stays outside it. Link-store coordination follows [Remote Link](remote-link.md). ## Lifecycle diff --git a/tests/fixtures/test-layout-expected.json b/tests/fixtures/test-layout-expected.json index da1e353c63f..41e0e0afcfa 100644 --- a/tests/fixtures/test-layout-expected.json +++ b/tests/fixtures/test-layout-expected.json @@ -128,7 +128,8 @@ "abort-idle-deadline.test.ts": "lib", "tool-envelope-echo-whole-line.test.ts": "adapters", "abort-race.test.ts": "adapters", "account-import.test.ts": "server", "account-pool-management-api.test.ts": "server", "link-listener-admission.test.ts": "server", - "link-listener-lifecycle.test.ts": "server", "link-join-route.test.ts": "server", + "link-listener-lifecycle.test.ts": "server", + "link-listener-mutation.test.ts": "server", "link-join-route.test.ts": "server", "core-link-boundary.test.ts": "lab", "acl-error-classification.test.ts": "lib", "active-registry-admission.test.ts": "codex-integration", "adapter-buffered-tool-conformance.test.ts": "adapters", "adapter-error-inline.test.ts": "adapters", "adapter-event-oauth-failover.test.ts": "oauth", @@ -626,6 +627,7 @@ "google-wire-compiler.test.ts": "adapters/google", "google-wire-shape.test.ts": "adapters/google", "gpt6-native-rows.test.ts": "codex-integration", "gpt61-sol-rows.test.ts": "codex-integration", "grok-attribution.test.ts": "providers/xai", "grok-config-inject.test.ts": "providers/xai", + "grok-config-write-lock.test.ts": "providers/xai", "grok-effort-inject.test.ts": "providers/xai", "grok-lifecycle.test.ts": "providers/xai", "grok-management-api.test.ts": "providers/xai", "grok-models-effort-list.test.ts": "providers/xai", "grok-orphan-adoption.test.ts": "providers/xai", "grok-reset-coupon-cli.test.ts": "providers/xai", diff --git a/tests/providers/xai/grok-config-write-lock.test.ts b/tests/providers/xai/grok-config-write-lock.test.ts new file mode 100644 index 00000000000..cca0917653e --- /dev/null +++ b/tests/providers/xai/grok-config-write-lock.test.ts @@ -0,0 +1,65 @@ +import { afterEach, beforeEach, expect, spyOn, test } from "bun:test"; +import * as fs from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { withConfigWriteLock, configWriteLockPath } from "../../../src/codex/config-write-lock"; +import { buildGrokManagedBlock, injectGrokConfig, stripGrokConfig } from "../../../src/grok/inject"; +import { removeTreeWithRetry } from "../../helpers/remove-tree"; + +let home: string; +const models = [{ id: "fixture-model" }]; +beforeEach(() => { home = fs.mkdtempSync(join(tmpdir(), "ocx-grok-write-lock-")); }); +afterEach(() => { removeTreeWithRetry(home); }); + +test("injection and cleanup refuse a held lock without touching config or backup", () => { + const path = join(home, "config.toml"); + const bytes = buildGrokManagedBlock(10100, models) + "\n"; + fs.writeFileSync(path, bytes); + const result = withConfigWriteLock(path, () => { + expect(injectGrokConfig(10101, models, { grokHome: home })).toMatchObject({ ok: false, changed: false, skippedReason: "locked", retryable: true }); + expect(stripGrokConfig({ grokHome: home })).toMatchObject({ ok: false, changed: false, skippedReason: "locked", retryable: true }); + expect(fs.readFileSync(path, "utf8")).toBe(bytes); + expect(fs.existsSync(join(home, "config.toml.bak-opencodex"))).toBe(false); + }); + expect(result.ok).toBe(true); +}); + +test("unsafe lock namespaces are distinct from retryable contention", () => { + const path = join(home, "config.toml"); + fs.writeFileSync(path, "theme = \"light\"\n"); + fs.mkdirSync(configWriteLockPath(path)); + expect(injectGrokConfig(10100, models, { grokHome: home })).toMatchObject({ ok: false, changed: false, skippedReason: "unsafe", retryable: false }); + expect(stripGrokConfig({ grokHome: home })).toMatchObject({ ok: false, changed: false, skippedReason: "unsafe", retryable: false }); + expect(fs.readFileSync(path, "utf8")).toBe("theme = \"light\"\n"); +}); + +for (const action of ["inject", "strip"] as const) { + test(`${action} refuses an alias retarget after reading the locked destination`, () => { + const path = join(home, "config.toml"); + const first = join(home, "first.toml"); + const second = join(home, "second.toml"); + const firstBytes = `theme = "first"\n${buildGrokManagedBlock(10100, models)}\n`; + const secondBytes = 'theme = "second"\n'; + fs.writeFileSync(first, firstBytes); + fs.writeFileSync(second, secondBytes); + fs.symlinkSync(first, path); + const read = fs.readFileSync; + let retargeted = false; + const spy = spyOn(fs, "readFileSync").mockImplementation(((file: unknown, ...args: unknown[]) => { + const value = (read as Function)(file, ...args); + if (String(file) === path && !retargeted) { + retargeted = true; + fs.unlinkSync(path); + fs.symlinkSync(second, path); + } + return value; + }) as typeof fs.readFileSync); + try { + const result = action === "inject" ? injectGrokConfig(10101, models, { grokHome: home }) : stripGrokConfig({ grokHome: home }); + expect(retargeted).toBe(true); + expect(result).toMatchObject({ ok: false, changed: false }); + expect(fs.readFileSync(first, "utf8")).toBe(firstBytes); + expect(fs.readFileSync(second, "utf8")).toBe(secondBytes); + } finally { spy.mockRestore(); } + }); +} diff --git a/tests/server/link-listener-mutation.test.ts b/tests/server/link-listener-mutation.test.ts new file mode 100644 index 00000000000..d07496dbaca --- /dev/null +++ b/tests/server/link-listener-mutation.test.ts @@ -0,0 +1,47 @@ +import { afterEach, expect, test } from "bun:test"; +import type { Server } from "bun"; +import { createLinkListenerLifecycle } from "../../src/server/index/link-listener"; +import type { LinkStore } from "../../src/link/store"; + +const link = { id: "lnk_0123456789abcdef", alias: "fixture-link", direction: "client-initiated" as const, + hostKeyFingerprint: null, tunnelPort: 2222, apiKeyId: "fixture-key", createdAt: "2026-10-01T00:00:00Z" }; +const lifecycles: ReturnType[] = []; +afterEach(async () => { await Promise.all(lifecycles.splice(0).map(lifecycle => lifecycle.close())); }); + +test("listener persistence preserves a link appended during bind", async () => { + let current: LinkStore = { version: 1, listenerPort: null, links: [link] }; + const lifecycle = createLinkListenerLifecycle({ + storePath: "fixture-links.json", readStore: () => current, writeStore: (_path, next) => { current = next; }, warn: () => {}, + serve: () => { + current = { ...current, links: [...current.links, { ...link, id: "lnk_fedcba9876543210", alias: "concurrent-link" }] }; + return { port: 12345, stop: async () => {} } as unknown as Server; + }, + }); + lifecycles.push(lifecycle); + lifecycle.start({ maxRequestBodySize: 1024, dispatch: async () => new Response("fixture") }); + await lifecycle.ensureStarted(); + expect(current.links.map(row => row.alias)).toEqual(["fixture-link", "concurrent-link"]); + expect(current.listenerPort).toBe(12345); + expect(lifecycle.status().state).toBe("listening"); +}); + +for (const listenerPort of [null, 12345]) test(`listener abandons a ${listenerPort ?? "new"}-port bind when the last link disappears`, async () => { + let current: LinkStore = { version: 1, listenerPort: null, links: [link] }; + current.listenerPort = listenerPort; + let writes = 0; + let closed = 0; + const lifecycle = createLinkListenerLifecycle({ + storePath: "fixture-links.json", readStore: () => current, writeStore: (_path, next) => { writes++; current = next; }, warn: () => {}, + serve: () => { + current = { ...current, links: [] }; + return { port: 12345, stop: async () => { closed++; } } as unknown as Server; + }, + }); + lifecycles.push(lifecycle); + lifecycle.start({ maxRequestBodySize: 1024, dispatch: async () => new Response("fixture") }); + await lifecycle.ensureStarted(); + expect(lifecycle.status()).toEqual({ state: "off", port: null, reason: null }); + expect(current).toEqual({ version: 1, listenerPort, links: [] }); + expect(writes).toBe(0); + expect(closed).toBe(1); +}); diff --git a/tests/server/link-management-routes.test.ts b/tests/server/link-management-routes.test.ts index 512f1ed2771..8ddd98f18be 100644 --- a/tests/server/link-management-routes.test.ts +++ b/tests/server/link-management-routes.test.ts @@ -648,3 +648,55 @@ describe("link management routes", () => { expect(h.events.indexOf("reload")).toBeLessThan(h.events.findIndex(event => event === "connect")); }); }); + +/** + * The link store's read-modify-write runs under the shared config mutation lock: + * while another process holds it the DELETE must fail fast and keep the record. + */ +test("remove refuses while a cross-process holder owns the config mutation lock", async () => { + temp = mkdtempSync(join(tmpdir(), "ocx-link-lock-")); + const previousHome = process.env.OPENCODEX_HOME; + process.env.OPENCODEX_HOME = temp; + const { pathToFileURL } = await import("node:url"); + const { repoPath, repoRoot } = await import("../helpers/repo-root"); + const { watchdogMs } = await import("../helpers/ci-watchdog"); + const readyPath = join(temp, "holder-ready"); + const releasePath = join(temp, "holder-release"); + const configModuleUrl = pathToFileURL(repoPath("src/config.ts")).href; + const childSource = ` + import { existsSync, writeFileSync } from "node:fs"; + import { withConfigMutationLockSync } from ${JSON.stringify(configModuleUrl)}; + withConfigMutationLockSync(() => { + writeFileSync(${JSON.stringify(readyPath)}, "ready"); + while (!existsSync(${JSON.stringify(releasePath)})) Bun.sleepSync(10); + }); + `; + const child = Bun.spawn([process.execPath, "-e", childSource], { + cwd: repoRoot(), + env: { ...process.env, OPENCODEX_HOME: temp }, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }); + try { + const deadline = performance.now() + watchdogMs(5_000); + while (!existsSync(readyPath) && performance.now() < deadline) await Bun.sleep(10); + expect(existsSync(readyPath)).toBe(true); + const h = harness(); + const existing = { id: "lnk_0123456789abcdef", alias: "home", direction: "hub-initiated" as const, hostKeyFingerprint: "SHA256:abcdefghijklmnop", tunnelPort: 2200, apiKeyId: "key-1", createdAt: "2026-09-25T00:00:00.000Z" }; + h.deps.writeLinkStore!({ ...h.store, links: [existing] }); + const runner: SshRunner = { + async run() { return { code: 0, stdout: "", stderr: "" }; }, + spawnTunnel: () => ({ pid: 1, argv: [], exited: Promise.resolve(0), kill() {} }), + }; + const response = await call("/api/link/lnk_0123456789abcdef", "DELETE", {}, { ...h.deps, sshRunner: runner }, "admin-token", true, null, true, h.config); + expect(response?.status).toBe(503); + expect(await response!.json()).toMatchObject({ error: { code: "link_remove_failed" } }); + expect(h.store.links).toHaveLength(1); + } finally { + writeFileSync(releasePath, "release"); + await child.exited.catch(() => {}); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + } +}); From 422257795e53f19d30de7375cbc6a2d22510ac3e Mon Sep 17 00:00:00 2001 From: Hyukjin LIM <67728205+lhj6102@users.noreply.github.com> Date: Sat, 10 Oct 2026 19:01:44 +0900 Subject: [PATCH 04/25] fix(claude): fill the unset Sonnet tier with claude-sonnet-5-5 (#6874) Claude Code 2.1.294+ resolves the `sonnet` alias to claude-sonnet-5-5, but the native tier table still pinned an unset Sonnet slot to claude-sonnet-5, so subscription launches through `ocx claude` hid Sonnet 5.5 from the picker. Refs #6873 --- .../src/content/docs/fr/guides/claude-code.md | 2 +- docs-site/src/content/docs/guides/claude-code.md | 2 +- .../src/content/docs/ja/guides/claude-code.md | 2 +- .../src/content/docs/ko/guides/claude-code.md | 2 +- .../src/content/docs/ru/guides/claude-code.md | 2 +- .../src/content/docs/tr/guides/claude-code.md | 2 +- .../src/content/docs/zh-cn/guides/claude-code.md | 2 +- .../src/content/docs/zh-tw/guides/claude-code.md | 2 +- src/claude/context-windows.ts | 6 +++--- .../claude-context-windows.test.ts | 14 +++++++------- .../claude-management-api.test.ts | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs-site/src/content/docs/fr/guides/claude-code.md b/docs-site/src/content/docs/fr/guides/claude-code.md index 98a4f98e41d..f3a9d5220fe 100644 --- a/docs-site/src/content/docs/fr/guides/claude-code.md +++ b/docs-site/src/content/docs/fr/guides/claude-code.md @@ -61,7 +61,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | Seuil de compactage du contexte automatique (par défaut `829800`) ; injecté uniquement lorsque le contexte automatique est activé | | `ANTHROPIC_MODEL` | `claudeCode.model` (facultatif) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (facultatif ; ancien `ANTHROPIC_SMALL_FAST_MODEL` également) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` ; lors d'un lancement par abonnement, si non défini, `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]` natif | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` ; lors d'un lancement par abonnement, si non défini, `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]` natif | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `1` lorsque `alwaysEnableEffort` est activé (conditionnel) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch` lorsqu'il est défini (conditionnel ; désactivé par défaut) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | Remplacement du contexte hérité lorsque `maxContextTokens` est défini (conditionnel) | diff --git a/docs-site/src/content/docs/guides/claude-code.md b/docs-site/src/content/docs/guides/claude-code.md index 1cc6b683441..86b1bacb5d5 100644 --- a/docs-site/src/content/docs/guides/claude-code.md +++ b/docs-site/src/content/docs/guides/claude-code.md @@ -144,7 +144,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | Auto-context compaction threshold (default `829800`); only injected when auto-context is enabled | | `ANTHROPIC_MODEL` | `claudeCode.model` (optional) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (optional; legacy `ANTHROPIC_SMALL_FAST_MODEL` too) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`; on a subscription launch an unset slot gets the native `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`, so `--model opus`, `sonnet` and `fable` keep their 1M context | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`; on a subscription launch an unset slot gets the native `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`, so `--model opus`, `sonnet` and `fable` keep their 1M context | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `1` when `alwaysEnableEffort` is on (conditional) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch` when set (conditional; off by default — see [MCP tool schemas fill the context](#troubleshooting)) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | Legacy context override when `maxContextTokens` is set (conditional) | diff --git a/docs-site/src/content/docs/ja/guides/claude-code.md b/docs-site/src/content/docs/ja/guides/claude-code.md index 793367e24c5..e755758e452 100644 --- a/docs-site/src/content/docs/ja/guides/claude-code.md +++ b/docs-site/src/content/docs/ja/guides/claude-code.md @@ -30,7 +30,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | 自動コンテキスト圧縮のしきい値(デフォルト `829800`)。自動コンテキストがオンのときのみ注入します | | `ANTHROPIC_MODEL` | `claudeCode.model` (任意) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (任意、従来の `ANTHROPIC_SMALL_FAST_MODEL` もサポート) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(サブスクリプション起動で未設定の場合はネイティブの `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`) | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(サブスクリプション起動で未設定の場合はネイティブの `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`) | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `alwaysEnableEffort` がオンなら `1` (条件付き) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch` が設定されている場合 (条件付き、既定はオフ) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | `maxContextTokens` が設定された場合の従来コンテキスト上書き値 (条件付き) | diff --git a/docs-site/src/content/docs/ko/guides/claude-code.md b/docs-site/src/content/docs/ko/guides/claude-code.md index 677bf26cbe1..0bde291bc38 100644 --- a/docs-site/src/content/docs/ko/guides/claude-code.md +++ b/docs-site/src/content/docs/ko/guides/claude-code.md @@ -30,7 +30,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | 자동 컨텍스트 압축 임곗값(기본값 `829800`). 자동 컨텍스트가 켜져 있을 때만 주입해요 | | `ANTHROPIC_MODEL` | `claudeCode.model` (선택 사항) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (선택 사항, 기존 `ANTHROPIC_SMALL_FAST_MODEL`도 지원) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` (구독으로 실행할 때 설정하지 않으면 네이티브 `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`) | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` (구독으로 실행할 때 설정하지 않으면 네이티브 `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`) | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `alwaysEnableEffort`가 켜져 있으면 `1` (조건부) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch`가 설정된 경우 (조건부, 기본값은 꺼짐) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | `maxContextTokens`가 설정된 경우 기존 컨텍스트 재정의 값 (조건부) | diff --git a/docs-site/src/content/docs/ru/guides/claude-code.md b/docs-site/src/content/docs/ru/guides/claude-code.md index 6eaee530207..fc663709e87 100644 --- a/docs-site/src/content/docs/ru/guides/claude-code.md +++ b/docs-site/src/content/docs/ru/guides/claude-code.md @@ -32,7 +32,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | Порог автосжатия контекста (по умолчанию `829800`); внедряется только при включённом автоконтексте | | `ANTHROPIC_MODEL` | `claudeCode.model` (необязательно) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (необязательно; поддерживается и устаревшая `ANTHROPIC_SMALL_FAST_MODEL`) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` (при запуске по подписке, если не задано: нативные `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`) | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*` (при запуске по подписке, если не задано: нативные `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`) | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `1`, когда включён `alwaysEnableEffort` (условно) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch`, когда задан (условно; по умолчанию выключено) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | Устаревшее переопределение контекста, когда задан `maxContextTokens` (условно) | diff --git a/docs-site/src/content/docs/tr/guides/claude-code.md b/docs-site/src/content/docs/tr/guides/claude-code.md index 1a99421d774..8f1942959eb 100644 --- a/docs-site/src/content/docs/tr/guides/claude-code.md +++ b/docs-site/src/content/docs/tr/guides/claude-code.md @@ -68,7 +68,7 @@ bağlanmış olarak Claude Code'u başlatır: | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | Otomatik bağlam sıkıştırma eşiği (varsayılan `829800`); yalnızca otomatik bağlam etkinleştirildiğinde enjekte edilir | | `ANTHROPIC_MODEL` | `claudeCode.model` (isteğe bağlı) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel` (isteğe bağlı; eski `ANTHROPIC_SMALL_FAST_MODEL` da geçerlidir) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`; abonelikle başlatmada ayarlanmamışsa yerel `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]` | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`; abonelikle başlatmada ayarlanmamışsa yerel `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]` | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | `alwaysEnableEffort` açık olduğunda `1` (koşullu) | | `ENABLE_TOOL_SEARCH` | `claudeCode.toolSearch` ayarlandığında (koşullu; varsayılan olarak kapalı) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | `maxContextTokens` ayarlandığında eski bağlam geçersiz kılma (koşullu) | diff --git a/docs-site/src/content/docs/zh-cn/guides/claude-code.md b/docs-site/src/content/docs/zh-cn/guides/claude-code.md index c5676ce26bb..79a3af88efd 100644 --- a/docs-site/src/content/docs/zh-cn/guides/claude-code.md +++ b/docs-site/src/content/docs/zh-cn/guides/claude-code.md @@ -30,7 +30,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | 自动上下文压缩阈值(默认 `829800`);仅在启用自动上下文时注入 | | `ANTHROPIC_MODEL` | `claudeCode.model`(可选) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel`(可选,也包括旧版 `ANTHROPIC_SMALL_FAST_MODEL`) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(以订阅方式启动且未设置时为原生 `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`) | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(以订阅方式启动且未设置时为原生 `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`) | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | 启用 `alwaysEnableEffort` 时设为 `1`(条件注入) | | `ENABLE_TOOL_SEARCH` | 设置了 `claudeCode.toolSearch` 时注入(条件注入,默认关闭) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | 设置 `maxContextTokens` 时使用的旧版上下文覆盖项(条件注入) | diff --git a/docs-site/src/content/docs/zh-tw/guides/claude-code.md b/docs-site/src/content/docs/zh-tw/guides/claude-code.md index c3f05c79778..f01884006f4 100644 --- a/docs-site/src/content/docs/zh-tw/guides/claude-code.md +++ b/docs-site/src/content/docs/zh-tw/guides/claude-code.md @@ -54,7 +54,7 @@ ocx claude | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | 自動上下文壓縮閾值(預設 `829800`);僅在啟用自動上下文時注入 | | `ANTHROPIC_MODEL` | `claudeCode.model`(可選) | | `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `claudeCode.tierModels.haiku ?? claudeCode.smallFastModel`(可選,也包括舊版 `ANTHROPIC_SMALL_FAST_MODEL`) | -| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(以訂閱方式啟動且未設定時為原生 `claude-opus-5-5[1m]` / `claude-sonnet-5[1m]` / `claude-fable-5-1[1m]`) | +| `ANTHROPIC_DEFAULT_{OPUS,SONNET,FABLE}_MODEL` | `claudeCode.tierModels.*`(以訂閱方式啟動且未設定時為原生 `claude-opus-5-5[1m]` / `claude-sonnet-5-5[1m]` / `claude-fable-5-1[1m]`) | | `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` | 啟用 `alwaysEnableEffort` 時設為 `1`(條件注入) | | `ENABLE_TOOL_SEARCH` | 設定 `claudeCode.toolSearch` 時注入(條件注入,預設關閉) | | `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | 設定 `maxContextTokens` 時使用的舊版上下文覆蓋項(條件注入) | diff --git a/src/claude/context-windows.ts b/src/claude/context-windows.ts index 75428abc06e..06ba2d5a077 100644 --- a/src/claude/context-windows.ts +++ b/src/claude/context-windows.ts @@ -20,13 +20,13 @@ import { AUTO_COMPACT_WINDOW_DEFAULT, AUTO_CONTEXT_FLOOR, ONE_MILLION } from "./ export { AUTO_COMPACT_WINDOW_DEFAULT, AUTO_CONTEXT_FLOOR } from "./long-context"; /** - * The native id each Claude Code tier alias resolves to (2.1.282: `--model opus` sends - * `claude-opus-5-5`, `sonnet` sends `claude-sonnet-5`, `fable` sends `claude-fable-5-1`). + * The native id each Claude Code tier alias resolves to (2.1.296: `--model opus` sends + * `claude-opus-5-5`, `sonnet` sends `claude-sonnet-5-5`, `fable` sends `claude-fable-5-1`). * Behind a gateway Claude Code accounts an unmarked id at 200k, so an unset tier slot is filled * with this id when the map marks it (#5755). A marked alias cannot stand in: Claude Code sends * `sonnet[1m]` upstream unresolved. Haiku has no entry; its 200k window never marks. */ -const CLAUDE_CODE_NATIVE_TIERS = { opus: "claude-opus-5-5", sonnet: "claude-sonnet-5", fable: "claude-fable-5-1" } as const; +const CLAUDE_CODE_NATIVE_TIERS = { opus: "claude-opus-5-5", sonnet: "claude-sonnet-5-5", fable: "claude-fable-5-1" } as const; /** Binary-verified accepted range for CLAUDE_CODE_AUTO_COMPACT_WINDOW (2.1.207: pSo=1e5, yDs=1e6). */ export const AUTO_COMPACT_WINDOW_MIN = 100_000; diff --git a/tests/claude-integration/claude-context-windows.test.ts b/tests/claude-integration/claude-context-windows.test.ts index 41d08cb09aa..00337fff9d5 100644 --- a/tests/claude-integration/claude-context-windows.test.ts +++ b/tests/claude-integration/claude-context-windows.test.ts @@ -218,18 +218,18 @@ describe("native Claude tiers on the passthrough (#5755)", () => { test("an empty config marks the Opus, Sonnet and Fable tiers and leaves Haiku unset", () => { expect(effectiveModelEnv(undefined, buildClaudeContextWindows([], [], undefined, passthrough))).toEqual({ ANTHROPIC_DEFAULT_OPUS_MODEL: "claude-opus-5-5[1m]", - ANTHROPIC_DEFAULT_SONNET_MODEL: "claude-sonnet-5[1m]", + ANTHROPIC_DEFAULT_SONNET_MODEL: "claude-sonnet-5-5[1m]", ANTHROPIC_DEFAULT_FABLE_MODEL: "claude-fable-5-1[1m]", }); }); test("another provider's row for the same id only counts when the router decides", () => { - const kiro = [{ provider: "kiro", id: "claude-sonnet-5", contextWindow: 200_000 }]; + const kiro = [{ provider: "kiro", id: "claude-sonnet-5-5", contextWindow: 200_000 }]; const native = buildClaudeContextWindows([], kiro, undefined, passthrough); - expect(native["claude-sonnet-5"]).toBe(1_000_000); - expect(effectiveModelEnv(undefined, native).ANTHROPIC_DEFAULT_SONNET_MODEL).toBe("claude-sonnet-5[1m]"); + expect(native["claude-sonnet-5-5"]).toBe(1_000_000); + expect(effectiveModelEnv(undefined, native).ANTHROPIC_DEFAULT_SONNET_MODEL).toBe("claude-sonnet-5-5[1m]"); const routed = buildClaudeContextWindows([], kiro); - expect(routed["claude-sonnet-5"]).toBe(200_000); + expect(routed["claude-sonnet-5-5"]).toBe(200_000); expect(effectiveModelEnv(undefined, routed)).toEqual({}); }); @@ -246,9 +246,9 @@ describe("native Claude tiers on the passthrough (#5755)", () => { }); test("an anthropic row capped under 1M and a modelMap entry keep their ids unmarked", () => { - const capped = buildClaudeContextWindows([], [{ provider: "anthropic", id: "claude-sonnet-5", contextWindow: 200_000 }], undefined, passthrough); + const capped = buildClaudeContextWindows([], [{ provider: "anthropic", id: "claude-sonnet-5-5", contextWindow: 200_000 }], undefined, passthrough); expect(effectiveModelEnv(undefined, capped).ANTHROPIC_DEFAULT_SONNET_MODEL).toBeUndefined(); - const mapped = buildClaudeContextWindows([], [], undefined, { modelMap: { "claude-sonnet-5": "kiro/claude-sonnet-5" } }); + const mapped = buildClaudeContextWindows([], [], undefined, { modelMap: { "claude-sonnet-5-5": "kiro/claude-sonnet-5-5" } }); expect(effectiveModelEnv(undefined, mapped).ANTHROPIC_DEFAULT_SONNET_MODEL).toBeUndefined(); expect(effectiveModelEnv(undefined, mapped).ANTHROPIC_DEFAULT_OPUS_MODEL).toBe("claude-opus-5-5[1m]"); }); diff --git a/tests/claude-integration/claude-management-api.test.ts b/tests/claude-integration/claude-management-api.test.ts index 23c0794dbc3..7ad26e618b4 100644 --- a/tests/claude-integration/claude-management-api.test.ts +++ b/tests/claude-integration/claude-management-api.test.ts @@ -603,7 +603,7 @@ test("PUT round-trips three-state authMode (devlog 260720 + 260726_claude_auth_a get = await fetch(new URL("/api/claude-code", server.url)).then(r => r.json()) as Record; expect(get.authMode).toBe("subscription"); // Under Claude Code's own login it passes through natively and keeps its 1M window. - expect(sonnetTier(get)).toBe("claude-sonnet-5[1m]"); + expect(sonnetTier(get)).toBe("claude-sonnet-5-5[1m]"); // "auto" is the return path: it deletes the key so detection drives the mode again. const auto = await fetch(new URL("/api/claude-code", server.url), { From fca9cbf4f0bc315a32b6127a2e9719389e7a891f Mon Sep 17 00:00:00 2001 From: MarcTCruz <58499846+MarcTCruz@users.noreply.github.com> Date: Sat, 10 Oct 2026 07:01:50 -0300 Subject: [PATCH 05/25] fix(codex): never discard a rotated native-main refresh token on cancel (#6859) * fix(codex): never discard a rotated native-main refresh token on cancel A successful refresh_token exchange retires the token it sent. Two paths in resolveMainAccountToken still lost the replacement when the caller went away: - the caller's signal was passed into the exchange, so a disconnect after the POST was sent aborted the request or its body read; - after the exchange resolved, a caller-abort check threw before persistRefreshedMainAuthJson ran (added in #5268). Either way auth.json kept the retired token and the account needed a manual re-login. Caller cancellation now stops only the waits before the exchange. The exchange observes the refresh's own 30-second timeout, the result is published through the unchanged snapshot/identity guards, and the caller's abort reason is thrown after the commit. An external writer that replaced auth.json during the exchange still wins. The claim and refresh-lock helpers await the callback through completion, so a cancelled wait cannot release an acquired lock mid-exchange. Co-Authored-By: Claude Opus 5.5 * test(codex): assert the persisted account identity after cancelled refresh publication --------- Co-authored-by: Claude Opus 5.5 Co-authored-by: JUN --- .../src/content/docs/guides/providers.md | 6 ++ src/codex/main-account.ts | 13 ++-- structure/codex-home.md | 6 +- structure/providers/openai-accounts.md | 16 ++++ .../codex-main-account-refresh.test.ts | 74 ++++++++++++++++--- ...ponses-alternate-main-cancellation.test.ts | 21 ++++-- 6 files changed, 111 insertions(+), 25 deletions(-) diff --git a/docs-site/src/content/docs/guides/providers.md b/docs-site/src/content/docs/guides/providers.md index effa0402d31..29c33a71c60 100644 --- a/docs-site/src/content/docs/guides/providers.md +++ b/docs-site/src/content/docs/guides/providers.md @@ -381,6 +381,12 @@ from provider enforcement, rate limits, or account actions. Terminal refresh failures mark the account as needing reauthentication instead of retrying forever. +For the native main Codex credential in `CODEX_HOME/auth.json`, cancelling a request stops a +waiting refresh before the token exchange starts. An exchange already started finishes within +its own 30-second timeout and saves successful access and refresh tokens before reporting the +request's cancellation. This preserves the rotated refresh token for later requests; a concurrent +external credential replacement still takes precedence. + **Cooldowns (Codex pool).** Upstream `429` / quota responses set a hard cooldown from `Retry-After`, quota `reset` headers (capped), or a short default backoff. Accounts on an explicit `Retry-After` cooldown are not probed early; reset-derived cooldowns may receive a paced probe lease diff --git a/src/codex/main-account.ts b/src/codex/main-account.ts index 107b486522d..2fa128737ae 100644 --- a/src/codex/main-account.ts +++ b/src/codex/main-account.ts @@ -510,8 +510,9 @@ async function resolveMainAccountToken( } const refresh = dependencies.refreshToken ?? refreshNativeMainGrant; let refreshed: OAuthCredentials; + if (signal.aborted) throw signal.reason; try { - refreshed = await refresh(locked.refreshToken, { signal }); + refreshed = await refresh(locked.refreshToken, { signal: refreshTimeout }); } catch (cause) { // A refusal already classified at the endpoint keeps that verdict. An injected refresh // threw an ordinary Error and has only its message, so prose still decides there -- @@ -535,16 +536,14 @@ async function resolveMainAccountToken( } throw new MainAccountTokenRefreshError(reason, { cause }); } - // The refresh may resolve after the caller went away (an implementation that does - // not observe the signal, or an abort landing in the window between resolution and - // commit). A cancelled request's late refresh must not rewrite auth.json on behalf - // of a request that no longer exists -- the same fence the reauth twin applies - // before its own commit above. - if (dependencies.signal?.aborted) throw dependencies.signal.reason; + // Once the exchange starts, only its own timeout may abort it: a successful + // rotating grant retires the old refresh token. Save the only live grant before + // honoring caller cancellation, while retaining the external-writer guards. const result = persistRefreshedMainAuthJson(locked, refreshed); // A permitted in-flight success speaks only for its own profile and grant. clearMainRefreshGrantRejection(mainRefreshGrantKey(locked)!); if (dependencies.preserveReauth !== true) clearAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); + if (dependencies.signal?.aborted) throw dependencies.signal.reason; return result; }), { waitMs: 30_000, signal }, diff --git a/structure/codex-home.md b/structure/codex-home.md index 19d95ea24da..66c7c5cebbc 100644 --- a/structure/codex-home.md +++ b/structure/codex-home.md @@ -227,9 +227,9 @@ reopened. `ocx status` reports the same drift, also while the loop is gated off, It says nothing in a sibling's home, whose routing names the owner beside it, and it promises only `ocx sync`, because it cannot see whether a healer runs, is gated, or is paused. -The native main slot also accepts one same-identity device reauth (#3898): -`/api/codex-auth/main/reauth-device` (start/status/cancel) plus -`ocx account main reauth`. The grant is the OpenAI deviceauth grant already +Native-main refresh follows the [rotation contract](providers/openai-accounts.md#native-main-refresh-cancellation). +Same-identity device reauth (#3898) instead obtains a new login grant through +`/api/codex-auth/main/reauth-device` (start/status/cancel) plus `ocx account main reauth`. It uses the OpenAI deviceauth grant already used for pool accounts, but nothing routes through the pool login surface — `/api/codex-auth/login` keeps rejecting `__main__` — and the commit is a sibling of the refresh write: same-identity check against the snapshot diff --git a/structure/providers/openai-accounts.md b/structure/providers/openai-accounts.md index 05ca348b47a..ecb69bfe6e7 100644 --- a/structure/providers/openai-accounts.md +++ b/structure/providers/openai-accounts.md @@ -280,6 +280,22 @@ API-key and custom forward destinations preserve their metadata. See [Responses Listener startup diagnostics follow [the runtime lifecycle contract](../runtime.md#lifecycle); malformed optional listener blocks follow [config loading](../config.md#config-surface). +## Native-main refresh cancellation + +`src/codex/main-account.ts` takes the CODEX_HOME exclusive claim, then the +per-grant refresh file lock. Caller cancellation can stop either wait and is +checked before the token exchange starts. Once started, the exchange observes +only the refresh's own 30-second timeout: success rotates and retires the old +refresh token, so cancellation cannot discard the only live grant. Both locks +await the callback through completion, including publication; aborting their +wait signal does not release an acquired lock while the exchange runs. +Successful refresh publishes access and refresh tokens and advances the +credential mutation epoch before clearing grant rejection and applicable +reauth quarantine, then throws the caller's abort reason if cancelled. +Snapshot and identity checks still refuse an external auth writer, including +when the caller also cancelled. Same-identity device reauth obtains a new login +grant rather than rotating the existing grant and keeps its pre-publication fence. + ## Manual account pause and resume Manual pause/resume in `src/codex/auth-api/account-pause-group.ts` resolves existing native-main diff --git a/tests/codex-integration/codex-main-account-refresh.test.ts b/tests/codex-integration/codex-main-account-refresh.test.ts index 9541891ba58..4f0f35332c6 100644 --- a/tests/codex-integration/codex-main-account-refresh.test.ts +++ b/tests/codex-integration/codex-main-account-refresh.test.ts @@ -329,27 +329,81 @@ describe("publication never overwrites an external Codex writer (#2999)", () => expect(readFileSync(authPath, "utf8")).toContain("ocx-staged-access"); }); - test("a caller cancelled during the refresh does not commit the late result", async () => { - // The refresh seam resolves after the caller aborted (a client that disconnected - // mid-/v1/models). The late result must never reach auth.json on behalf of a - // request that no longer exists: the publication is fenced before the rename, - // the file keeps its prior bytes, and the credential mutation epoch does not - // advance for a commit that never happened. + test("a caller cancelled during the refresh commits the rotated grant before rejecting", async () => { + // A successful exchange retires the old refresh token. Even after a client + // disconnect, publication must save the only live grant before reporting cancellation. const authPath = join(home, "auth.json"); seedExpired(authPath); - const before = readFileSync(authPath, "utf8"); const controller = new AbortController(); + const abortReason = new Error("client disconnected"); const epochBefore = codexCredentialMutationEpoch(); await expect(getValidMainAccountToken({ signal: controller.signal, refreshToken: async () => { - controller.abort(new Error("client disconnected")); + controller.abort(abortReason); return refreshOk(); }, - })).rejects.toThrow("client disconnected"); + })).rejects.toBe(abortReason); - expect(readFileSync(authPath, "utf8")).toBe(before); + expect(JSON.parse(readFileSync(authPath, "utf8")).tokens).toMatchObject({ + access_token: "ocx-staged-access", + refresh_token: "ocx-staged-refresh", + account_id: "account-main", + }); + expect(codexCredentialMutationEpoch()).toBe(epochBefore + 1); + }); + + test("caller cancellation does not abort the token exchange signal", async () => { + const authPath = join(home, "auth.json"); + seedExpired(authPath); + const controller = new AbortController(); + const abortReason = new Error("client disconnected during exchange"); + const epochBefore = codexCredentialMutationEpoch(); + let exchangeAborted: boolean | undefined; + + await expect(getValidMainAccountToken({ + signal: controller.signal, + refreshToken: async (_refreshToken, options) => { + controller.abort(abortReason); + // Recorded rather than asserted here: a throw inside the seam would be masked by the + // caller's abort reason on the way out. + exchangeAborted = options.signal.aborted; + return refreshOk(); + }, + })).rejects.toBe(abortReason); + + expect(exchangeAborted).toBe(false); + expect(JSON.parse(readFileSync(authPath, "utf8")).tokens).toMatchObject({ + access_token: "ocx-staged-access", + refresh_token: "ocx-staged-refresh", + account_id: "account-main", + }); + expect(codexCredentialMutationEpoch()).toBe(epochBefore + 1); + }); + + test("an external writer during a cancelled exchange still refuses publication", async () => { + const authPath = join(home, "auth.json"); + seedExpired(authPath); + const external = JSON.stringify({ + tokens: { access_token: "external-access", refresh_token: "external-refresh", account_id: "account-external" }, + }); + const controller = new AbortController(); + const epochBefore = codexCredentialMutationEpoch(); + + await expect(getValidMainAccountToken({ + signal: controller.signal, + refreshToken: async () => { + const swapPath = join(home, "external-auth.json"); + writeFileSync(swapPath, external); + renameSync(swapPath, authPath); + controller.abort(new Error("client disconnected after external replacement")); + return refreshOk(); + }, + })).rejects.toThrow("changed while its token was refreshing"); + + expect(readFileSync(authPath, "utf8")).toBe(external); + expect(readdirSync(home).filter(name => name.includes(".tmp"))).toEqual([]); expect(codexCredentialMutationEpoch()).toBe(epochBefore); }); }); diff --git a/tests/responses/responses-alternate-main-cancellation.test.ts b/tests/responses/responses-alternate-main-cancellation.test.ts index c59a6952787..0fb94bc6b9a 100644 --- a/tests/responses/responses-alternate-main-cancellation.test.ts +++ b/tests/responses/responses-alternate-main-cancellation.test.ts @@ -173,8 +173,8 @@ for (const entry of ["retry helper", "messages ingress"] as const) { if (url.href === "https://auth.openai.com/oauth/token") { refreshes.push(new URLSearchParams(String(init?.body)).get("refresh_token") ?? ""); entered.resolve(); - // Deliberately ignore init.signal: a late endpoint result must be fenced by - // the credential owner even if the network operation does not stop on abort. + // Deliberately ignore init.signal: a late rotating grant must be saved even + // though caller cancellation still prevents subsequent inference. return release.promise; } if (url.hostname === "chatgpt.com" && url.pathname.endsWith("/responses")) { @@ -213,9 +213,20 @@ for (const entry of ["retry helper", "messages ingress"] as const) { expect(after.epoch).toBe(before.epoch + 1); expect(after.refused).toBe(false); } else { - // One aggregate assertion reports every forbidden side effect, including - // terminal refusal that leaves bytes intact but poisons later requests. - expect({ ...credentialState(), inference }).toEqual({ ...before, inference: initialInference }); + expect(inference).toEqual(initialInference); + if (scenario === "cancel-success") { + const after = credentialState(); + expect(JSON.parse(after.bytes).tokens).toMatchObject({ + access_token: "fixture-refreshed-main", refresh_token: "fixture-rotated-main", + }); + expect(after.epoch).toBe(before.epoch + 1); + expect(after.refused).toBe(false); + expect(after.genericReauth).toBe(false); + } + if (scenario === "cancel-terminal") { + // A cancelled terminal refusal must not poison later requests. + expect(credentialState()).toEqual(before); + } } } finally { release.resolve(refreshReply(false)); From 0dd7451976e40f1e80e023e3c604e38d1966a68e Mon Sep 17 00:00:00 2001 From: vibewriter-hand <337401476+vibewriter-hand@users.noreply.github.com> Date: Sat, 10 Oct 2026 19:01:55 +0900 Subject: [PATCH 06/25] fix: release active-turn admission when the client cancels (#6850) * fix: release turn admission on client cancellation * fix: bind internal decision cancellation at admission * fix: release pending Live upgrade admission on client abort * test(layout): register active-turn-disconnect on an existing line to stay under the size threshold --------- Co-authored-by: JUN --- scripts/test-layout/layout.json | 2 +- src/server/index.ts | 2 +- src/server/index/serve-options.ts | 3 + src/server/lifecycle.ts | 35 +- src/server/responses/jev-model-invoke.ts | 2 +- structure/transports/responses.md | 2 +- .../active-turn-disconnect.test.ts | 299 ++++++++++++++++++ tests/fixtures/test-layout-expected.json | 3 +- 8 files changed, 339 insertions(+), 9 deletions(-) create mode 100644 tests/codex-integration/active-turn-disconnect.test.ts diff --git a/scripts/test-layout/layout.json b/scripts/test-layout/layout.json index 02e0808c9c1..f68faa9a94a 100644 --- a/scripts/test-layout/layout.json +++ b/scripts/test-layout/layout.json @@ -130,7 +130,7 @@ "link-join-route.test.ts": "server", "core-link-boundary.test.ts": "lab", "acl-error-classification.test.ts": "lib", - "active-registry-admission.test.ts": "codex-integration", + "active-registry-admission.test.ts": "codex-integration", "active-turn-disconnect.test.ts": "codex-integration", "adapter-buffered-tool-conformance.test.ts": "adapters", "adapter-error-inline.test.ts": "adapters", "adapter-event-oauth-failover.test.ts": "oauth", diff --git a/src/server/index.ts b/src/server/index.ts index 183549bddc8..ee5e51a1f97 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -502,7 +502,7 @@ function startServerWithSpendLedgerOwner(port: number | undefined, deps: StartSe work: (lease: ActiveTurnLease) => Promise, refusalLog?: WorkflowRefusalLog, ): Promise { - const lease = tryAdmitTurn(sessionLaneIdFromRequest(req.headers)); + const lease = tryAdmitTurn(sessionLaneIdFromRequest(req.headers), req.signal); if (!lease) return serverBusyResponse(req, "active turns", policy); // Root, lane, and the refusal that follows from them, all live in ./workflow-refusal. let workflow: ReturnType; diff --git a/src/server/index/serve-options.ts b/src/server/index/serve-options.ts index 748b27d5a62..fb71110227b 100644 --- a/src/server/index/serve-options.ts +++ b/src/server/index/serve-options.ts @@ -1716,7 +1716,9 @@ export function createServeOptions(ctx: ServeOptionsContext) { if (audioController) registerTurn(audioController, turnAdmissionLease); const acquisition = audioController ? clearableDeadline(120_000, AbortSignal.any([req.signal, audioController.signal])) : undefined; + const detachClientAbort = turnAdmissionLease.bindAbortSignal(req.signal); const releaseAcquisition = () => { + detachClientAbort(); acquisition?.clear(); if (audioController) unregisterTurn(audioController); else turnAdmissionLease.release(); @@ -1835,6 +1837,7 @@ export function createServeOptions(ctx: ServeOptionsContext) { return withCors(formatErrorResponse(502, "upstream_error", "Audio WebSocket upgrade failed"), req, policy); } if (upgraded) { + detachClientAbort(); acquisition?.clear(); finalizeLiveRequest(101); return undefined as unknown as Response; diff --git a/src/server/lifecycle.ts b/src/server/lifecycle.ts index c4da2c28a16..addb0c0fa23 100644 --- a/src/server/lifecycle.ts +++ b/src/server/lifecycle.ts @@ -36,6 +36,7 @@ export const SESSION_LANE_ID_BYTES = 32; const turnGate = createAdmissionGate("active_turns", MAX_ACTIVE_TURNS); export interface ActiveTurnLease extends AdmissionLease { attach(lease: AdmissionLease): void; + bindAbortSignal(signal: AbortSignal): () => void; bindAbortController(ac: AbortController): void; beginCodexAccountSelection(): CodexAccountSelectionAdmission; isTransferred(): boolean; @@ -169,7 +170,7 @@ export function resetLifecycleDrainStateForTests(): void { serverStartupReleaseFlights = new WeakMap, Promise>(); releaseServerStartupLifecycleImpl = releaseNativeMainStartupLifecycle; } -export function tryAdmitTurn(sessionLaneId?: string): ActiveTurnLease | null { +export function tryAdmitTurn(sessionLaneId?: string, clientSignal?: AbortSignal): ActiveTurnLease | null { if (isDraining()) return null; const opaqueSessionLaneId = sessionLaneId ? createHash("sha256").update(sessionLaneId).digest("hex").slice(0, SESSION_LANE_ID_BYTES) @@ -192,6 +193,8 @@ export function tryAdmitTurn(sessionLaneId?: string): ActiveTurnLease | null { } const controllers = new Set(); const attachedLeases = new Set(); + const abortListeners = new Map void>(); + let cancellationReason: unknown; let active = true; let transferred = false; let nativeMainClaimed = false; @@ -200,22 +203,40 @@ export function tryAdmitTurn(sessionLaneId?: string): ActiveTurnLease | null { if (!active) attachedLease.release(); else attachedLeases.add(attachedLease); }, + bindAbortSignal(signal) { + if (!active || abortListeners.has(signal)) return () => {}; + const onAbort = () => { + cancellationReason = signal.reason; + const boundControllers = [...controllers]; + lease.release(); + for (const controller of boundControllers) controller.abort(cancellationReason); + }; + abortListeners.set(signal, onAbort); + signal.addEventListener("abort", onAbort, { once: true }); + if (signal.aborted) onAbort(); + return () => { + if (abortListeners.get(signal) !== onAbort) return; + signal.removeEventListener("abort", onAbort); + abortListeners.delete(signal); + }; + }, bindAbortController(ac) { knownTurnControllers.add(ac); if (!active) { - ac.abort(new Error("turn already settled")); + ac.abort(cancellationReason ?? new Error("turn already settled")); return; } transferred = true; controllers.add(ac); activeTurns.set(ac, lease); + lease.bindAbortSignal(ac.signal); }, beginCodexAccountSelection() { const mainProfileDraining = nativeMainDrainOwners.size > 0; - let selectionActive = !mainProfileDraining; + let selectionActive = active && !mainProfileDraining; let released = false; if (selectionActive) nativeMainSelections += 1; - return { + const selection: CodexAccountSelectionAdmission = { mainProfileDraining, claimMainProfile() { if (released || mainProfileDraining || !active) return false; @@ -228,18 +249,23 @@ export function tryAdmitTurn(sessionLaneId?: string): ActiveTurnLease | null { release() { if (released) return; released = true; + attachedLeases.delete(selection); if (selectionActive) { selectionActive = false; nativeMainSelections = Math.max(0, nativeMainSelections - 1); } }, }; + lease.attach(selection); + return selection; }, isTransferred() { return transferred; }, release() { if (!active) return; active = false; admittedTurns.delete(lease); + for (const [signal, listener] of abortListeners) signal.removeEventListener("abort", listener); + abortListeners.clear(); for (const controller of controllers) { if (activeTurns.get(controller) === lease) activeTurns.delete(controller); } @@ -258,6 +284,7 @@ export function tryAdmitTurn(sessionLaneId?: string): ActiveTurnLease | null { }, }; admittedTurns.add(lease); + if (clientSignal) lease.bindAbortSignal(clientSignal); return lease; } export function codexAccountSelectionForTurn( diff --git a/src/server/responses/jev-model-invoke.ts b/src/server/responses/jev-model-invoke.ts index 709a6523419..e9e97b1e1fb 100644 --- a/src/server/responses/jev-model-invoke.ts +++ b/src/server/responses/jev-model-invoke.ts @@ -136,7 +136,7 @@ export function createJevModelInvoker(context: JevModelInvokerContext): JevModel if (new TextEncoder().encode(body).byteLength > JEV_MAX_REQUEST_BYTES) { throw new JevModelInvokeError("malformed", "decision request too large"); } - const lease = tryAdmitTurn(); + const lease = tryAdmitTurn(undefined, signal); if (!lease) throw new JevModelInvokeError("network", "decision turn not admitted"); const childLog: RequestLogContext = { model, provider: "unknown", inboundProtocol: "responses" }; let usage: Record | undefined; diff --git a/structure/transports/responses.md b/structure/transports/responses.md index 0509784d3c4..0d7e0e2122f 100644 --- a/structure/transports/responses.md +++ b/structure/transports/responses.md @@ -71,7 +71,7 @@ silence. It cannot observe the client's workspace or prove whether a successful repository state. Consequently, the active-turn and session-lane gates are concurrency admission limits, the translator budget follows [live retained-byte ownership](byte-accounting.md#stream-buffer-accounting), the response-state caps are cache retention limits, and the stall watchdog is a silence limit. None is a cumulative continuation or -semantic no-progress budget. +semantic no-progress budget. The turn lease in `src/server/lifecycle.ts` subscribes to HTTP ingress cancellation, internal decision cancellation and every registered controller. Cancellation releases turn admission, session lanes, attached workflow leases and pending native-main selection ownership without waiting for upstream work. Live/Realtime acquisition binds ingress cancellation until WebSocket upgrade transfers ownership. Normal completion detaches the listeners; late finalizers remain idempotent. > Decision record: [ADR-0031](../decisions/ADR-0031-responses-http-sse.md) > Decision record: [ADR-0032](../decisions/ADR-0032-responses-http-sse.md) diff --git a/tests/codex-integration/active-turn-disconnect.test.ts b/tests/codex-integration/active-turn-disconnect.test.ts new file mode 100644 index 00000000000..12eeff30283 --- /dev/null +++ b/tests/codex-integration/active-turn-disconnect.test.ts @@ -0,0 +1,299 @@ +/** Admission follows the client lifetime even when upstream work stays pending. */ +import { expect, test, spyOn, afterEach } from "bun:test"; +import { mkdtempSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { request } from "node:http"; +import { saveConfig } from "../../src/config"; +import { startServer } from "../../src/server"; +import { + abortAndReleaseAllTurns, getActiveTurnCount, sessionLaneMetrics, + tryAdmitTurn, unregisterTurn, activeRegistryMetrics, getNativeMainProfileRequestCount, +} from "../../src/server/lifecycle"; +import { createJevModelInvoker } from "../../src/server/responses/jev-model-invoke"; +import { workflowBudgetSnapshot } from "../../src/lib/workflow-budget"; +import * as live from "../../src/server/live"; +import * as transport from "../../src/server/responses/request-transport"; +import type { OcxConfig } from "../../src/types"; +import { removeTreeWithRetry } from "../helpers/remove-tree"; + +afterEach(() => abortAndReleaseAllTurns(new Error("fixture cleanup"))); + +function deferred() { + let resolve!: (value: T) => void; + const promise = new Promise(r => { resolve = r; }); + return { promise, resolve }; +} + +async function until(check: () => boolean, label: string) { + const deadline = Date.now() + 1_000; + while (!check()) { + if (Date.now() >= deadline) throw new Error(`Timed out: ${label}; turns=${getActiveTurnCount()} lanes=${sessionLaneMetrics().active}`); + await new Promise(resolve => setTimeout(resolve, 5)); + } +} + +const responsePrefix = 'event: response.created\ndata: {"type":"response.created","response":{"id":"resp_fixture","status":"in_progress","output":[]}}\n\n'; +const messagePrefix = 'event: message_start\ndata: {"type":"message_start","message":{"id":"msg_fixture","type":"message","role":"assistant","model":"fixture","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}\n\n'; + +type Protocol = "responses-http" | "responses-ws" | "messages" | "compact"; +type Phase = "stream" | "silent" | "retry" | "selection"; + +async function disconnectedTurn(protocol: Protocol, phase: Phase) { + const previousHome = process.env.OPENCODEX_HOME; + const home = mkdtempSync(join(tmpdir(), "ocx-turn-disconnect-")); + process.env.OPENCODEX_HOME = home; + const entered = deferred(); + const unblock = deferred(); + let upstreamRequests = 0; + let capturedSignal: AbortSignal | undefined; + const upstream = Bun.serve({ hostname: "127.0.0.1", port: 0, async fetch(req) { + upstreamRequests += 1; + await req.text(); + entered.resolve(); + if (phase === "silent") { + await unblock.promise; + return Response.json({ id: "resp_fixture", output: [] }); + } + if (phase === "retry") return new Response("temporary fixture failure", { status: 503, headers: { "retry-after": "2" } }); + return new Response(new ReadableStream({ start(controller) { + controller.enqueue(new TextEncoder().encode(protocol === "messages" ? messagePrefix : responsePrefix)); + } }), { headers: { "content-type": "text/event-stream" } }); + } }); + const originalPrepare = transport.prepareResponsesTransport; + const prepare = spyOn(transport, "prepareResponsesTransport").mockImplementation(async (...args) => { + capturedSignal = args[0].options.abortSignal ?? args[0].req.signal; + if (phase === "selection") { entered.resolve(); await unblock.promise; } + return originalPrepare(...args); + }); + saveConfig({ + port: 0, hostname: "127.0.0.1", websockets: true, defaultProvider: "fixture", + connectTimeoutMs: 10_000, stallTimeoutSec: 10, + codexAutoStart: false, integrations: { codex: { enabled: false }, claudeCode: { enabled: false } }, + protocols: { rollout: { managedMessagesNative: true } }, + providers: { fixture: { + adapter: protocol === "messages" ? "anthropic" : "openai-responses", + baseUrl: `http://127.0.0.1:${upstream.port}${protocol === "messages" ? "" : "/v1"}`, + authMode: "key", apiKey: "fixture-key", allowPrivateNetwork: true, models: ["fixture"], + } }, + } as OcxConfig); + const server = startServer(0); + const before = { turns: getActiveTurnCount(), lanes: sessionLaneMetrics().active }; + const thread = `fixture-${protocol}-${phase}`; + const root = `parent-${thread}`; + const headers = { "content-type": "application/json", "thread-id": thread, "x-codex-parent-thread-id": root }; + let closeClient: (() => void) | undefined; + try { + if (protocol === "responses-ws") { + const socket = new WebSocket(new URL("/v1/responses", server.url).href.replace("http:", "ws:"), { headers }); + closeClient = () => socket.close(); + await new Promise((resolve, reject) => { socket.onopen = () => resolve(); socket.onerror = () => reject(new Error("fixture websocket failed")); }); + const received = deferred(); + socket.onmessage = () => received.resolve(); + socket.send(JSON.stringify({ type: "response.create", model: "fixture/fixture", input: "fixture", stream: true })); + await entered.promise; + if (phase === "stream") await received.promise; + await until(() => getActiveTurnCount() === before.turns + 1, "websocket admitted"); + socket.close(); + await new Promise(resolve => { if (socket.readyState === WebSocket.CLOSED) resolve(); else socket.onclose = () => resolve(); }); + } else { + const path = protocol === "messages" ? "/v1/messages" : protocol === "compact" ? "/v1/responses/compact" : "/v1/responses"; + const body = protocol === "messages" + ? { model: "fixture/fixture", max_tokens: 64, messages: [{ role: "user", content: "fixture" }], stream: true } + : { model: "fixture/fixture", input: "fixture", ...(protocol === "compact" ? {} : { stream: true }) }; + const received = deferred(); + const client = request(new URL(path, server.url), { method: "POST", headers }, response => { + response.on("data", () => received.resolve()); + response.on("error", () => {}); + }); + client.on("error", () => {}); + closeClient = () => client.destroy(); + client.end(JSON.stringify(body)); + await entered.promise; + if (phase === "stream") await received.promise; + await until(() => getActiveTurnCount() === before.turns + 1, "HTTP admitted"); + client.destroy(); + } + await until(() => getActiveTurnCount() === before.turns && sessionLaneMetrics().active === before.lanes, `${protocol}/${phase} released`); + console.log(JSON.stringify({ protocol, phase, before, after: { turns: getActiveTurnCount(), lanes: sessionLaneMetrics().active }, upstreamRequests, clientSignalAborted: capturedSignal?.aborted })); + expect(getActiveTurnCount()).toBe(before.turns); + expect(sessionLaneMetrics().active).toBe(before.lanes); + if (protocol !== "responses-ws") expect(workflowBudgetSnapshot(root)?.active ?? 0).toBe(0); + } catch (error) { + console.log(JSON.stringify({ protocol, phase, before, after: { turns: getActiveTurnCount(), lanes: sessionLaneMetrics().active }, upstreamRequests, clientSignalAborted: capturedSignal?.aborted })); + throw error; + } finally { + closeClient?.(); + unblock.resolve(); + prepare.mockRestore(); + abortAndReleaseAllTurns(new Error("fixture teardown")); + await server.stop(true); + await upstream.stop(true); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; else process.env.OPENCODEX_HOME = previousHome; + removeTreeWithRetry(home); + } +} + +for (const protocol of ["responses-http", "responses-ws", "messages"] as const) { + for (const phase of ["stream", "silent", "retry"] as const) { + test(`${protocol} releases its lane after disconnect during ${phase}`, () => disconnectedTurn(protocol, phase), 15_000); + } +} +for (const protocol of ["responses-http", "responses-ws"] as const) { + test(`${protocol} releases while account selection stays pending`, () => disconnectedTurn(protocol, "selection"), 15_000); +} +test("compact releases its lane after disconnect before upstream headers", () => disconnectedTurn("compact", "silent"), 15_000); + +test("an aborted registered controller releases once while its work stays pending", () => { + const before = activeRegistryMetrics().activeTurns; + const laneBefore = sessionLaneMetrics().active; + const lease = tryAdmitTurn("fixture-controller")!; + let released = 0; + lease.attach({ release() { released += 1; } }); + const ac = new AbortController(); + lease.bindAbortController(ac); + try { + ac.abort(new Error("fixture client closed")); + expect(getActiveTurnCount()).toBe(before.active); + expect(sessionLaneMetrics().active).toBe(laneBefore); + expect(released).toBe(1); + unregisterTurn(ac); + lease.release(); + expect(released).toBe(1); + expect(activeRegistryMetrics().activeTurns.releaseMisses).toBe(before.releaseMisses); + } finally { lease.release(); } +}); + + +test("ingress cancellation releases pending selection and all bound controllers", () => { + const before = getActiveTurnCount(); + const nativeBefore = getNativeMainProfileRequestCount(); + const client = new AbortController(); + const lease = tryAdmitTurn("fixture-selection", client.signal)!; + const selection = lease.beginCodexAccountSelection(); + const first = new AbortController(); + const second = new AbortController(); + lease.bindAbortController(first); + lease.bindAbortController(second); + lease.bindAbortController(first); + const reason = new Error("fixture ingress closed"); + client.abort(reason); + expect(getActiveTurnCount()).toBe(before); + expect(getNativeMainProfileRequestCount()).toBe(nativeBefore); + expect(first.signal.reason).toBe(reason); + expect(second.signal.reason).toBe(reason); + expect(selection.claimMainProfile()).toBe(false); + selection.release(); + lease.release(); + expect(getNativeMainProfileRequestCount()).toBe(nativeBefore); + const late = new AbortController(); + lease.bindAbortController(late); + expect(late.signal.reason).toBe(reason); + let released = 0; + lease.attach({ release() { released += 1; } }); + expect(released).toBe(1); +}); + +test("already aborted ingress cannot retain admission or selection", () => { + const before = getActiveTurnCount(); + const nativeBefore = getNativeMainProfileRequestCount(); + const client = new AbortController(); + client.abort(new Error("fixture already closed")); + const lease = tryAdmitTurn("fixture-pre-aborted", client.signal)!; + expect(getActiveTurnCount()).toBe(before); + const selection = lease.beginCodexAccountSelection(); + expect(selection.claimMainProfile()).toBe(false); + expect(getNativeMainProfileRequestCount()).toBe(nativeBefore); + selection.release(); + lease.release(); +}); + +test("normal completion detaches cancellation listeners", () => { + const client = new AbortController(); + const remove = spyOn(client.signal, "removeEventListener"); + const lease = tryAdmitTurn("fixture-complete", client.signal)!; + const upstream = new AbortController(); + lease.bindAbortController(upstream); + lease.release(); + expect(remove).toHaveBeenCalledTimes(1); + client.abort(new Error("fixture request disposed")); + expect(upstream.signal.aborted).toBe(false); + remove.mockRestore(); +}); + + +test("internal decision cancellation releases admission while dispatch remains pending", async () => { + const before = getActiveTurnCount(); + const entered = deferred(); + const unblock = deferred(); + const client = new AbortController(); + const invoke = createJevModelInvoker({ + req: { headers: new Headers() }, + config: { port: 0, defaultProvider: "fixture", providers: {} } as OcxConfig, + options: {}, + async handleResponses() { entered.resolve(); return unblock.promise; }, + }); + const pending = invoke({ model: "fixture", instructions: "fixture", input: "fixture", signal: client.signal }); + const settled = pending.catch(() => undefined); + await entered.promise; + expect(getActiveTurnCount()).toBe(before + 1); + try { + client.abort(new Error("fixture decision closed")); + expect(getActiveTurnCount()).toBe(before); + } finally { + unblock.resolve(new Response(null, { status: 499 })); + await settled; + } +}); + + +test("Live upgrade disconnect releases admission while resolution remains pending", async () => { + const previousHome = process.env.OPENCODEX_HOME; + const home = mkdtempSync(join(tmpdir(), "ocx-upgrade-disconnect-")); + process.env.OPENCODEX_HOME = home; + const entered = deferred(); + const unblock = deferred(); + const resolve = spyOn(live, "resolveLiveSidebandUpgrade").mockImplementation(async () => { + entered.resolve(); + return unblock.promise; + }); + saveConfig({ port: 0, hostname: "127.0.0.1", websockets: true, defaultProvider: "fixture", + codexAutoStart: false, integrations: { codex: { enabled: false }, claudeCode: { enabled: false } }, + providers: { fixture: { adapter: "openai-responses", baseUrl: "http://127.0.0.1:1/v1", authMode: "key", apiKey: "fixture-key", allowPrivateNetwork: true, models: ["fixture"] } }, + } as OcxConfig); + const server = startServer(0); + const before = getActiveTurnCount(); + const socket = new WebSocket(new URL("/v1/live/fixture", server.url).href.replace("http:", "ws:")); + socket.onerror = () => {}; + try { + await entered.promise; + expect(getActiveTurnCount()).toBe(before + 1); + socket.close(); + await until(() => getActiveTurnCount() === before, "Live upgrade admission released"); + } finally { + unblock.resolve(new Response(null, { status: 499 })); + resolve.mockRestore(); + socket.close(); + abortAndReleaseAllTurns(new Error("fixture teardown")); + await server.stop(true); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; else process.env.OPENCODEX_HOME = previousHome; + removeTreeWithRetry(home); + } +}, 15_000); + + +test("upgrade transfer detaches ingress cancellation and keeps connection ownership", () => { + const before = getActiveTurnCount(); + const ingress = new AbortController(); + const connection = new AbortController(); + const lease = tryAdmitTurn("fixture-upgrade-transfer")!; + lease.bindAbortController(connection); + const detach = lease.bindAbortSignal(ingress.signal); + detach(); + detach(); + ingress.abort(new Error("fixture handshake disposed")); + expect(getActiveTurnCount()).toBe(before + 1); + expect(connection.signal.aborted).toBe(false); + connection.abort(new Error("fixture socket closed")); + expect(getActiveTurnCount()).toBe(before); +}); diff --git a/tests/fixtures/test-layout-expected.json b/tests/fixtures/test-layout-expected.json index 41e0e0afcfa..5ceec6d4942 100644 --- a/tests/fixtures/test-layout-expected.json +++ b/tests/fixtures/test-layout-expected.json @@ -131,7 +131,8 @@ "link-listener-lifecycle.test.ts": "server", "link-listener-mutation.test.ts": "server", "link-join-route.test.ts": "server", "core-link-boundary.test.ts": "lab", "acl-error-classification.test.ts": "lib", - "active-registry-admission.test.ts": "codex-integration", "adapter-buffered-tool-conformance.test.ts": "adapters", + "active-registry-admission.test.ts": "codex-integration", + "active-turn-disconnect.test.ts": "codex-integration", "adapter-buffered-tool-conformance.test.ts": "adapters", "adapter-error-inline.test.ts": "adapters", "adapter-event-oauth-failover.test.ts": "oauth", "adapter-inner-send-budget-wiring.test.ts": "adapters", "adapter-inner-send-budget.test.ts": "adapters", "adapter-input-media-guard.test.ts": "adapters", "adapter-registry-authority.test.ts": "adapters", From aa95a485b7276a31dc9b036f00affa5168e27588 Mon Sep 17 00:00:00 2001 From: MarcTCruz <58499846+MarcTCruz@users.noreply.github.com> Date: Sat, 10 Oct 2026 07:31:32 -0300 Subject: [PATCH 07/25] fix(ollama-native): key response tool calls by native id before index (#6858) Ollama Cloud's mistral-large-4 streams several distinct tool calls in one frame, each with its own id but all with function.index 0. The parser keyed calls by index, so the second call collided with the first and the stream failed with "changed a tool-call id for an existing index" (or "reused a tool-call index for another function" when the names differ). A valid native id is now the call's identity. Index, then position, is the fallback only for entries without an id, and a later id adopts the call that was first seen without one at the same index. Two entries in one frame share a call only when they share an id. Budget keys follow first-seen order instead of the index, so distinct calls at one index keep separate argument and metadata accounting. The parallelToolCalls:false guard is unchanged: the captured shape now reaches it and fails closed with the parallel-call error. Co-authored-by: Claude Opus 5.5 --- .../src/content/docs/reference/adapters.md | 4 + src/adapters/ollama-native.ts | 32 +-- structure/providers/chat-compat.md | 2 +- .../ollama/ollama-native-parser.test.ts | 212 ++++++++++++++++++ 4 files changed, 235 insertions(+), 15 deletions(-) diff --git a/docs-site/src/content/docs/reference/adapters.md b/docs-site/src/content/docs/reference/adapters.md index b94a0044fad..802a546e12b 100644 --- a/docs-site/src/content/docs/reference/adapters.md +++ b/docs-site/src/content/docs/reference/adapters.md @@ -122,6 +122,10 @@ be configured on a separately named custom or self-hosted Ollama provider with is refused rather than mis-sent, and remote image URLs are not fetched. - **Tools:** declared in Ollama's native shape, streamed tool calls are whole-call records with object-valued `arguments`, and tool-result replay is paired strictly by call id and tool name. + Valid native call IDs distinguish calls even when the provider repeats a function index. + Repeated IDs update the same call's arguments; ID-less entries fall back to index, then position. + Calls retain first-seen order. With `parallel_tool_calls: false`, a second distinct provider call + still fails the turn closed before any tool call is emitted. Codex may record assistant commentary before a pending call's results. Text/thinking with no new tool calls is deferred until the batch is settled, so genuine results remain beside their originating calls. A new tool-call batch still settles the preceding one; missing results retain diff --git a/src/adapters/ollama-native.ts b/src/adapters/ollama-native.ts index f51e5aea5f4..69bc5a6bae9 100644 --- a/src/adapters/ollama-native.ts +++ b/src/adapters/ollama-native.ts @@ -81,7 +81,7 @@ interface PendingToolBatch { } interface NativeStreamToolCall { - key: string; + fallbackKey: string; budgetKey: string; order: number; name: string; @@ -639,6 +639,7 @@ function nativeMessageEvents(message: JsonRecord, state: NativeStreamState, budg } if (message.tool_calls !== undefined) { if (!Array.isArray(message.tool_calls)) throw new Error("ollama-native response tool_calls was not an array"); + const frameCalls = new Map(); for (let position = 0; position < message.tool_calls.length; position++) { const rawCall = message.tool_calls[position]; if (!isRecord(rawCall) || !isRecord(rawCall.function)) { @@ -653,12 +654,16 @@ function nativeMessageEvents(message: JsonRecord, state: NativeStreamState, budg const args = assertObjectArguments(fn.arguments, "response tool call"); const index = isFiniteNonNegativeInteger(fn.index) ? fn.index : undefined; const nativeId = validNativeToolCallId(rawCall.id); - const key = index === undefined ? `position:${position}` : `index:${index}`; - // Tool-call identity is explicitly keyed by the provider index when supplied: a later - // frame for the same index updates that call's arguments, while a distinct index creates a - // second call. This narrow tool-call compatibility rule is independent from text/thinking - // semantics, where every non-empty native field is an appended partial delta. - const existing = state.toolCalls.get(key); + const fallbackKey = index === undefined ? `position:${position}` : `index:${index}`; + // Native ids distinguish calls even when Ollama repeats index zero. Index/position are + // fallback identities only; within one frame only entries sharing an id may update a call. + // An id arriving for a call first seen without one still adopts that call by its fallback. + const available = (call: NativeStreamToolCall) => + !frameCalls.has(call) || (nativeId !== undefined && frameCalls.get(call) === nativeId); + const calls = [...state.toolCalls.values()]; + const existing = (nativeId ? calls.find(call => call.nativeId === nativeId && available(call)) : undefined) + ?? calls.find(call => call.fallbackKey === fallbackKey + && (!nativeId || !call.nativeId) && available(call)); if (!existing && !state.allowParallelToolCalls && state.toolCalls.size > 0) { throw new Error("ollama-native provider emitted parallel tool calls while parallelToolCalls:false was requested"); } @@ -666,16 +671,14 @@ function nativeMessageEvents(message: JsonRecord, state: NativeStreamState, budg throw new Error(`ollama-native response exceeded ${NATIVE_MAX_PENDING_TOOL_CALLS} pending tool calls`); } if (existing) { - if (existing.name !== fn.name) throw new Error("ollama-native response reused a tool-call index for another function"); - if (nativeId && existing.nativeId && nativeId !== existing.nativeId) { - throw new Error("ollama-native response changed a tool-call id for an existing index"); - } + if (existing.name !== fn.name) throw new Error("ollama-native response reused a tool-call identity for another function"); if (!existing.nativeId && nativeId) existing.nativeId = nativeId; replaceNativeToolArguments(existing, args, budget); + frameCalls.set(existing, nativeId); } else { const call: NativeStreamToolCall = { - key, - budgetKey: `ollama-native:${key}`, + fallbackKey, + budgetKey: `ollama-native:${state.nextToolOrder}`, order: state.nextToolOrder++, name: fn.name, ...(nativeId ? { nativeId } : {}), @@ -695,7 +698,8 @@ function nativeMessageEvents(message: JsonRecord, state: NativeStreamState, budg }); call.metadataBytes = metadataBytes; replaceNativeToolArguments(call, args, budget); - state.toolCalls.set(key, call); + state.toolCalls.set(call.budgetKey, call); + frameCalls.set(call, nativeId); } catch (error) { if (call.metadataBytes > 0) { budget.releaseRetained(call.metadataBytes, { kind: "tool_args" }); diff --git a/structure/providers/chat-compat.md b/structure/providers/chat-compat.md index d90857d5a6b..89e9c7b0745 100644 --- a/structure/providers/chat-compat.md +++ b/structure/providers/chat-compat.md @@ -127,7 +127,7 @@ with no new tool calls is also deferred while results remain outstanding. Deferr A new tool-call batch settles its predecessor. Additional results in an open batch join in arrival order, preserving images and error markers; known late output uses an attributed user-text carrier after any pending batch. Unknown IDs and mismatched names/namespaces still throw; missing results -retain the unknown-status marker; the replay and tool-continuation tests under `tests/providers/ollama/` cover both paths. See the decision record below. +retain the unknown-status marker; the replay and tool-continuation tests under `tests/providers/ollama/` cover both paths. See the decision record below. Native response tool-call identity uses valid IDs before function-index/position fallbacks. Distinct IDs at index zero remain separate; repeated IDs replace arguments and cannot change function names. ID-less later frames can update an existing index (and an id may adopt a call first seen without one), but same-frame entries share a call only with the same ID. First-seen order, separate call budgets/retained metadata and the 128-call cap remain enforced. `parallelToolCalls:false` still fails closed before actionable tool events. `tests/providers/ollama/ollama-native-parser.test.ts` covers these contracts. Forward-mode OpenAI passthrough also repairs replayed `call_id` values longer than the Responses API's 64-character limit. Sidechat/fork replay can namespace routed-provider ids beyond that limit, diff --git a/tests/providers/ollama/ollama-native-parser.test.ts b/tests/providers/ollama/ollama-native-parser.test.ts index 76f9194b646..4223c861723 100644 --- a/tests/providers/ollama/ollama-native-parser.test.ts +++ b/tests/providers/ollama/ollama-native-parser.test.ts @@ -312,6 +312,218 @@ describe("ollama-native — buffered terminal contract", () => { }); describe("ollama-native — tool calls", () => { + const capturedFrame = { + message: { + role: "assistant", content: "", tool_calls: [ + { id: "PpZ8JqRmm", function: { index: 0, name: "read_file", arguments: { path: "/etc/hostname" } } }, + { id: "DDe4wZqkx", function: { index: 0, name: "read_file", arguments: { path: "/etc/os-release" } } }, + ], + }, + done: false, + }; + const toolTerminal = { done: true, done_reason: "tool_calls" }; + + test.each(["stream", "buffered"])("native identity: captured index-zero calls stay distinct (%s)", async mode => { + const adapter = createOllamaNativeAdapter(provider()); + adapter.buildRequest(parsedWith([{ role: "user", content: "go" }], { parallelToolCalls: true })); + const budget = createTestTranslatorBudget({ maxCallArgumentBytes: 32 }); + const events: AdapterEvent[] = []; + if (mode === "buffered") { + events.push(...await adapter.parseResponse!(new Response(JSON.stringify({ ...capturedFrame, ...toolTerminal })), budget)); + } else { + for await (const event of adapter.parseStream(ndjsonResponse([capturedFrame, toolTerminal]), budget)) events.push(event); + } + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "PpZ8JqRmm", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"/etc/hostname"}' }, + { type: "tool_call_end" }, + { type: "tool_call_start", id: "DDe4wZqkx", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"/etc/os-release"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + expect(budget.snapshot()).toMatchObject({ activeCalls: 0, overflows: 0 }); + // Buffered parsing retains the translated event batch until its response owner disposes it. + if (mode === "stream") expect(budget.snapshot().currentBytes).toBe(0); + budget.dispose(); + expect(budget.snapshot().currentBytes).toBe(0); + }); + + test("native identity: captured parallel calls fail at the parallel policy guard", async () => { + const adapter = createOllamaNativeAdapter(provider()); + adapter.buildRequest(parsedWith([{ role: "user", content: "go" }], { parallelToolCalls: false })); + const budget = createTestTranslatorBudget(); + const events: AdapterEvent[] = []; + for await (const event of adapter.parseStream(ndjsonResponse([capturedFrame, toolTerminal]), budget)) events.push(event); + expect(events).toHaveLength(1); + expect(events[0]).toMatchObject({ type: "error", code: "invalid_ollama_native_payload" }); + expect((events[0] as { message: string }).message).toContain("parallel tool calls"); + expect((events[0] as { message: string }).message).not.toContain("changed a tool-call id"); + expect(events.some(event => event.type === "tool_call_start")).toBe(false); + expect(budget.snapshot()).toMatchObject({ currentBytes: 0, activeCalls: 0, overflows: 0 }); + }); + + test.each([0, 1])("native identity: repeated id replaces arguments even at index %i", async nextIndex => { + const adapter = createOllamaNativeAdapter(provider()); + adapter.buildRequest(parsedWith([{ role: "user", content: "go" }], { parallelToolCalls: false })); + const events = await collect(adapter, ndjsonResponse([ + frame({ tool_calls: [{ id: "stable", function: { index: 0, name: "read_file", arguments: { path: "old", stale: true } } }] }, false), + frame({ tool_calls: [{ id: "stable", function: { index: nextIndex, name: "read_file", arguments: { path: "new" } } }] }, false), + toolTerminal, + ])); + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "stable", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"new"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + }); + + test.each(["index", "position"])("native identity: id-less %s updates across frames", async identity => { + const index = identity === "index" ? { index: 3 } : {}; + const events = await collect(createOllamaNativeAdapter(provider()), ndjsonResponse([ + frame({ tool_calls: [{ function: { ...index, name: "read_file", arguments: { path: "old", stale: true } } }] }, false), + frame({ tool_calls: [{ function: { ...index, name: "read_file", arguments: { path: "new" } } }] }, false), + toolTerminal, + ])); + const starts = events.filter(event => event.type === "tool_call_start"); + expect(starts).toHaveLength(1); + expect(starts[0]).toMatchObject({ name: "read_file", id: expect.stringMatching(/^ollama_call_/) }); + expect(events.filter(event => event.type === "tool_call_delta")).toEqual([{ type: "tool_call_delta", arguments: '{"path":"new"}' }]); + expect(events.at(-1)).toEqual({ type: "done", stopReason: "tool_calls" }); + }); + + test("native identity: repeated id in one frame replaces arguments despite differing indexes", async () => { + const adapter = createOllamaNativeAdapter(provider()); + adapter.buildRequest(parsedWith([{ role: "user", content: "go" }], { parallelToolCalls: false })); + const events = await collect(adapter, ndjsonResponse([ + frame({ tool_calls: [ + { id: "stable", function: { index: 0, name: "read_file", arguments: { path: "old" } } }, + { id: "stable", function: { index: 1, name: "read_file", arguments: { path: "new" } } }, + ] }, false), + toolTerminal, + ])); + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "stable", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"new"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + }); + + test.each([0, 1])("native identity: id-less entries in one frame stay distinct at index %i", async secondIndex => { + const events = await collect(createOllamaNativeAdapter(provider()), ndjsonResponse([ + frame({ tool_calls: [ + { function: { index: 0, name: "read_file", arguments: { path: "old-first" } } }, + { function: { index: secondIndex, name: "read_file", arguments: { path: "old-second" } } }, + ] }, false), + frame({ tool_calls: [ + { function: { index: 0, name: "read_file", arguments: { path: "first" } } }, + { function: { index: secondIndex, name: "read_file", arguments: { path: "second" } } }, + ] }, false), + toolTerminal, + ])); + const starts = events.filter(event => event.type === "tool_call_start"); + expect(starts).toHaveLength(2); + expect(starts.map(event => event.name)).toEqual(["read_file", "read_file"]); + expect(new Set(starts.map(event => event.id)).size).toBe(2); + expect(events.filter(event => event.type === "tool_call_delta")).toEqual([ + { type: "tool_call_delta", arguments: '{"path":"first"}' }, + { type: "tool_call_delta", arguments: '{"path":"second"}' }, + ]); + expect(events.at(-1)).toEqual({ type: "done", stopReason: "tool_calls" }); + }); + + test("native identity: an id-less index updates an existing native-id call", async () => { + const events = await collect(createOllamaNativeAdapter(provider()), ndjsonResponse([ + frame({ tool_calls: [{ id: "stable", function: { index: 0, name: "read_file", arguments: { path: "old" } } }] }, false), + frame({ tool_calls: [{ function: { index: 0, name: "read_file", arguments: { path: "new" } } }] }, false), + toolTerminal, + ])); + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "stable", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"new"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + }); + + test("native identity: a later id adopts the id-less call at its index", async () => { + const adapter = createOllamaNativeAdapter(provider()); + adapter.buildRequest(parsedWith([{ role: "user", content: "go" }], { parallelToolCalls: false })); + const events = await collect(adapter, ndjsonResponse([ + frame({ tool_calls: [{ function: { index: 0, name: "read_file", arguments: { path: "old" } } }] }, false), + frame({ tool_calls: [{ id: "late", function: { index: 0, name: "read_file", arguments: { path: "new" } } }] }, false), + toolTerminal, + ])); + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "late", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"new"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + }); + + test.each([0, 1])("native identity: the same id cannot change function at index %i", async nextIndex => { + const events = await collect(createOllamaNativeAdapter(provider()), ndjsonResponse([ + frame({ tool_calls: [{ id: "stable", function: { index: 0, name: "read_file", arguments: {} } }] }, false), + frame({ tool_calls: [{ id: "stable", function: { index: nextIndex, name: "write_file", arguments: {} } }] }, false), + toolTerminal, + ])); + expect(events.at(-1)).toMatchObject({ type: "error", code: "invalid_ollama_native_payload" }); + expect((events.at(-1) as { message: string }).message).toContain("another function"); + expect(events.some(event => event.type === "tool_call_start")).toBe(false); + }); + + test("native identity: different ids and functions at one index across frames preserve order", async () => { + const events = await collect(createOllamaNativeAdapter(provider()), ndjsonResponse([ + frame({ tool_calls: [{ id: "first", function: { index: 0, name: "read_file", arguments: { path: "first" } } }] }, false), + frame({ tool_calls: [{ id: "second", function: { index: 0, name: "write_file", arguments: { path: "second" } } }] }, false), + frame({ tool_calls: [{ id: "first", function: { index: 0, name: "read_file", arguments: { path: "updated" } } }] }, false), + toolTerminal, + ])); + expect(events.filter(event => event.type !== "heartbeat")).toEqual([ + { type: "tool_call_start", id: "first", name: "read_file" }, + { type: "tool_call_delta", arguments: '{"path":"updated"}' }, + { type: "tool_call_end" }, + { type: "tool_call_start", id: "second", name: "write_file" }, + { type: "tool_call_delta", arguments: '{"path":"second"}' }, + { type: "tool_call_end" }, + { type: "done", stopReason: "tool_calls" }, + ]); + }); + + test("native identity: the pending-call cap counts distinct ids at one index", async () => { + const adapter = createOllamaNativeAdapter(provider()); + const calls = Array.from({ length: 129 }, (_, index) => ({ + id: `call_${index}`, function: { index: 0, name: "read_file", arguments: {} }, + })); + const accepted = await collect(adapter, ndjsonResponse([ + frame({ tool_calls: calls.slice(0, 128) }, false), toolTerminal, + ])); + expect(accepted.filter(event => event.type === "tool_call_start").map(event => event.id)).toEqual(calls.slice(0, 128).map(call => call.id)); + expect(accepted.at(-1)?.type).toBe("done"); + const budget = createTestTranslatorBudget(); + const rejected: AdapterEvent[] = []; + for await (const event of adapter.parseStream(ndjsonResponse([frame({ tool_calls: calls }, false)]), budget)) rejected.push(event); + expect(rejected.at(-1)).toMatchObject({ type: "error", code: "invalid_ollama_native_payload" }); + expect((rejected.at(-1) as { message: string }).message).toContain("exceeded 128 pending tool calls"); + expect(rejected.some(event => event.type === "tool_call_start")).toBe(false); + expect(budget.snapshot()).toMatchObject({ currentBytes: 0, activeCalls: 0, overflows: 0 }); + }); + + test("native identity: distinct ids at one index retain separate metadata charges", async () => { + const budget = createTestTranslatorBudget({ maxTurnBytes: 2000 }); + const frames = Array.from({ length: 3 }, (_, index) => frame({ tool_calls: [{ + id: `call_${index}`, function: { index: 0, name: "n".repeat(700), arguments: {} }, + }] }, false)); + const events: AdapterEvent[] = []; + for await (const event of createOllamaNativeAdapter(provider()).parseStream(ndjsonResponse(frames), budget)) events.push(event); + expect(events.at(-1)).toMatchObject({ type: "error", code: "translation_buffer_limit" }); + expect(events.some(event => event.type === "tool_call_start")).toBe(false); + expect(budget.snapshot()).toMatchObject({ currentBytes: 0, activeCalls: 0, overflows: 1 }); + }); + test("indexed tool calls preserve order and identity", async () => { const adapter = createOllamaNativeAdapter(provider()); const budget = createTestTranslatorBudget(); From aa09c2ce3fece46cc7602831db94032ab0dfcf0e Mon Sep 17 00:00:00 2001 From: Blazetes Date: Sat, 10 Oct 2026 18:31:36 +0800 Subject: [PATCH 08/25] fix(zcode): carry reasoning ladders and image input into the provider_config.json store (#6828) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(zcode): carry reasoning ladders and image input into the provider_config.json store ZCode 3.14 moved custom providers to v2/provider_config.json (#5348), and the store export carried over only each model's contextWindow — the reasoning ladder #4147 added to the legacy v2/config.json block and the catalog's image modality were both dropped, so every opencodex model showed no thought-level picker and no attachment support in current ZCode builds. Write the capabilities the client's own store schema accepts, extracted from the ZCode CLI bundle's strict zod definitions: config.optionSpecs.reasoningLevel. values (the same Codex-vocabulary ladder the legacy block emits, minus the none sentinel; the chosen level is validated against values and forwarded verbatim to reasoning.effort) and config.properties.inputFormat.supportsImage when the catalog row declares image input. A model rule now ships when the row has any of contextWindow, image input, or a selectable ladder; rows with none still ship none, per the no-guessed-capability rule. Effort filtering is shared with the legacy exporter via zcodeSelectableEfforts in model-metadata. * chore: re-trigger review readiness gate after checklist attestation --------- Co-authored-by: Blazetes --- src/clients/config-export/model-metadata.ts | 16 +++++ src/clients/config-export/zcode-store.ts | 57 ++++++++++++--- src/clients/config-export/zcode.ts | 8 +-- tests/providers/zcode-client.test.ts | 80 +++++++++++++++++++++ 4 files changed, 145 insertions(+), 16 deletions(-) diff --git a/src/clients/config-export/model-metadata.ts b/src/clients/config-export/model-metadata.ts index efb89b55822..a83c030d4cf 100644 --- a/src/clients/config-export/model-metadata.ts +++ b/src/clients/config-export/model-metadata.ts @@ -2,6 +2,7 @@ import { getModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata"; import { SCHEMA_REQUIRED_OUTPUT_BUDGET } from "./constants"; import { expandFastExportModels } from "./fast-models"; +import { sanitizeCodexReasoningEfforts } from "../../reasoning-effort"; import type { OpencodeCatalogModel, ExportModel, ExportClientId, ManagedContribution } from "./contracts"; import type { OcxConfig } from "../../types"; import { shouldInjectApiAuthHeader } from "../../codex/inject"; @@ -84,6 +85,21 @@ export function inputModalitiesForClient( return kept.length > 0 ? kept : null; } +/** + * Effort ladder a ZCode surface can offer as picker values, or undefined when the row + * has nothing selectable. + * + * Both ZCode exports — the legacy `v2/config.json` block's `reasoning.variants` and the + * `v2/provider_config.json` store's `optionSpecs.reasoningLevel.values` — carry the same + * Codex vocabulary: the client validates the chosen level against the emitted list and + * forwards it verbatim, and `/v1/responses` reads that vocabulary natively. `none` is a + * Codex omit-sentinel, not a picker option, so it never survives into the values. + */ +export function zcodeSelectableEfforts(efforts: readonly string[] | undefined): string[] | undefined { + const selectable = sanitizeCodexReasoningEfforts(efforts)?.filter(effort => effort !== "none"); + return selectable && selectable.length > 0 ? selectable : undefined; +} + /** * Input modalities opencode's model schema accepts (opencode.ai/config.json, both * `modalities.input` and `modalities.output`). Wider than our internal `text | image | audio` diff --git a/src/clients/config-export/zcode-store.ts b/src/clients/config-export/zcode-store.ts index cf824b02e24..d931e19e6b9 100644 --- a/src/clients/config-export/zcode-store.ts +++ b/src/clients/config-export/zcode-store.ts @@ -1,6 +1,6 @@ // ZCode personal provider store export. import type { ExportContext, ManagedContribution, ManagedFragment } from "./contracts"; -import { authoritativeContextWindow, inputModalitiesForClient, normalizeExportModels } from "./model-metadata"; +import { authoritativeContextWindow, inputModalitiesForClient, normalizeExportModels, zcodeSelectableEfforts } from "./model-metadata"; import { OPENCODE_PROVIDER_ID, LOOPBACK_API_KEY_PLACEHOLDER } from "./constants"; import { formatSelectorConjunction } from "../../integrations/merge"; @@ -49,10 +49,30 @@ export interface ZcodeStoreProviderRule { }; } +/** + * One model rule, as the client's own store loader accepts it. + * + * The capability fields are the client's schema, not ours: ZCode 3.14's CLI + * bundle parses each `providerModelRules` entry with a strict object whose + * `config.properties` admits `inputFormat.{supportsText..supportsPdf}` (booleans) + * and whose `config.optionSpecs` admits `reasoningLevel.values` (non-empty, + * deduplicated) plus an optional compiled `map`. With no `map`, the chosen level + * is validated against `values` and forwarded verbatim to the wire field the + * `openai-responses` api type uses — `reasoning.effort`, which is exactly the + * Codex vocabulary our ladder already carries, so no mapping is emitted. + */ export interface ZcodeStoreModelRule { providerId: string; modelId: string; - config: { properties: { contextWindow: number } }; + config: { + properties: { + contextWindow?: number; + inputFormat?: { supportsImage: true }; + }; + optionSpecs?: { + reasoningLevel: { values: string[] }; + }; + }; } /** @@ -77,7 +97,7 @@ export function zcodeStoreSchemaEstablished(parsed: unknown): boolean { * carrying only the model would match another provider's rule for the same * model. The conjunction grammar reserves `,` and `]`, and a model id holding * either cannot be addressed unambiguously — that row ships without its - * context window rather than with a selector that points somewhere else. + * model rule rather than with a selector that points somewhere else. */ function modelRuleSelector(modelId: string): string | null { return formatSelectorConjunction([ @@ -128,12 +148,18 @@ export function buildZcodeStoreProviderRule(ctx: ExportContext): ZcodeStoreProvi /** * Everything this project owns inside the store: one provider rule, plus one - * model rule per row that has an authoritative context window. + * model rule per row that has anything authoritative to assert. * - * A row without one ships no model rule at all, which is the same - * authoritative-window rule the legacy block follows — an emitted stand-in - * would be a guessed capability. Reasoning ladders have no counterpart here - * that this project has observed the client produce, so none is written. + * A model rule now exists when the row has any of: an authoritative context + * window, image input, or a selectable effort ladder. A row with none of the + * three ships no rule at all, which is the same no-guessed-capability rule the + * legacy block follows. Image input is asserted only when the catalog declares + * it — `supportsImage: true` is what gates the client's attachment UI, and a + * text-only row keeps the client's own defaults rather than being pinned to + * `false`. `reasoningLevel.values` carries the same ladder (minus the `none` + * sentinel) the legacy block's `reasoning.variants` carries, so both surfaces + * offer the picker the catalog declared instead of the store silently losing + * reasoning and vision the way #5348 lost the provider itself. */ export function buildZcodeStoreContribution(ctx: ExportContext): ManagedContribution { const fragments: ManagedFragment[] = [{ @@ -141,15 +167,24 @@ export function buildZcodeStoreContribution(ctx: ExportContext): ManagedContribu value: buildZcodeStoreProviderRule(ctx), }]; for (const model of normalizeExportModels(ctx.models)) { - if (inputModalitiesForClient("pi", model.inputModalities) === null) continue; + const input = inputModalitiesForClient("pi", model.inputModalities); + if (input === null) continue; const contextWindow = authoritativeContextWindow(model.contextWindow); - if (contextWindow === undefined) continue; + const supportsImage = input.includes("image"); + const efforts = zcodeSelectableEfforts(model.reasoningEfforts); + if (contextWindow === undefined && !supportsImage && efforts === undefined) continue; const selector = modelRuleSelector(model.namespaced); if (selector === null) continue; const rule: ZcodeStoreModelRule = { providerId: OPENCODE_PROVIDER_ID, modelId: model.namespaced, - config: { properties: { contextWindow } }, + config: { + properties: { + ...(contextWindow !== undefined ? { contextWindow } : {}), + ...(supportsImage ? { inputFormat: { supportsImage: true } } : {}), + }, + ...(efforts !== undefined ? { optionSpecs: { reasoningLevel: { values: efforts } } } : {}), + }, }; fragments.push({ path: [...ZCODE_STORE_MODEL_RULES_PATH, selector], value: rule }); } diff --git a/src/clients/config-export/zcode.ts b/src/clients/config-export/zcode.ts index edd200beba8..4057366437b 100644 --- a/src/clients/config-export/zcode.ts +++ b/src/clients/config-export/zcode.ts @@ -1,7 +1,6 @@ // ZCode config export. import type { ExportContext, ManagedContribution } from "./contracts"; -import { normalizeExportModels, inputModalitiesForClient, exportModelLabel, authoritativeContextWindow, singleFragment } from "./model-metadata"; -import { sanitizeCodexReasoningEfforts } from "../../reasoning-effort"; +import { normalizeExportModels, inputModalitiesForClient, exportModelLabel, authoritativeContextWindow, singleFragment, zcodeSelectableEfforts } from "./model-metadata"; import { OPENCODE_PROVIDER_ID, LOOPBACK_API_KEY_PLACEHOLDER } from "./constants"; @@ -86,9 +85,8 @@ export function buildZcodeClientConfig(ctx: ExportContext): ZcodeGeneratedConfig // `ultra` when present: ZCode forwards the selected variant to the wire field its // kind uses — `reasoning.effort` on `openai`, which is what `/v1/responses` reads // natively. Set `defaultVariant` only when it survives that filter. - const efforts = sanitizeCodexReasoningEfforts(model.reasoningEfforts) - ?.filter(effort => effort !== "none"); - if (efforts && efforts.length > 0) { + const efforts = zcodeSelectableEfforts(model.reasoningEfforts); + if (efforts !== undefined) { const defaultVariant = model.defaultReasoningEffort?.trim().toLowerCase(); entry.reasoning = { enabled: true, diff --git a/tests/providers/zcode-client.test.ts b/tests/providers/zcode-client.test.ts index 3d4047f791a..ab34e9bab4b 100644 --- a/tests/providers/zcode-client.test.ts +++ b/tests/providers/zcode-client.test.ts @@ -7,9 +7,11 @@ import { buildClientConfig, buildClientConfigText, buildClientContribution, + buildZcodeStoreContribution, zcodeConfigPath, zcodeHomeDir, type ExportContext, + type ManagedFragment, type ZcodeGeneratedConfig, } from "../../src/clients/config-export"; import type { OcxConfig } from "../../src/types"; @@ -162,6 +164,84 @@ describe("ZCode reasoning export", () => { }); }); +describe("ZCode provider store", () => { + /** The model-rule fragments of one store contribution, keyed by modelId. */ + function modelRules(ctx: ExportContext): Map { + const rules = new Map(); + for (const fragment of buildZcodeStoreContribution(ctx).fragments as readonly ManagedFragment[]) { + if (fragment.path[0] !== "config" || fragment.path[1] !== "modelConfigRules") continue; + rules.set((fragment.value as { modelId: string }).modelId, fragment.value); + } + return rules; + } + + test("model rules carry the catalog's image support and effort ladder, not just the context window", () => { + const rules = modelRules({ + ...context(), + models: [ + { + namespaced: "opencode-go/mimo-v2.6-pro", + provider: "opencode-go", + id: "mimo-v2.6-pro", + contextWindow: 600_000, + inputModalities: ["text", "image"], + reasoningEfforts: ["max", "low", "high", "none", "medium", "xhigh"], + defaultReasoningEffort: "medium", + }, + ], + }); + expect(rules.get("opencode-go/mimo-v2.6-pro")).toEqual({ + providerId: OPENCODE_PROVIDER_ID, + modelId: "opencode-go/mimo-v2.6-pro", + config: { + properties: { contextWindow: 600_000, inputFormat: { supportsImage: true } }, + optionSpecs: { reasoningLevel: { values: ["low", "medium", "high", "xhigh", "max"] } }, + }, + }); + }); + + test("a text-only row asserts no inputFormat and keeps the client's own defaults", () => { + const rules = modelRules({ + ...context(), + models: [{ namespaced: "xai/grok-5", provider: "xai", id: "grok-5", contextWindow: 262_144 }], + }); + expect(rules.get("xai/grok-5")).toEqual({ + providerId: OPENCODE_PROVIDER_ID, + modelId: "xai/grok-5", + config: { properties: { contextWindow: 262_144 } }, + }); + }); + + test("a row without a context window still ships a rule when it has capabilities to assert", () => { + const rules = modelRules({ + ...context(), + models: [ + { namespaced: "mystery/vision", provider: "mystery", id: "vision", inputModalities: ["text", "image"], reasoningEfforts: ["low", "high"] }, + ], + }); + expect(rules.get("mystery/vision")).toEqual({ + providerId: OPENCODE_PROVIDER_ID, + modelId: "mystery/vision", + config: { + properties: { inputFormat: { supportsImage: true } }, + optionSpecs: { reasoningLevel: { values: ["low", "high"] } }, + }, + }); + }); + + test("a row with nothing authoritative to assert ships no rule, and audio-only ships none either", () => { + const rules = modelRules({ + ...context(), + models: [ + { namespaced: "mystery/model", provider: "mystery", id: "model" }, + { namespaced: "zenmux/audio-only", provider: "zenmux", id: "audio-only", inputModalities: ["audio"], contextWindow: 100_000, reasoningEfforts: ["low"] }, + ], + }); + expect(rules.has("mystery/model")).toBe(false); + expect(rules.has("zenmux/audio-only")).toBe(false); + }); +}); + describe("ocx zcode CLI alias", () => { /** Captures the client-integration requests the alias forwards. */ function fakeRuntime(): { deps: { baseUrl: string; fetchImpl: typeof fetch }; requests: Array<{ path: string; method: string; body: unknown }> } { From 3354119b8b6173682413be0dc6cc5722eb7f138a Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 19:31:39 +0900 Subject: [PATCH 09/25] fix(responses): warn once when a custom provider drops replayed plaintext reasoning (#6882) * fix(responses): warn once when a custom provider drops replayed plaintext reasoning (#6675) * fix(responses): treat Azure per-resource hosts as curated destinations in the reasoning notice --- .../docs/reference/configuration/providers.md | 2 +- src/adapters/openai-responses/passthrough.ts | 2 + .../plaintext-reasoning-notice.ts | 85 +++++++++++++++++++ src/adapters/openai-responses/reasoning.ts | 12 ++- .../deepseek-reasoning-replay.test.ts | 80 ++++++++++++++++- 5 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 src/adapters/openai-responses/plaintext-reasoning-notice.ts diff --git a/docs-site/src/content/docs/reference/configuration/providers.md b/docs-site/src/content/docs/reference/configuration/providers.md index 929c568e852..b07aac6f57a 100644 --- a/docs-site/src/content/docs/reference/configuration/providers.md +++ b/docs-site/src/content/docs/reference/configuration/providers.md @@ -227,7 +227,7 @@ Providers can expose a built-in shorthand, such as `agy` for `google-antigravity | `modelSupportsServiceTier?` | `Record` | Exact upstream model capability overrides. Exact `true` enables canonical Fast for that model; exact `false` narrows provider defaults. An explicit provider-level `supportsServiceTier: false` remains fail-closed and cannot be reopened. Exact `true` does not authorize foreign caller-tier forwarding on Chat. Undeclared models fall back to provider-wide behavior. Management `PATCH /api/providers` merges entries and accepts `null` to clear one. | | `chatServiceTier?` | `boolean` | Provider-wide Chat-wire opt-in for forwarding caller `service_tier` values. On a classified route it governs foreign values such as `flex`, not proxy-owned canonical Fast after capability validation; on an unclassified route it governs every caller value because no Fast capability has been validated. Exact model capability does not authorize foreign forwarding. Responses routes retain their capability-based caller forwarding behavior. | | `promptCacheKey?` | `boolean` | Provider-wide `openai-chat` opt-in for forwarding a `prompt_cache_key`. The adapter forwards the key it is given and never invents one, but the key is not always the caller's: Claude Messages translation derives one from `metadata.user_id`, or from a model/system/tools cohort when no metadata is sent. Default off. Enable only when the upstream documents support, because strict gateways may reject the unknown field with HTTP 400. | -| `preserveResponsesReasoningContent?` | `boolean` | Keep plaintext reasoning content on replayed Responses reasoning items instead of blanking it (blanking is the ChatGPT backend's rule). Enable for upstreams whose contract accepts reasoning replay, such as DeepSeek. Proxy-minted `ocxr1` envelopes are always stripped. | +| `preserveResponsesReasoningContent?` | `boolean` | Keep plaintext reasoning content on replayed Responses reasoning items instead of blanking it (blanking is the ChatGPT backend's rule). Enable for upstreams whose contract accepts reasoning replay, such as DeepSeek or a self-hosted Kimi on vLLM. Proxy-minted `ocxr1` envelopes are always stripped. A hand-configured `openai-responses` provider without it logs one warning per host the first time plaintext reasoning is dropped. `preserveReasoningContentModels` does not affect this wire. | | `preserveResponsesInputItemIds?` | `boolean` | Default off. Preserve valid `input[].id` when `store: false` for explicitly trusted launcher relays that require turn identity. Ordinary Responses providers keep stripping IDs; xAI custom-call ID repair remains active. | | `preserveResponsesMessageMetadata?` | `boolean` | Default off. Preserve private `internal_chat_message_metadata_passthrough` on input items for explicitly trusted launcher relays. This forwards private turn/session metadata to that destination; do not enable for ordinary gateways. | | `dropResponsesReasoningItems?` | `boolean` | Remove replayed Responses `reasoning` items from continuation input entirely, instead of forwarding them with blanked content. This is lossy: summaries, item ids, and `encrypted_content` go with them, so no reasoning item from the previous turn remains in the forwarded input. It does not remove `previous_response_id`, so an upstream holding its own turn state may still reach it. Enable only for an upstream that rejects reasoning replay outright — the built-in Volcengine Ark Coding Plan preset sets it because validated tool continuations answered `400 InvalidParameter` otherwise. Set it to `false` on that provider to forward reasoning items again. | diff --git a/src/adapters/openai-responses/passthrough.ts b/src/adapters/openai-responses/passthrough.ts index 4900ededa8d..2c02780a618 100644 --- a/src/adapters/openai-responses/passthrough.ts +++ b/src/adapters/openai-responses/passthrough.ts @@ -37,6 +37,7 @@ import { } from "../../providers/fastwire"; import { dropResponsesReasoningInputItems, mapRoutedResponsesReasoningEffort, normalizeConfiguredReasoningSummaryDelivery, sanitizeReasoningInputContent, stripDisabledReasoningSummaries, stripDisabledVerbosity, stripNoneReasoningSummary, stripUnsupportedReasoningSummaryDelivery } from "./reasoning"; import { scrubOcxCompactionItems, stripCanonicalOnlyToolFields, stripCanonicalOnlyTopLevelFields, stripInternalChatMessageMetadataPassthrough, stripInvalidItemIds, stripItemIdsWhenUnstored, stripRejectedSamplingParams } from "./request-strips"; +import { notePlaintextReasoningDropped } from "./plaintext-reasoning-notice"; import { stripCanonicalForwardPromptCacheOptions, stripDeprecatedPromptCacheRetention } from "./prompt-cache"; import { isPlainObject } from "./internal"; import { normalizeToolSchemas, promoteClientLoadedTools, stripUnsupportedHostedTools } from "./tool-schema"; @@ -505,6 +506,7 @@ export function createResponsesPassthroughAdapter(provider: OcxProviderConfig): stripEncryptedContent: threadServingIdentityChanged || requiresPlaintextReasoningReplay(provider), dropForeignItemId: parsed._dropForeignReasoningItemIds === true, requirePlaintextReasoning: requiresPlaintextReasoningReplay(provider), + onPlaintextReasoningBlanked: () => notePlaintextReasoningDropped(provider), }, ), provider, diff --git a/src/adapters/openai-responses/plaintext-reasoning-notice.ts b/src/adapters/openai-responses/plaintext-reasoning-notice.ts new file mode 100644 index 00000000000..762d70b20bf --- /dev/null +++ b/src/adapters/openai-responses/plaintext-reasoning-notice.ts @@ -0,0 +1,85 @@ +import { sanitizeLogMetadataString } from "../../lib/redact"; +import { isOpenAiOperatedResponsesDestination } from "../../providers/openai-tiers"; +import { normalizedProviderEndpoint, PROVIDER_REGISTRY } from "../../providers/registry"; +import type { OcxProviderConfig } from "../../types"; + +/** + * #6675: a custom Responses provider drops replayed plaintext reasoning unless it sets + * `preserveResponsesReasoningContent`. That default is deliberate (the ChatGPT backend rejects + * echoed raw reasoning, and forwarding it costs tokens), but it is silent, and the similarly named + * Chat-wire `preserveReasoningContentModels` does not opt in. Say so once per destination. + * + * Only a hand-configured `openai-responses` row with key auth qualifies. Registry presets (matched + * by endpoint on either OpenAI wire, since a preset may be routed to Responses per model), OAuth and + * forward rows, Azure, and OpenAI-operated destinations are skipped: their replay contract is + * curated, so blanking there is a decision rather than a missing setting. The notice carries only + * the destination host and option names, never request content. + */ +const MAX_NOTICED_DESTINATIONS = 64; +const noticedDestinations = new Set(); + +function destinationHost(baseUrl: unknown): string | undefined { + if (typeof baseUrl !== "string") return undefined; + try { + return sanitizeLogMetadataString(new URL(baseUrl).host, 128); + } catch { + return undefined; + } +} + +/** Azure OpenAI and Azure AI Foundry serve OpenAI-operated models under per-resource hosts. */ +const AZURE_OPENAI_HOST_SUFFIXES = [".openai.azure.com", ".services.ai.azure.com", ".cognitiveservices.azure.com"]; + +function hostnameOf(url: string): string | undefined { + try { + return new URL(url).hostname.toLowerCase(); + } catch { + return undefined; + } +} + +/** A templated preset (`https://{resource}.openai.azure.com/...`) matches by host pattern. */ +function templatedHostMatches(template: string, hostname: string): boolean { + const host = /^[a-z][a-z0-9+.-]*:\/\/([^/?#]+)/i.exec(template)?.[1]; + if (!host || !/\{[^}]*\}/.test(host)) return false; + const pattern = host.toLowerCase().split(/\{[^}]*\}/).map(part => part.replace(/[.*+?^$()|[\]\\]/g, "\\$&")).join("[^.]+"); + return new RegExp(`^${pattern}$`).test(hostname); +} + +function isRegistryDestination(baseUrl: string): boolean { + const endpoint = normalizedProviderEndpoint(baseUrl); + const hostname = hostnameOf(baseUrl); + if (hostname && AZURE_OPENAI_HOST_SUFFIXES.some(suffix => hostname.endsWith(suffix))) return true; + return PROVIDER_REGISTRY.some(entry => + normalizedProviderEndpoint(entry.baseUrl) === endpoint + || (hostname !== undefined && templatedHostMatches(entry.baseUrl, hostname)) + || (entry.destinationAliases ?? []).some(alias => normalizedProviderEndpoint(alias.baseUrl) === endpoint)); +} + +function isCustomResponsesProvider(provider: OcxProviderConfig): boolean { + if (provider.adapter !== "openai-responses") return false; + if (provider.authMode !== undefined && provider.authMode !== "key") return false; + if (typeof provider.baseUrl !== "string" || !provider.baseUrl) return false; + return !isOpenAiOperatedResponsesDestination(provider) && !isRegistryDestination(provider.baseUrl); +} + +export function plaintextReasoningDroppedNotice(host: string): string { + return `[opencodex] Replayed plaintext reasoning was dropped for the custom Responses provider at ${host}. ` + + "If that endpoint accepts reasoning_text replay, set \"preserveResponsesReasoningContent\": true on the provider; " + + "\"preserveReasoningContentModels\" applies only to the Chat wire."; +} + +export function notePlaintextReasoningDropped( + provider: OcxProviderConfig, + warn: (message: string) => void = message => console.warn(message), +): void { + if (!isCustomResponsesProvider(provider)) return; + const host = destinationHost(provider.baseUrl); + if (!host || noticedDestinations.has(host) || noticedDestinations.size >= MAX_NOTICED_DESTINATIONS) return; + noticedDestinations.add(host); + warn(plaintextReasoningDroppedNotice(host)); +} + +export function resetPlaintextReasoningNoticesForTests(): void { + noticedDestinations.clear(); +} diff --git a/src/adapters/openai-responses/reasoning.ts b/src/adapters/openai-responses/reasoning.ts index 5b79f9d7cec..1682d0dd247 100644 --- a/src/adapters/openai-responses/reasoning.ts +++ b/src/adapters/openai-responses/reasoning.ts @@ -78,6 +78,11 @@ export function sanitizeReasoningInputContent( * placeholder, rather than emitted in the shape the upstream 400s on. */ requirePlaintextReasoning?: boolean; + /** + * Called once per sanitized body when a reasoning item that carried nonempty plaintext + * `reasoning_text` was blanked. Observability only; it never changes the body (#6675). + */ + onPlaintextReasoningBlanked?: () => void; }, ): unknown { if (!body || typeof body !== "object" || Array.isArray(body)) return body; @@ -85,6 +90,7 @@ export function sanitizeReasoningInputContent( if (!Array.isArray(raw.input)) return body; let changed = false; + let blankedPlaintext = false; const input = raw.input.map(item => { if (!item || typeof item !== "object" || Array.isArray(item)) return item; const rec = item as Record; @@ -148,11 +154,15 @@ export function sanitizeReasoningInputContent( // guide merges reasoning items into the adjacent assistant message), so providers flagged // `preserveResponsesReasoningContent` keep it — deleting valid replay content there breaks // continuations after tool calls (issue #875 family). - if (blankContent) next.content = []; + if (blankContent) { + if (hasPlaintextReasoningContent(rec.content)) blankedPlaintext = true; + next.content = []; + } if (missingPlaintextReasoning) next.content = plaintextReasoningBackfill(next); return next; }); + if (blankedPlaintext) opts?.onPlaintextReasoningBlanked?.(); return changed ? { ...raw, input } : body; } diff --git a/tests/providers/deepseek-reasoning-replay.test.ts b/tests/providers/deepseek-reasoning-replay.test.ts index f77e9ac08d1..5c95b764320 100644 --- a/tests/providers/deepseek-reasoning-replay.test.ts +++ b/tests/providers/deepseek-reasoning-replay.test.ts @@ -6,8 +6,13 @@ * flagged `preserveResponsesReasoningContent` now keep valid replay content while * still stripping proxy-minted `ocxr1` envelopes no upstream can decrypt. */ -import { describe, expect, test } from "bun:test"; +import { afterEach, describe, expect, spyOn, test } from "bun:test"; import { createResponsesPassthroughAdapter as createResponsesPassthroughAdapterProduction, sanitizeReasoningInputContent } from "../../src/adapters/openai-responses"; +import { + notePlaintextReasoningDropped, + plaintextReasoningDroppedNotice, + resetPlaintextReasoningNoticesForTests, +} from "../../src/adapters/openai-responses/plaintext-reasoning-notice"; import { enrichProviderFromRegistry, providerConfigSeed } from "../../src/providers/derive"; import { getProviderRegistryEntry } from "../../src/providers/registry"; import { OCX_REASONING_PREFIX } from "../../src/responses/reasoning-envelope"; @@ -270,3 +275,76 @@ describe("DeepSeek Responses replay keeps reasoning on the wire", () => { expect(item.content).toEqual([]); }); }); + +// #6675: the default blanking stays, but a custom Responses provider is told once how to opt out. +describe("dropped plaintext reasoning notice", () => { + afterEach(() => resetPlaintextReasoningNoticesForTests()); + const customVllm = (): OcxProviderConfig => ({ adapter: "openai-responses", baseUrl: "http://gpu-box.local:8000/v1", apiKey: "k" } as OcxProviderConfig); + const buildBody = (provider: OcxProviderConfig): Record => { + const built = createResponsesPassthroughAdapter(provider).buildRequest({ + modelId: "kimi-k3", + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { model: "kimi-k3", input: [reasoningItem()] }, + } as Parameters["buildRequest"]>[0], { headers: new Headers() }); + return JSON.parse(String(built.body)) as Record; + }; + + test("the sanitizer reports blanking of nonempty plaintext only", () => { + let calls = 0; + const onPlaintextReasoningBlanked = () => { calls += 1; }; + sanitizeReasoningInputContent({ model: "m", input: [reasoningItem(), reasoningItem({ id: "rs_2" })] }, { onPlaintextReasoningBlanked }); + expect(calls).toBe(1); + sanitizeReasoningInputContent({ model: "m", input: [reasoningItem()] }, { preserveRawReasoningContent: true, onPlaintextReasoningBlanked }); + sanitizeReasoningInputContent({ model: "m", input: [reasoningItem({ content: [] })] }, { onPlaintextReasoningBlanked }); + sanitizeReasoningInputContent({ model: "m", input: [reasoningItem({ content: [{ type: "reasoning_text", text: "" }] })] }, { onPlaintextReasoningBlanked }); + expect(calls).toBe(1); + }); + + test("a custom destination is warned once, with no request content", () => { + const messages: string[] = []; + notePlaintextReasoningDropped(customVllm(), message => messages.push(message)); + notePlaintextReasoningDropped(customVllm(), message => messages.push(message)); + expect(messages).toEqual([plaintextReasoningDroppedNotice("gpu-box.local:8000")]); + expect(messages[0]).toContain("preserveResponsesReasoningContent"); + expect(messages[0]).not.toContain("think step by step"); + }); + + test("registry presets and OpenAI-operated destinations stay silent", () => { + const messages: string[] = []; + const warn = (message: string) => messages.push(message); + notePlaintextReasoningDropped({ ...providerConfigSeed(getProviderRegistryEntry("openai-apikey")!), apiKey: "sk-test" }, warn); + notePlaintextReasoningDropped({ ...providerConfigSeed(getProviderRegistryEntry("opengateway")!), adapter: "openai-responses", apiKey: "k" }, warn); + notePlaintextReasoningDropped({ adapter: "openai-responses", authMode: "forward", baseUrl: "https://chatgpt.com/backend-api/codex" } as OcxProviderConfig, warn); + notePlaintextReasoningDropped({ ...customVllm(), authMode: "oauth" } as OcxProviderConfig, warn); + notePlaintextReasoningDropped({ ...customVllm(), adapter: "openai-chat" } as OcxProviderConfig, warn); + // Hand-configured openai-responses rows pointing at Azure's per-resource hosts. + for (const baseUrl of [ + "https://contoso.openai.azure.com/openai/v1", + "https://contoso.services.ai.azure.com/openai/v1", + "https://contoso.cognitiveservices.azure.com/openai/v1", + ]) notePlaintextReasoningDropped({ ...customVllm(), baseUrl } as OcxProviderConfig, warn); + expect(messages).toEqual([]); + }); + + test("a lookalike host outside Azure is still treated as custom", () => { + const messages: string[] = []; + notePlaintextReasoningDropped({ ...customVllm(), baseUrl: "https://openai.azure.com.example.net/v1" } as OcxProviderConfig, message => messages.push(message)); + expect(messages).toHaveLength(1); + }); + + test("the passthrough serializer still blanks a custom provider's reasoning and emits the notice", () => { + const warnSpy = spyOn(console, "warn").mockImplementation(() => {}); + try { + const body = buildBody(customVllm()); + expect((body.input as Record[])[0]!.content).toEqual([]); + expect(warnSpy.mock.calls.map(call => String(call[0]))).toEqual([plaintextReasoningDroppedNotice("gpu-box.local:8000")]); + const preserved = buildBody({ ...customVllm(), baseUrl: "http://other-box.local/v1", preserveResponsesReasoningContent: true }); + expect((preserved.input as Record[])[0]!.content).toEqual([{ type: "reasoning_text", text: "think step by step" }]); + expect(warnSpy.mock.calls).toHaveLength(1); + } finally { + warnSpy.mockRestore(); + } + }); +}); From 77512080d818e371bd4338d1828db25587eae06e Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 19:31:42 +0900 Subject: [PATCH 10/25] fix(google): let the empty-completion retry replay a pre-output Vertex malformed call (#6881) * fix(google): let the empty-completion retry replay a pre-output Vertex malformed call (#6876) * fix(google): carry Vertex usage on truncation errors so a replay meters both attempts --- .../docs/reference/configuration/server.md | 2 +- src/adapters/google-truncation.ts | 22 +++++++ src/adapters/google.ts | 10 ++- .../responses/empty-completion-guard.ts | 20 +++++- src/types/request.ts | 5 ++ .../google/google-vertex-stream.test.ts | 28 ++++++++ .../empty-completion-hardening.test.ts | 65 +++++++++++++++++++ 7 files changed, 146 insertions(+), 6 deletions(-) diff --git a/docs-site/src/content/docs/reference/configuration/server.md b/docs-site/src/content/docs/reference/configuration/server.md index ad97ba0422c..e97b4eb3861 100644 --- a/docs-site/src/content/docs/reference/configuration/server.md +++ b/docs-site/src/content/docs/reference/configuration/server.md @@ -14,7 +14,7 @@ runs helper features around provider requests. | `hostname?` | `string` | `"127.0.0.1"` | Bind address. A non-loopback bind requires a data-admission token, resolved from `OPENCODEX_API_AUTH_TOKEN`, then `OCX_API_TOKEN_FILE`, then the installed owner-only `service-api-token` — nothing has to be exported by hand. See [Remote access](#remote-access). | | `proxy?` | `string` | — | Outbound HTTP(S) or SOCKS5 proxy URL (`socks5://host:port`), `${ENV_VAR}`, or `"auto"`. HTTP URLs apply to `HTTP_PROXY` / `HTTPS_PROXY` when those are unset. SOCKS5 URLs use OpenCodex's real SOCKS5 transport and are also exposed through `ALL_PROXY` (`ocx start --socks5`); inherited `HTTP(S)_PROXY` is cleared in this process. Loopback stays in `NO_PROXY`. `"auto"` reads Windows WinINET or macOS static HTTP/HTTPS settings once at startup. Inherited HTTP(S) proxy variables skip discovery; on macOS, inherited `ALL_PROXY`/`all_proxy` also skips it. Windows keeps separate `http=` and `https=` entries; a bare `ProxyServer` applies to both. macOS translates IP literals, `*`, and a valid `*.` glob to Bun's `.` bypass. That glob also bypasses the bare apex ``. The exact link-local ranges `169.254/16`, `169.254.0.0/16`, and `fe80::/10` are omitted with a diagnostic: link-local IP literals use the proxy. Other CIDRs, globs, and simple-host exceptions refuse discovery without changing the proxy environment. Disabled, malformed, PAC/WPAD, SOCKS-only, and live changes are not followed. Restart after changing system settings. | | `noProxy?` | `string \| string[]` | — | Hosts that bypass `proxy`, merged with inherited `NO_PROXY` and loopback entries. A string may use comma-separated `NO_PROXY` syntax or `${ENV_VAR}`. | -| `emptyCompletionRetry?` | `boolean` | `false` | Opt in to one identical Responses retry when a turn has no text or tool call, including a stream that ends before a terminal event. The retry may be billable. `OCX_EMPTY_COMPLETION_RETRY=0` disables it without changing config; combo and routed-compaction turns remain excluded. | +| `emptyCompletionRetry?` | `boolean` | `false` | Opt in to one identical Responses retry when a turn has no text or tool call, including a stream that ends before a terminal event and a Vertex AI `MALFORMED_FUNCTION_CALL` failure that arrives before any output. The retry may be billable. `OCX_EMPTY_COMPLETION_RETRY=0` disables it without changing config; combo and routed-compaction turns remain excluded. | | `dropCodexSafetyBuffering?` | `boolean` | `false` | Remove optional client-facing hints from canonical Codex Responses passthrough: the two `x-codex-safety-buffering-enabled` / `x-codex-safety-buffering-faster-model` response headers, `response.metadata` events whose metadata type is `safety_buffering`, and top-level `safety_buffering` fields. Other headers, response data, policy refusals and failures are preserved. This does not disable provider safety enforcement or upstream buffering. Native `codex.response.metadata.headers` WebSocket metadata and `/responses/compact` are outside this filter. | | `stallTimeoutSec?` | `number` | `300` (public) / disabled (local) | Seconds without meaningful upstream progress (Responses and native Chat) before the stream is cut. Unset, a **local** upstream (loopback, private, or a `.local`/`.lan` name) defaults to disabled and a public upstream to 300 s; a positive value applies to both (minimum 1 s); `0` disables the silence watchdog everywhere. Disabled leaves a silent-but-healthy local model connected (keep-alives still flow). Canonical ChatGPT Responses folded from SSE into non-streaming JSON retain a separate 15-minute whole-turn ceiling even when the silence watchdog is disabled. Pending `/v1/responses/compact` body reads share this budget but default to 300 s even for a local upstream — the route buffers the complete body while holding an active-turn lease — and an explicit value, including `0`, still wins. | | `oauthOpenBrowser?` | `boolean` | `true` | Whether a login may open a browser on the machine running the proxy. Absent and `true` both open, so an existing install is unchanged; only an explicit `false` declines. Decline when you need the authorization link in a different browser profile, or when the dashboard is not on the proxy's machine — the login still starts and the URL is still returned and displayed. `POST /api/oauth/login` and `POST /api/codex-auth/login` accept a per-request `openBrowser` boolean that overrides this, and the dashboard exposes the same choice beside the login button. Both routes report the outcome as `browserLaunch`: `started`, `failed` (nothing could be opened; the dashboard says so), or `skipped`. Device-code flows never open a browser either way. | diff --git a/src/adapters/google-truncation.ts b/src/adapters/google-truncation.ts index 5ac6de1cd9e..0e8739e5e1c 100644 --- a/src/adapters/google-truncation.ts +++ b/src/adapters/google-truncation.ts @@ -1,4 +1,5 @@ import { redactSecretString } from "../lib/redact"; +import type { AdapterEvent, OcxUsage } from "../types"; /** Gemini/Vertex finishReason values that mean the turn was cut off, not cleanly stopped. */ const TRUNCATION_REASONS = new Set(["MAX_TOKENS", "MALFORMED_FUNCTION_CALL"]); @@ -22,3 +23,24 @@ export function isVertexTruncatedTurn(finishReason: string | undefined, toolCall if (!isVertexTruncationReason(finishReason)) return false; return toolCallsStarted > 0 || finishReason === "MALFORMED_FUNCTION_CALL"; } + +/** + * The fail-closed terminal for a truncated Vertex turn. MALFORMED_FUNCTION_CALL with zero started + * calls means the model's only tool call was dropped upstream and nothing actionable was emitted, + * so the turn is marked replay-safe for the opt-in empty-completion guard (#6876). A truncation + * after a started call is never replay-safe: the client may already hold part of it. + * + * The reported usage rides on the error so a replayed turn meters both billable attempts. + */ +export function vertexTruncationErrorEvent( + finishReason: string | undefined, + toolCallsStarted: number, + usage?: OcxUsage, +): Extract { + return { + type: "error", + message: vertexTruncationErrorMessage(finishReason), + ...(usage ? { usage } : {}), + ...(finishReason === "MALFORMED_FUNCTION_CALL" && toolCallsStarted === 0 ? { replaySafeBeforeOutput: true } : {}), + }; +} diff --git a/src/adapters/google.ts b/src/adapters/google.ts index af0bd6a4504..df34d14a493 100644 --- a/src/adapters/google.ts +++ b/src/adapters/google.ts @@ -20,7 +20,7 @@ import { contentPartsToText, parseDataUrl } from "./image"; import { getVertexAccessToken } from "../lib/gcp-adc"; import { fetchAntigravityWithRetry, fetchVertexWithRetry } from "./google-http"; import { safeAntigravityHttpErrorMessage, safeVertexHttpErrorMessage } from "./google-errors"; -import { isVertexTruncatedTurn, vertexTruncationErrorMessage } from "./google-truncation"; +import { isVertexTruncatedTurn, vertexTruncationErrorEvent } from "./google-truncation"; import { ANTIGRAVITY_REQUEST_UA, antigravitySessionAnchor, antigravitySessionId, isLikelyRealThoughtSignature, sanitizeAntigravityClaudeSignatures } from "./google-antigravity-wire"; import { summarizeGoogleWireShape } from "./google-wire-shape"; import { compileGoogleWireBody } from "./google-wire-compiler"; @@ -1472,7 +1472,7 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte // an error instead of a silently-incomplete done. Mirrors kiro-truncation. if ((provider.googleMode === "vertex" || provider.googleMode === "cloud-code-assist") && isVertexTruncatedTurn(lastFinishReason, toolCallsStarted)) { - yield { type: "error", message: vertexTruncationErrorMessage(lastFinishReason) }; + yield vertexTruncationErrorEvent(lastFinishReason, toolCallsStarted, pendingUsage); return; } if (!sawAnyFrame || !sawTerminalSignal) { @@ -1687,7 +1687,11 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte // (MAX_TOKENS / MALFORMED_FUNCTION_CALL) surfaces an error instead of a silent done. if ((provider.googleMode === "vertex" || provider.googleMode === "cloud-code-assist") && isVertexTruncatedTurn(candidate.finishReason, toolCallsStarted)) { - return finish([{ type: "error", message: vertexTruncationErrorMessage(candidate.finishReason) }]); + return finish([vertexTruncationErrorEvent( + candidate.finishReason, + toolCallsStarted, + usageFromGemini(json.usageMetadata as Record | undefined), + )]); } const usage = json.usageMetadata as Record | undefined; diff --git a/src/server/responses/empty-completion-guard.ts b/src/server/responses/empty-completion-guard.ts index 10a1b563b72..6f94d3fa627 100644 --- a/src/server/responses/empty-completion-guard.ts +++ b/src/server/responses/empty-completion-guard.ts @@ -293,11 +293,27 @@ export async function* guardEmptyCompletionEventStream( return; } if (event.type === "error") { - if (retries > 0 && event.status !== 499) { + if (event.replaySafeBeforeOutput === true && retries < maxRetries) { + // The upstream failed the turn before any text or tool call (#6876: Vertex dropped a + // malformed function call). Nothing actionable reached the client, so this is the same + // replay-safe shape as an empty completion: retry the identical turn once. + usage = mergeUsage(usage, event.usage); + retries += 1; + try { + source = await options.continuation(); + } catch { + yield emptyCompletionRetryFailedEvent(usage, true); + return; + } + terminalSeen = true; + break; + } + if (retries > 0 && event.status !== 499 && event.replaySafeBeforeOutput !== true) { // The retry failed upstream. Its body cannot reach the client (the // 200 head went out with the first attempt), so state the failure in // the stream's own error framing — same move as the router's - // empty_completion_retry_failed. Client cancels (499) pass through. + // empty_completion_retry_failed. Client cancels (499) pass through, and a + // replay-safe failure that repeats keeps its own, more specific message. yield emptyCompletionRetryFailedEvent(mergeUsage(usage, event.usage), true); return; } diff --git a/src/types/request.ts b/src/types/request.ts index eca27f0d7db..d433b463294 100644 --- a/src/types/request.ts +++ b/src/types/request.ts @@ -442,6 +442,11 @@ export type AdapterEvent = errorType?: string; code?: string; retryable?: boolean; + /** + * Proxy-internal, never serialized: the upstream failed the turn before producing text or a + * tool call, so the opt-in empty-completion guard may replay the identical request once. + */ + replaySafeBeforeOutput?: boolean; }; /** diff --git a/tests/adapters/google/google-vertex-stream.test.ts b/tests/adapters/google/google-vertex-stream.test.ts index f965cb61324..361a46c228b 100644 --- a/tests/adapters/google/google-vertex-stream.test.ts +++ b/tests/adapters/google/google-vertex-stream.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from "bun:test"; import { createGoogleAdapter as createGoogleAdapterProduction } from "../../../src/adapters/google"; import { isVertexTruncatedTurn, isVertexTruncationReason, vertexTruncationErrorMessage } from "../../../src/adapters/google-truncation"; import { bridgeToResponsesSSE } from "../../../src/bridge"; +import { guardEmptyCompletionEventStream } from "../../../src/server/responses/empty-completion-guard"; import type { AdapterEvent, OcxProviderConfig } from "../../../src/types"; import { withTestTranslatorBudget } from "../../helpers/translator-budget"; @@ -50,6 +51,17 @@ describe("vertex parseStream fail-closed truncation", () => { const last = events[events.length - 1]; expect(last.type).toBe("error"); expect(events.some(e => e.type === "done")).toBe(false); + // A started call may already be in the client's hands, so this is never replayed. + expect(last).not.toHaveProperty("replaySafeBeforeOutput"); + }); + + test("a truncation after a started tool call is never marked replay-safe", async () => { + const events = await collect(vertexProvider, [ + { candidates: [{ content: { parts: [{ functionCall: { name: "get_x", args: {} } }] }, finishReason: "MALFORMED_FUNCTION_CALL" }] }, + ]); + const last = events[events.length - 1]; + expect(last.type).toBe("error"); + expect(last).not.toHaveProperty("replaySafeBeforeOutput"); }); test("clean STOP stream yields done with reported usage", async () => { @@ -94,6 +106,21 @@ describe("vertex parseStream fail-closed truncation", () => { const last = events[events.length - 1]; expect(last.type).toBe("error"); expect(events.some(e => e.type === "done")).toBe(false); + // #6876: nothing actionable was emitted, so the opt-in empty-completion guard may replay it. + expect(last).toMatchObject({ type: "error", replaySafeBeforeOutput: true, usage: { inputTokens: 5, outputTokens: 0 } }); + }); + + test("the guard replays a real pre-output malformed turn and meters both attempts", async () => { + const first = createGoogleAdapter(vertexProvider).parseStream(sseResponse([ + { candidates: [{ finishReason: "MALFORMED_FUNCTION_CALL" }], usageMetadata: { promptTokenCount: 5, candidatesTokenCount: 0 } }, + ])); + const retry = createGoogleAdapter(vertexProvider).parseStream(sseResponse([ + { candidates: [{ content: { parts: [{ text: "ok" }] }, finishReason: "STOP" }], usageMetadata: { promptTokenCount: 5, candidatesTokenCount: 1 } }, + ])); + const events: AdapterEvent[] = []; + for await (const event of guardEmptyCompletionEventStream({ firstEvents: first, continuation: () => retry })) events.push(event); + expect(events.some(e => e.type === "error")).toBe(false); + expect(events.at(-1)).toMatchObject({ type: "done", usage: { inputTokens: 10, outputTokens: 1 } }); }); test("usage-only final chunk (no candidates) is not dropped", async () => { @@ -123,6 +150,7 @@ describe("vertex parseResponse fail-closed truncation (non-streaming)", () => { const events = await adapter.parseResponse!(new Response(body, { status: 200 })); expect(events[events.length - 1].type).toBe("error"); expect(events.some(e => e.type === "done")).toBe(false); + expect(events[events.length - 1]).toMatchObject({ replaySafeBeforeOutput: true, usage: { inputTokens: 5, outputTokens: 0 } }); }); test("clean STOP non-stream response yields done", async () => { diff --git a/tests/responses/empty-completion-hardening.test.ts b/tests/responses/empty-completion-hardening.test.ts index d41dd6a299d..41f4cf4f874 100644 --- a/tests/responses/empty-completion-hardening.test.ts +++ b/tests/responses/empty-completion-hardening.test.ts @@ -17,6 +17,71 @@ function eventsOf(...items: AdapterEvent[]): AsyncIterable { } describe("empty-completion guard hardening", () => { + // #6876: Vertex fails a turn with MALFORMED_FUNCTION_CALL after dropping the model's only call. + const malformed = (usage?: { inputTokens: number; outputTokens: number }): AdapterEvent => ({ + type: "error", + message: "Vertex AI response truncated upstream before the turn completed (MALFORMED_FUNCTION_CALL)", + replaySafeBeforeOutput: true, + ...(usage ? { usage } : {}), + }); + + test("a replay-safe error before any output retries the identical turn once", async () => { + let continuations = 0; + const events = await collect(guardEmptyCompletionEventStream({ + firstEvents: eventsOf({ type: "thinking_delta", thinking: "plan" }, malformed({ inputTokens: 10, outputTokens: 0 })), + continuation: () => { + continuations += 1; + return eventsOf({ type: "text_delta", text: "answer" }, { type: "done", usage: { inputTokens: 10, outputTokens: 3 } }); + }, + })); + expect(continuations).toBe(1); + expect(events.some(event => event.type === "error")).toBe(false); + expect(events.at(-1)).toMatchObject({ type: "done", usage: { inputTokens: 20, outputTokens: 3 } }); + }); + + test("a replay-safe error that repeats surfaces its own message after one retry", async () => { + let continuations = 0; + const events = await collect(guardEmptyCompletionEventStream({ + firstEvents: eventsOf(malformed({ inputTokens: 10, outputTokens: 0 })), + continuation: () => { + continuations += 1; + return eventsOf(malformed({ inputTokens: 10, outputTokens: 0 })); + }, + })); + expect(continuations).toBe(1); + expect(events.at(-1)).toMatchObject({ + type: "error", + message: expect.stringContaining("MALFORMED_FUNCTION_CALL"), + usage: { inputTokens: 20, outputTokens: 0 }, + }); + }); + + test("a replay-safe error after output passes through without a retry", async () => { + let continuations = 0; + const events = await collect(guardEmptyCompletionEventStream({ + firstEvents: eventsOf({ type: "text_delta", text: "partial" }, malformed()), + continuation: () => { + continuations += 1; + return eventsOf({ type: "done" }); + }, + })); + expect(continuations).toBe(0); + expect(events.map(event => event.type)).toEqual(["text_delta", "error"]); + }); + + test("an ordinary pre-output error is still not retried", async () => { + let continuations = 0; + const events = await collect(guardEmptyCompletionEventStream({ + firstEvents: eventsOf({ type: "error", message: "upstream 500", status: 500 }), + continuation: () => { + continuations += 1; + return eventsOf({ type: "done" }); + }, + })); + expect(continuations).toBe(0); + expect(events.at(-1)).toMatchObject({ type: "error", message: "upstream 500" }); + }); + test("usage keeps the retry's absolute context checkpoint without summing it", async () => { const events = await collect(guardEmptyCompletionEventStream({ firstEvents: eventsOf( From 71adcc1a228d8ef2e47c667ace508c9f4a38c2c3 Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 19:31:46 +0900 Subject: [PATCH 11/25] fix(server): release inbound body admission when the client disconnects (#6883) A raised inbound body reservation was released only on response EOF/error, a settled explicit cancel or a thrown handler error. If the client aborted and the response was never consumed, the reservation stayed held and later covered POSTs got 503 capacity exhausted until restart. Observe the request abort signal once work returns, cancel the producer through the shared idempotent path, and release once after cancellation settles. Closes #6793. --- .../docs/reference/inbound-body-admission.md | 6 +- src/server/inbound-body-admission.ts | 31 +++-- structure/transports/byte-accounting.md | 4 +- tests/server/server-request-body-size.test.ts | 106 ++++++++++++++++++ 4 files changed, 137 insertions(+), 10 deletions(-) diff --git a/docs-site/src/content/docs/reference/inbound-body-admission.md b/docs-site/src/content/docs/reference/inbound-body-admission.md index 862d183b82d..b09e56d50fa 100644 --- a/docs-site/src/content/docs/reference/inbound-body-admission.md +++ b/docs-site/src/content/docs/reference/inbound-body-admission.md @@ -16,6 +16,8 @@ such request runs at a time, including when multiple listeners share a process. reserve the full allowance; neither a small Content-Length nor compression bypasses admission. The reservation remains until the response stream ends, fails, or finishes cancellation, rather than ending as soon as the request JSON has been parsed. +A client disconnect releases the reservation after producer cancellation settles; limits above +256 MiB admit one covered request at a time regardless of `appOwnedMemoryBudgetMb`. The covered POST endpoints are `/v1/responses`, `/v1/responses/compact`, `/v1/chat/completions`, `/v1/messages`, `/v1/messages/count_tokens`, @@ -36,8 +38,8 @@ receive an Anthropic-shaped error with type `overloaded_error`; OpenAI-compatibl backoff. Increasing the body limit further does not resolve a busy allowance. A body larger than its per-request limit still follows the existing HTTP **413** handling. -A declared oversize keeps that path instead of becoming a busy refusal. A disconnect retains the -existing cancellation behavior. Authentication and origin checks run before this concurrency gate. +A declared oversize keeps that path instead of becoming a busy refusal. +Authentication and origin checks run before this concurrency gate. ## What the budget measures diff --git a/src/server/inbound-body-admission.ts b/src/server/inbound-body-admission.ts index 8f4ac6b7c80..a35e5faabfc 100644 --- a/src/server/inbound-body-admission.ts +++ b/src/server/inbound-body-admission.ts @@ -71,20 +71,37 @@ function capacityResponse(pathname: string, error: InboundBodyCapacityError): Re }, { status: 503, headers: { "Retry-After": "1" } }); } -function retainUntilResponseSettles(response: Response, release: () => void): Response { +function retainUntilResponseSettles(response: Response, signal: AbortSignal, release: () => void): Response { if (!response.body) { release(); return response; } const reader = response.body.getReader(); let cancelling = false; + let cancellation: Promise | undefined; let finalized = false; + let bodyController!: ReadableStreamDefaultController; + const onAbort = (): void => { + if (finalized) return; + bodyController.error(signal.reason); + void cancel(signal.reason).catch(() => undefined); + }; const finalize = (): void => { if (finalized) return; finalized = true; + signal.removeEventListener("abort", onAbort); try { reader.releaseLock(); } finally { release(); } }; + const cancel = (reason: unknown): Promise => { + if (cancellation) return cancellation; + if (finalized) return Promise.resolve(); + cancelling = true; + // Share one settlement even if explicit cancellation races request abort. + cancellation = Promise.resolve().then(() => reader.cancel(reason)).finally(finalize); + return cancellation; + }; const body = new ReadableStream({ + start(controller) { bodyController = controller; }, async pull(controller) { try { const result = await reader.read(); @@ -103,18 +120,18 @@ function retainUntilResponseSettles(response: Response, release: () => void): Re controller.error(error); } }, - async cancel(reason) { - cancelling = true; - try { await reader.cancel(reason); } finally { finalize(); } - }, + cancel, }, { highWaterMark: 0 }); // This is the outermost HTTP wrapper, after protocol conversion, relay // preflight and request logging; no internal relay marker is consumed later. - return new Response(body, { + const wrapped = new Response(body, { status: response.status, statusText: response.statusText, headers: response.headers, }); + signal.addEventListener("abort", onAbort, { once: true }); + if (signal.aborted) onAbort(); + return wrapped; } /** @@ -155,7 +172,7 @@ export async function withRaisedInboundBodyAdmission( reservedInboundBodyBytes -= maxBytes; }; try { - return retainUntilResponseSettles(await work(), release); + return retainUntilResponseSettles(await work(), req.signal, release); } catch (error) { release(); throw error; diff --git a/structure/transports/byte-accounting.md b/structure/transports/byte-accounting.md index 7ad5bde0a67..15a587e9940 100644 --- a/structure/transports/byte-accounting.md +++ b/structure/transports/byte-accounting.md @@ -43,7 +43,9 @@ An already-aborted request or explicitly oversized declaration keeps the existin The lease covers upload, parsing, downstream awaits and response consumption. It is released on response EOF/error or after producer cancellation settles, not when parsing or response headers -complete. A pending read resolving as EOF during cancellation does not release it early. The +complete. Request abort after work returns cancels the producer even if the response is unconsumed; +abort during work waits for its response before cancelling. Abort and explicit cancellation share +one settlement/finalizer, which removes the abort listener. A pending read resolving as EOF during cancellation does not release it early. The outermost response wrapper preserves bytes and metadata and adds no eager pull. Internal direct combo/translation calls share their HTTP owner's reservation rather than reserving again. diff --git a/tests/server/server-request-body-size.test.ts b/tests/server/server-request-body-size.test.ts index 81ba9ac3821..cd1dfdab0db 100644 --- a/tests/server/server-request-body-size.test.ts +++ b/tests/server/server-request-body-size.test.ts @@ -275,6 +275,112 @@ describe("raised inbound body admission lifetime", () => { await assertBodyCapacity(204); }); + for (const rejects of [false, true]) { + test(`request abort cancels an unconsumed response and waits for settlement (rejects=${rejects})`, async () => { + const abort = new AbortController(); + const finishCancel = bodyDeferred(); + const reason = new Error("fixture request abort"); + let cancelledWith: unknown; + let cancellations = 0; + let pulls = 0; + const response = await admittedBodyWork(async () => new Response(new ReadableStream({ + pull() { pulls++; }, + async cancel(value) { + cancellations++; + cancelledWith = value; + await finishCancel.promise; + if (rejects) throw new Error("fixture producer cancellation failure"); + }, + }, { highWaterMark: 0 })), admissionRequest("/v1/responses", "{}", { signal: abort.signal })); + try { + await assertBodyCapacity(503); + abort.abort(reason); + await assertBodyCapacity(503); + assert.equal(cancellations, 1); + assert.equal(cancelledWith, reason); + assert.equal(pulls, 0); + assert.equal(response.bodyUsed, false); + finishCancel.resolve(); + await Bun.sleep(0); // Let cancellation and the admission finalizer settle. + await assertBodyCapacity(204); + } finally { + finishCancel.resolve(); + await response.body?.cancel().catch(() => undefined); + } + }); + } + + test("request abort during work cancels its eventual body before releasing capacity", async () => { + const abort = new AbortController(); + const started = bodyDeferred(); + const complete = bodyDeferred(); + const finishCancel = bodyDeferred(); + let cancellations = 0; + const first = admittedBodyWork(async () => { + started.resolve(); + await complete.promise; + return new Response(new ReadableStream({ + cancel() { cancellations++; return finishCancel.promise; }, + }, { highWaterMark: 0 })); + }, admissionRequest("/v1/responses", "{}", { signal: abort.signal })); + try { + await started.promise; + abort.abort(); + await assertBodyCapacity(503); + assert.equal(cancellations, 0); + complete.resolve(); + await first; + await assertBodyCapacity(503); + assert.equal(cancellations, 1); + finishCancel.resolve(); + await Bun.sleep(0); + await assertBodyCapacity(204); + } finally { + complete.resolve(); + finishCancel.resolve(); + await (await first).body?.cancel().catch(() => undefined); + } + }); + + for (const abortFirst of [false, true]) { + test(`request abort and explicit cancel release exactly once (abortFirst=${abortFirst})`, async () => { + const abort = new AbortController(); + const finishCancel = bodyDeferred(); + const reason = new Error("fixture request abort race"); + let cancellations = 0; + let cancelledWith: unknown; + const response = await admittedBodyWork(async () => new Response(new ReadableStream({ + cancel(value) { + cancellations++; + cancelledWith = value; + return finishCancel.promise; + }, + }, { highWaterMark: 0 })), admissionRequest("/v1/responses", "{}", { signal: abort.signal })); + let next: Response | undefined; + try { + if (abortFirst) abort.abort(reason); + const cancelled = response.body!.cancel("fixture explicit cancel").catch(error => error); + if (!abortFirst) abort.abort(reason); + await assertBodyCapacity(503); + assert.equal(cancellations, 1); + assert.equal(cancelledWith, abortFirst ? reason : "fixture explicit cancel"); + finishCancel.resolve(); + await cancelled; + await Bun.sleep(0); + await assertBodyCapacity(204); + next = await admittedBodyWork(async () => new Response("next reservation")); + assert.equal(next.status, 200); + await assertBodyCapacity(503); // A double release would admit this peer. + assert.equal(cancellations, 1); + } finally { + finishCancel.resolve(); + await response.body?.cancel().catch(() => undefined); + await next?.body?.cancel(); + } + await assertBodyCapacity(204); + }); + } + test("preserves pre-aborted requests' existing error path", async () => { const holder = await admittedBodyWork(async () => new Response("held")); const abort = new AbortController(); From 6c826bdad2094507442cda882c93083ee3c9e18d Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 19:31:49 +0900 Subject: [PATCH 12/25] fix(logs): attribute proxy replay refusals as transport-ambiguous (#6887) A synthetic 429 upstream_reset_replay_refused was attributed like a provider throttle (rate-limit/permitted) because attribution treated every 429 as a rate limit. Read the in-process replay-refusal marker in the deferred logger and carry a synthetic transport-ambiguous cause hint into final request and attempt attribution. Client-visible refusal behavior is unchanged. Closes #6658. --- .../src/content/docs/guides/web-dashboard.md | 5 + src/server/relay.ts | 7 +- src/server/request-log-failure-attribution.ts | 3 + src/server/request-log.ts | 14 +- structure/overview.md | 4 + .../responses-translated-reset.test.ts | 126 +++++++++++++++++- 6 files changed, 150 insertions(+), 9 deletions(-) diff --git a/docs-site/src/content/docs/guides/web-dashboard.md b/docs-site/src/content/docs/guides/web-dashboard.md index d42c5a03bb1..0ccf0eeaf70 100644 --- a/docs-site/src/content/docs/guides/web-dashboard.md +++ b/docs-site/src/content/docs/guides/web-dashboard.md @@ -143,6 +143,11 @@ timer. Requests already sent upstream retain their original credentials. ### Filtering request logs +A proxy replay refusal keeps HTTP 429 and error code `upstream_reset_replay_refused`, but +its request and attempt failure cause is `transport-ambiguous`, with resend permission +`refused-ambiguous`: the upstream may already have processed the turn. A genuine provider +429 remains `rate-limit` with resend permission `permitted`. + Logs filters combine surface, intercepted requests, provider, exact model, status, time, speed, and conversation ID over the currently loaded request ring. Provider and model choices also include fallback attempts; model matching ignores case and surrounding spaces diff --git a/src/server/relay.ts b/src/server/relay.ts index 0c6d10218f3..54ceb711530 100644 --- a/src/server/relay.ts +++ b/src/server/relay.ts @@ -12,7 +12,7 @@ import { } from "../lib/errors"; import { redactSecretString } from "../lib/redact"; import { isTranslatorBudgetExceededError } from "../lib/translator-budget"; -import { carryReplayRefusal } from "../lib/upstream-retry"; +import { carryReplayRefusal, isReplayRefusalResponse } from "../lib/upstream-retry"; import { isUsageDebugEnabled } from "../usage/debug"; import { addRequestLog, @@ -898,6 +898,11 @@ export function responseWithDeferredRequestLog( logCtx: RequestLogContext, addLog: (entry: RequestLogEntry) => void = addRequestLog, ): Response { + // A synthetic 429 is a transport verdict, not evidence that the provider declined the turn. + if (isReplayRefusalResponse(response)) { + logCtx.causeHint = "transport-ambiguous"; + logCtx.terminalSource = "synthetic"; + } const contentType = response.headers.get("content-type")?.toLowerCase() ?? ""; if (isUsageDebugEnabled() && !logCtx.usageDebugContentType && contentType) { logCtx.usageDebugContentType = contentType; diff --git a/src/server/request-log-failure-attribution.ts b/src/server/request-log-failure-attribution.ts index 9a22e0ba8bb..291634b4098 100644 --- a/src/server/request-log-failure-attribution.ts +++ b/src/server/request-log-failure-attribution.ts @@ -21,6 +21,8 @@ export interface FinalRequestAttributionFacts { readonly closeReason?: "terminal" | "client_cancel" | "non_stream" | "body_stall" | "body_overflow" | undefined; readonly transportPhase?: "pre_headers" | "mid_stream" | "terminal_sse" | undefined; readonly terminalSource?: "upstream" | "synthetic" | undefined; + /** A failure cause proved by the transport's in-process verdict. */ + readonly causeHint?: RequestFailureCause | undefined; /** The REQUEST's first-output observation, not the final attempt's. See below. */ readonly outputObserved: boolean; readonly locallyAnswered: boolean; @@ -53,6 +55,7 @@ export function attributeFinalRequest(facts: FinalRequestAttributionFacts): Stam ...(facts.closeReason ? { closeReason: facts.closeReason } : {}), ...(facts.transportPhase ? { transportPhase: facts.transportPhase } : {}), ...(facts.terminalSource ? { terminalSource: facts.terminalSource } : {}), + ...(facts.causeHint ? { causeHint: facts.causeHint } : {}), ...(facts.attempt?.streamAborted === true ? { streamAborted: true } : {}), outputObserved: facts.outputObserved, // The one fact that can raise a stage above `semantic-output`, and the reason it is counted diff --git a/src/server/request-log.ts b/src/server/request-log.ts index 5d98fb8ca0a..7a90a59fc3f 100644 --- a/src/server/request-log.ts +++ b/src/server/request-log.ts @@ -256,6 +256,8 @@ export interface RequestLogContext { conversationStateScrub?: "account-change"; transportPhase?: "pre_headers" | "mid_stream" | "terminal_sse"; terminalSource?: "upstream" | "synthetic"; + /** Closed failure evidence supplied by the transport, never inferred from provider text. */ + causeHint?: RequestFailureCause; /** Bounded route-decision trace (RI-01); never contains secrets. */ routeDecision?: RouteDecisionTraceV1; /** Full eligible provider/model membership from a policy route; never logged. */ @@ -844,6 +846,7 @@ export function requestLogErrorCode( status: number, upstreamError?: string, terminalErrorCode?: string, + replayRefusal = false, ): string | undefined { if (status >= 200 && status < 400) return undefined; // A structured terminal code is authoritative even when the provider message is localized, @@ -872,10 +875,8 @@ export function requestLogErrorCode( return "permission_denied"; } if (status === 429) { - // A refused ambiguous reset answers 429 by design (it must not invite a client - // retry that could duplicate inference); classify it by its message so the log - // distinguishes a proxy refusal from provider throttling. - if (upstreamError?.trim() && isUpstreamResetReplayRefusedMessage(upstreamError)) { + // Prefer transport provenance; retain the legacy message fallback for older callers. + if (replayRefusal || (upstreamError?.trim() && isUpstreamResetReplayRefusedMessage(upstreamError))) { return UPSTREAM_RESET_REPLAY_REFUSED_CODE; } return "rate_limit_exceeded"; @@ -1467,12 +1468,12 @@ export function addFinalRequestLog( const effectiveStatus = status >= 500 && logCtx.upstreamError && isClientClosedMessage(logCtx.upstreamError) ? 499 : status; - // A locally assigned code wins: it names a refusal this proxy made itself, which no - // status-plus-upstream-message classification can reconstruct. + // Locally assigned codes name proxy refusals that status and upstream text cannot reconstruct. const errorCode = logCtx.errorCode ?? requestLogErrorCode( effectiveStatus, logCtx.upstreamError, logCtx.terminalErrorCode, + logCtx.causeHint === "transport-ambiguous" && logCtx.terminalSource === "synthetic", ); // A response.failed whose classified status is 499 is still a client cancel, not an upstream // terminal failure — keep /api/logs closeReason aligned with that. @@ -1502,6 +1503,7 @@ export function addFinalRequestLog( ...(logCtx.transportPhase ? { transportPhase: logCtx.transportPhase } : {}), ...(logCtx.terminalSource ? { terminalSource: logCtx.terminalSource } : {}), outputObserved: logCtx.firstOutputMs !== undefined, + ...(logCtx.causeHint ? { causeHint: logCtx.causeHint } : {}), locallyAnswered: logCtx.localTerminalReason !== undefined, ...(logCtx.activeAttempt ? { attempt: logCtx.activeAttempt } : {}), }); diff --git a/structure/overview.md b/structure/overview.md index 04d29251f54..755df7c0f40 100644 --- a/structure/overview.md +++ b/structure/overview.md @@ -171,6 +171,10 @@ still cover the rule, which is a judgement only review makes. are assembled partly from upstream text. An unknown upstream execution state is attributed to a cause that refuses an automatic resend rather than to one that permits it, and the resend verdict the pair implies is computed at read time and never persisted. + A proxy replay refusal is one such fact: the deferred logger in `src/server/relay.ts` reads the + in-process `isReplayRefusalResponse` marker and passes a synthetic `transport-ambiguous` cause + hint, so its 429 keeps the `upstream_reset_replay_refused` code but is never attributed as a + provider rate limit; refusal-like provider text alone cannot establish it. Enforced by `tests/lib/failure-attribution.test.ts`. - **INV-RESEND-02** — One logical request holds one operator-granted replacement for an ambiguous failure, however many stages ask for it. `src/lib/request-resend-gate.ts` is the only place diff --git a/tests/responses/responses-translated-reset.test.ts b/tests/responses/responses-translated-reset.test.ts index 545245da5ad..5151d68b15e 100644 --- a/tests/responses/responses-translated-reset.test.ts +++ b/tests/responses/responses-translated-reset.test.ts @@ -7,13 +7,15 @@ import { saveCredential, getAccountSet, setActiveAccount } from "../../src/oauth import { clearGenericFailoverHealth } from "../../src/oauth/generic-account-failover"; import { rememberResponseState, clearResponseStateForTests } from "../../src/responses/state"; import { admitWorkflowTurn, workflowBudgetSnapshot, resetWorkflowBudgetsForTest } from "../../src/lib/workflow-budget"; -import type { RequestLogContext } from "../../src/server/request-log"; +import { beginRequestAttempt, type RequestLogContext, type RequestLogEntry } from "../../src/server/request-log"; import type { HandleResponsesOptions } from "../../src/server/responses/core-options"; import { handleResponses } from "../../src/server/responses"; import { createRequestExecutionBudget } from "../../src/lib/request-execution-budget"; import type { OcxConfig, OcxProviderConfig } from "../../src/types"; import { acquireOwnedSpendHome } from "../helpers/owned-spend-home"; -import { isNonReplayableResponse, isReplayRefusalResponse, markResponseNonReplayable, replayRefusalResponse } from "../../src/lib/upstream-retry"; +import { isNonReplayableResponse, isReplayRefusalResponse, markResponseNonReplayable, replayRefusalResponse, retainReplayRefusal } from "../../src/lib/upstream-retry"; +import { requestLogDto } from "../../src/server/management/shared"; +import { responseWithDeferredRequestLog } from "../../src/server/relay"; import { sanitizeNonReplayableUpstreamError } from "../../src/server/responses/non-replayable-error"; async function probe(options: { @@ -599,3 +601,123 @@ describe("translated reset replay boundaries and accounting", () => { } }); }); + +function tracked(response: Response) { + const attempt = beginRequestAttempt(1, "fixture-provider", "fixture-model", "openai-responses"); + const logCtx: RequestLogContext = { + model: "fixture-model", provider: "fixture-provider", activeAttempt: attempt, attempts: [attempt], + }; + const entries: RequestLogEntry[] = []; + const result = responseWithDeferredRequestLog(response, "ocx-replay-attribution", Date.now(), logCtx, + entry => entries.push(entry)); + return { result, entries, logCtx, attempt }; +} + +function expectAttribution(entry: RequestLogEntry, cause: string, permission: string) { + expect(entry.failureCause).toBe(cause); + expect(entry.attempts?.at(-1)?.failureCause).toBe(cause); + const dto = requestLogDto(entry); + expect(dto.resendPermission).toBe(permission); + expect((dto.attempts as Record[]).at(-1)?.resendPermission).toBe(permission); +} + +describe("deferred replay refusal attribution", () => { + test("synthetic refusal records ambiguous execution without changing the client response", async () => { + const original = replayRefusalResponse(); + const payload = await original.clone().text(); + const { result, entries, attempt } = tracked(original); + expect(entries).toHaveLength(0); + expect(result.status).toBe(429); + expect([...result.headers]).toEqual([...original.headers]); + expect(result.headers.get("x-should-retry")).toBe("false"); + expect(result.headers.get("retry-after")).toBeNull(); + expect(isReplayRefusalResponse(result)).toBe(true); + expect(await result.text()).toBe(payload); + expect(entries).toHaveLength(1); + const entry = entries[0]!; + expectAttribution(entry, "transport-ambiguous", "refused-ambiguous"); + expect(entry.status).toBe(429); + expect(entry.terminalSource).toBe("synthetic"); + expect(entry.errorCode).toBe("upstream_reset_replay_refused"); + expect(attempt.errorCode).toBe("upstream_reset_replay_refused"); + }); + + test("marker wins when the refusal message is unfamiliar", async () => { + const payload = JSON.stringify({ error: { message: "Fixture diagnostic without replay keywords" } }); + const { result, entries } = tracked(retainReplayRefusal(new Response(payload, { + status: 429, headers: { "content-type": "application/json" }, + }))); + expect(await result.text()).toBe(payload); + expect(entries).toHaveLength(1); + expectAttribution(entries[0]!, "transport-ambiguous", "refused-ambiguous"); + expect(entries[0]!.errorCode).toBe("upstream_reset_replay_refused"); + expect(entries[0]!.terminalSource).toBe("synthetic"); + }); + + test("a bodyless marked refusal still supplies closed attribution facts", () => { + const original = retainReplayRefusal(new Response(null, { status: 429 })); + const { result, entries } = tracked(original); + expect(result).toBe(original); + expect(entries).toHaveLength(1); + expectAttribution(entries[0]!, "transport-ambiguous", "refused-ambiguous"); + expect(entries[0]!.errorCode).toBe("upstream_reset_replay_refused"); + expect(entries[0]!.terminalSource).toBe("synthetic"); + }); + + test("an empty marked refusal supplies attribution without JSON diagnostics", async () => { + const { result, entries } = tracked(retainReplayRefusal(new Response("", { + status: 429, headers: { "content-type": "application/json" }, + }))); + expect(await result.text()).toBe(""); + expect(entries).toHaveLength(1); + expectAttribution(entries[0]!, "transport-ambiguous", "refused-ambiguous"); + expect(entries[0]!.errorCode).toBe("upstream_reset_replay_refused"); + expect(entries[0]!.terminalSource).toBe("synthetic"); + }); + + test("unmarked upstream refusal wording cannot prove an ambiguous transport failure", async () => { + const payload = JSON.stringify({ error: { + code: "upstream_reset_replay_refused", + message: "The upstream exchange did not complete reliably. The request may already have been processed; automatic replay was stopped.", + } }); + const { result, entries, logCtx } = tracked(new Response(payload, { + status: 429, headers: { "content-type": "application/json", "retry-after": "7" }, + })); + expect(isReplayRefusalResponse(result)).toBe(false); + expect(result.status).toBe(429); + expect(result.headers.get("retry-after")).toBe("7"); + expect(await result.text()).toBe(payload); + expect(entries).toHaveLength(1); + expect(logCtx.causeHint).toBeUndefined(); + expect(entries[0]!.terminalSource).toBeUndefined(); + expectAttribution(entries[0]!, "rate-limit", "permitted"); + }); + + for (const code of ["rate_limit_exceeded", "upstream_reset_replay_refused"]) { + test(`genuine upstream 429 remains a rate limit even with code ${code}`, async () => { + const payload = JSON.stringify({ error: { code, message: "Fixture provider throttled" } }); + const original = new Response(payload, { + status: 429, headers: { "content-type": "application/json", "retry-after": "7" }, + }); + const { result, entries, logCtx } = tracked(original); + expect(isReplayRefusalResponse(result)).toBe(false); + expect(result.status).toBe(429); + expect(result.headers.get("retry-after")).toBe("7"); + expect(await result.text()).toBe(payload); + expect(entries).toHaveLength(1); + expect(entries[0]!.errorCode).toBe("rate_limit_exceeded"); + expect(entries[0]!.terminalSource).toBeUndefined(); + expect(logCtx.causeHint).toBeUndefined(); + expectAttribution(entries[0]!, "rate-limit", "permitted"); + }); + } + + test("client cancellation retains precedence over a marked refusal", async () => { + const { result, entries } = tracked(replayRefusalResponse()); + await result.body!.cancel(); + expect(entries).toHaveLength(1); + expect(entries[0]!.status).toBe(499); + expect(entries[0]!.errorCode).toBe("client_closed_request"); + expectAttribution(entries[0]!, "client-cancelled", "refused-futile"); + }); +}); From 17dbbac08dcb7697f287561ffaa5db31e22443a8 Mon Sep 17 00:00:00 2001 From: JUN Date: Sat, 10 Oct 2026 19:31:53 +0900 Subject: [PATCH 13/25] docs(devlog): archive 205 landed units from _plan to _fin (#6884) --- .../260819_next_roadmap/000_roadmap.md | 0 .../010_r1_split_rebase.md | 0 .../020_r2_temp_reclaim_merge.md | 0 .../030_r3_collisions_and_retargets.md | 0 .../031_r3_posted_decisions.md | 0 .../040_r4_modelrecordvalue_batch.md | 0 .../041_r4_posted_verdicts.md | 0 .../050_execution_ledger.md | 0 .../260819_next_roadmap/060_outcome.md | 0 .../070_next_roadmap_split_and_dogfood.md | 0 .../080_merge_loop_ledger.md | 0 .../090_merge_loop_outcome.md | 0 .../000_investigation.md | 0 .../010_ranking.md | 0 .../020_2114_systemd_bus.md | 0 .../030_2107_service_proxy_env.md | 0 .../031_2107_implementation.md | 0 .../040_2108_windows_reboot_gate.md | 0 .../050_1587_deferred_catalog.md | 0 .../060_1933_tray_encoding.md | 0 .../061_1933_implementation.md | 0 .../070_sequencing.md | 0 .../075_verification.md | 0 .../080_outcome.md | 0 .../090_1527_abort_slice.md | 0 .../100_post_split_rebase.md | 0 .../110_2114_disposition.md | 0 .../120_2108_phase1.md | 0 .../121_2108_implementation.md | 0 .../130_ci_proxy_env_leak.md | 0 .../140_final_audit.md | 0 .../150_outcome.md | 0 .../170_2114_2108_fences.md | 0 .../180_windows_leg.md | 0 .../190_release_readiness.md | 0 .../200_local_windows_verification.md | 0 .../000_triage_matrix.md | 0 .../001_dependency_analysis.md | 0 .../002_audit_synthesis.md | 0 .../010_fix_dev_macos_ci.md | 0 .../260821_bug_merge_train/020_merge_2295.md | 0 .../260821_bug_merge_train/030_merge_2294.md | 0 .../260821_bug_merge_train/040_merge_2296.md | 0 .../260821_bug_merge_train/050_merge_2289.md | 0 .../260821_bug_merge_train/060_merge_2270.md | 0 .../260821_bug_merge_train/065_merge_2281.md | 0 .../260821_bug_merge_train/070_final_gate.md | 0 .../260822_senpi_cursor_transfer/000_plan.md | 2 +- .../001_opencodex_cursor_inventory.md | 0 .../002_senpi_cursor_inventory.md | 0 .../003_protocol_compare.md | 0 .../004_auth_catalog_compare.md | 0 .../005_exec_compare.md | 0 .../006_stream_overflow_compare.md | 0 .../007_cli_fallback.md | 0 .../090_transfer_verdict.md | 0 .../100_stabilization_round2_plan.md | 0 .../110_stream_health_watchdog.md | 0 .../120_small_hardening_pair.md | 0 .../190_round2_roadmap_lock.md | 0 .../200_round3_probe_plan.md | 0 .../210_maxmode.md | 0 .../220_rotation.md | 0 .../230_issue2305.md | 0 .../240_client_version.md | 0 .../250_billed_usage.md | 0 .../260_re_classification_refinement.md | 0 .../290_round3_lock.md | 0 .../300_opus_fast_catalog.md | 0 .../310_maxmode_bigctx.md | 0 .../000_plan.md | 2 +- .../010_aliases.md | 0 .../020_new_models_off.md | 0 .../030_default_preset.md | 0 .../000_baseline_and_scope.md | 0 .../001_current_state_inventory.md | 0 .../002_plan_audit.md | 0 ...p2_issue2457_sidecar_backend_resolution.md | 0 ...wp3_issue2411_status_routing_visibility.md | 0 .../030_wp4_issue2412_version_manager_shim.md | 0 .../010_design.md | 0 .../260826_cursor_responses_gap/000_plan.md | 4 +- .../001_seed_thread_failure_catalog.md | 0 .../010_probe_campaign.md | 2 +- .../020_gap_summary.md | 0 .../025_ultra_k3_research.md | 2 +- .../030_callid_sse_parity.md | 0 .../040_preamble_floor.md | 0 .../050_checkpoint_continuity.md | 0 .../060_catalog_honesty.md | 0 .../070_ultra_mode.md | 0 .../080_stall_corruption_diag.md | 0 .../090_gap8_codex_exec_qa.md | 0 .../100_wire_ndjson_qa.md | 0 .../110_app_route_qa.md | 0 .../120_repetition_breaker.md | 0 .../130_envelope_echo_guard.md | 0 .../140_round2_probe_results.md | 0 .../150_routing_commentary_hallucination.md | 0 .../010_design.md | 0 .../260826_provenance_writer/010_design.md | 0 .../000_repro_and_root_cause.md | 0 .../260826_session_lane_bounds/010_design.md | 0 .../020_reconnect_followup.md | 0 .../010_plan.md | 0 .../011_audit_response.md | 0 .../020_execution.md | 0 .../030_post_merge_f5.md | 0 .../011_wp1_outcome.md | 2 +- .../070_outcome.md | 2 +- .../010_builder_id_request_scoped_profile.md | 0 .../000_research_problem_and_state.md | 2 +- .../001_research_upstream_wire_contract.md | 0 .../002_research_kirolb_headtohead.md | 0 .../003_research_pr_reconciliation.md | 0 .../010_kiro_usage_fetcher.md | 0 .../020_per_account_quota_wiring.md | 0 .../030_quota_aware_pool_selection.md | 0 .../040_surfaces_cli_gui_docs.md | 0 .../050_verification_and_delivery.md | 2 +- .../060_audit_round1_amendments.md | 0 .../070_audit_round2_amendments.md | 0 .../080_head_to_head_result.md | 0 .../090_predispatch_selection.md | 0 .../100_quota_persistence.md | 0 .../110_integrated_verification.md | 0 .../000_baseline_and_roadmap.md | 0 .../010_toggle_basis_and_shrink.md | 0 .../011_rejected_designs.md | 0 .../020_control_affordances.md | 0 .../030_uniform_row_and_hover.md | 0 .../040_cap_cluster_and_occupied_slot.md | 0 .../050_hover_affordance_and_column_gate.md | 0 .../evidence/010-after-ko-1100.png | Bin .../evidence/010-before-ko-1100.png | Bin .../020-after-labeled-switch-ko-1280.png | Bin .../evidence/020-after-labels.json | 0 .../evidence/030-baseline.json | 0 .../evidence/030-geometry-harness.ts | 0 .../evidence/030-locale-harness.ts | 0 .../evidence/030-locale-sweep.json | 0 .../evidence/040-after-cap-slot-ko-1280.png | Bin .../evidence/040-geometry-harness.ts | 0 .../evidence/050-state-harness.ts | 0 .../evidence/wp2-states.json | 0 .../evidence/wp2-touch.json | 0 .../evidence/wp3-geometry.json | 0 .../evidence/wp3-state.json | 0 .../260901_merge_train_round3/000_plan.md | 0 .../002_audit_round1_synthesis.md | 0 .../010_wp1_3114_docs_devlog.md | 0 .../011_wp1_outcome.md | 0 .../020_wp2_3122_provider_patch_fakeip.md | 0 .../021_wp2_security_review.md | 0 .../030_wp3_3104_service_and_closeouts.md | 0 .../031_wp3_outcome.md | 0 .../040_wp4_3042_pid_probe.md | 0 .../050_wp5_close_3077_rebase_3109_3112.md | 0 .../051_wp5_outcome.md | 0 .../060_wp7_websocket_refresh_flake.md | 0 .../260902_bug_label_drawdown/000_plan.md | 0 .../260902_bug_label_drawdown/010_phase1.md | 0 .../011_bd1_landing.md | 0 .../260902_bug_label_drawdown/020_phase2.md | 0 .../021_bd2_landing.md | 0 .../260902_bug_label_drawdown/030_phase3.md | 0 .../031_bd3_landing.md | 0 .../260902_bug_label_drawdown/040_phase4.md | 0 .../041_bd4_landing.md | 0 .../050_bd5_replan.md | 0 .../260902_bug_label_drawdown/050_phase5.md | 0 .../260902_bug_label_drawdown/051_i3141.md | 0 .../260902_bug_label_drawdown/052_i3152.md | 0 .../260902_bug_label_drawdown/053_i3136.md | 0 .../260902_bug_label_drawdown/054_i3150.md | 0 .../260902_bug_label_drawdown/055_i3155.md | 0 .../260902_bug_label_drawdown/056_i1419.md | 0 .../260902_bug_label_drawdown/057_i2999.md | 0 .../260902_bug_label_drawdown/058_i2813.md | 0 .../260902_bug_label_drawdown/059_i1527.md | 0 .../260902_bug_label_drawdown/060_phase6.md | 0 .../260902_bug_label_drawdown/061_p3193.md | 0 .../062_p3193_landing.md | 0 .../260902_bug_label_drawdown/063_i3217.md | 0 .../064_i3217_landing.md | 0 .../260902_bug_label_drawdown/070_regaudit.md | 0 .../071_regaudit_landing.md | 0 .../072_regaudit2.md | 0 .../260902_bug_label_drawdown/080_p3226.md | 0 .../081_p3226_landing.md | 0 .../260902_bug_label_drawdown/082_p3227.md | 0 .../083_p3227_landing.md | 0 .../260902_bug_label_drawdown/084_p3228.md | 0 .../085_p3228_landing.md | 0 .../260902_bug_label_drawdown/086_p3229.md | 0 .../087_p3229_landing.md | 0 .../260902_bug_label_drawdown/088_r3239.md | 0 .../260902_bug_label_drawdown/089_p3232.md | 0 .../090_regaudit3.md | 0 .../260902_bug_label_drawdown/091_rv3239.md | 0 .../000_research.md | 0 .../001_bundle_protocol.md | 0 .../005_audit_round1.md | 0 .../010_wp1_bundle_effort_table.md | 0 .../020_wp2_models_max_output.md | 0 .../030_wp3_effort_variant_rows.md | 2 +- .../040_wp4_gui_provenance_hint.md | 0 .../041_wp4_screenshot.png | Bin .../050_wp5_claude_id_normalizer.md | 0 .../060_wp6_guide.md | 0 .../000_research.md | 0 .../005_audit_round1.md | 0 .../006_roadmap_lock.md | 0 .../007_audit_round1_reviewer.md | 0 .../010_layer1_server_status.md | 0 .../020_layer2_gui_tab.md | 0 .../030_layer3_docs.md | 0 .../040_publish_stack.md | 0 .../assets/cursor-overview-card.png | Bin .../assets/cursor-tab-detected.png | Bin .../000_scope.md | 0 .../010_wp1_adaptive_reasoning_effort.md | 0 .../011_wp1_audit_r1_synthesis.md | 0 .../020_wp2_outbound_body_guard.md | 0 .../021_wp2_audit_r1_synthesis.md | 0 .../030_wp3_compaction_provider.md | 0 .../031_wp3_audit_r1_synthesis.md | 0 .../040_wp4_retain_models.md | 0 .../041_wp4_audit_r1_synthesis.md | 0 .../050_wp5_xai_imagine_carry.md | 0 .../051_wp5_audit_r1_synthesis.md | 0 .../060_wp6_authless_desktop.md | 0 .../061_wp6_audit_r1_synthesis.md | 0 .../070_wp7_shim_free_token.md | 0 .../071_wp7_audit_r1_synthesis.md | 0 .../080_wp8_windows_proxy_auto.md | 0 .../081_wp8_audit_r1_synthesis.md | 0 .../090_wp9_keychain_keys.md | 0 .../091_wp9_audit_r1_synthesis.md | 0 .../100_wp10_display_names_carry.md | 0 .../101_wp10_audit_r1_synthesis.md | 0 .../110_wp11_antigravity_account_quota.md | 0 .../111_wp11_audit_r1_synthesis.md | 0 .../120_wp12_oauth_pool_capability.md | 0 .../121_wp12_audit_r1_synthesis.md | 0 .../130_wp13_reset_credit_auto_redeem.md | 0 .../131_wp13_audit_r1_synthesis.md | 0 .../140_wp14_upstream_ws_carry.md | 0 .../141_wp14_audit_r1_synthesis.md | 0 .../150_wp15_plaintext_v2_disposition.md | 0 .../151_wp15_audit_r1_synthesis.md | 0 .../260902_windows_ci_release/070_outcome.md | 2 +- .../000_research.md | 0 .../005_audit_synthesis.md | 0 .../010_wp2_ungate.md | 0 .../020_wp3_landing.md | 0 .../040_wp5_reset_credit_identity.md | 4 +- .../260905_astra_subagent_roster/000_plan.md | 0 .../010_roster_upgrade.md | 0 .../000_plan.md | 0 .../001_source_contract.md | 0 .../002_audit_synthesis.md | 2 +- .../003_roadmap_outcome.md | 0 .../010_protocol.md | 0 .../011_protocol_build.md | 0 .../012_protocol_outcome.md | 0 .../020_lifecycle.md | 0 .../260905_main_quota_guard/000_plan.md | 0 .../001_source_findings.md | 0 .../002_audit_synthesis.md | 0 .../260905_main_quota_guard/010_policy.md | 0 .../011_policy_dispatch_contract.md | 0 .../012_implementation_review.md | 0 .../013_window_priority_steering.md | 0 .../014_runtime_evidence.md | 0 .../015_recovery_review.md | 0 .../016_policy_input_review.md | 0 .../017_persisted_policy_validation.md | 0 .../018_dev_integration.md | 0 .../019_quota_provenance_integration.md | 0 .../260905_main_quota_guard/020_settings.md | 0 .../021_settings_dispatch.md | 0 .../022_ui_evidence/en-confirm-desktop.jpg | Bin .../022_ui_evidence/en-confirm-mobile.jpg | Bin .../022_ui_evidence/ko-blocked-desktop.jpg | Bin .../022_ui_evidence/ko-confirm-desktop.jpg | Bin .../022_ui_evidence/ko-confirm-mobile.jpg | Bin .../022_ui_evidence/ko-confirm-tablet.jpg | Bin .../ko-main-card-integrated-desktop.jpg | Bin .../ko-main-card-integrated-mobile.jpg | Bin .../022_ui_evidence/ko-setting-desktop.jpg | Bin .../ko-setting-integrated-desktop.jpg | Bin .../ko-zero-unlocked-desktop.jpg | Bin .../260905_main_quota_guard/023_ui_review.md | 0 .../024_ui_verification.md | 0 .../025_focus_review.md | 0 .../026_ui_dev_integration.md | 0 .../030_reserve_compatibility.md | 0 .../031_reserve_dispatch_contract.md | 0 .../032_reserve_audit.md | 0 .../033_parent_review_amendment.md | 0 .../034_recovery_evidence_validation.md | 0 .../039_reserve_verification.md | 0 .../260905_main_quota_guard/040_delivery.md | 0 .../041_stack_ci_repairs.md | 0 .../044_ingress_verification.md | 0 .../047_claude_policy_verification.md | 0 .../049_delivery_dispatch.md | 0 .../050_ci_contract_repairs.md | 0 .../052_loopback_target_parity.md | 0 .../059_runtime_landing.md | 0 .../260905_main_quota_guard/063_ui_landing.md | 0 .../064_final_rebase.md | 0 .../260905_open_work_closeout/000_plan.md | 2 +- .../001_lane_bug_prs_a.md | 2 +- .../002_lane_bug_prs_b.md | 0 .../003_lane_v2_and_quota.md | 0 .../004_lane_else_prs.md | 2 +- .../005_lane_bug_issues.md | 0 .../006_dispositions.md | 0 .../007_audit_wp0.md | 2 +- .../008_audit_synthesis.md | 2 +- .../010_wp1_stack_a_land_as_is.md | 2 +- .../011_wp1_execution.md | 0 .../012_wp1_delivery_record.md | 0 .../020_wp2_stack_b_bug_carry.md | 2 +- .../021_wp2_scope_amendment.md | 4 +- .../024_wp2_delivery_record.md | 0 .../030_wp3_stack_c_v2_passthrough.md | 2 +- .../031_wp3_reverify.md | 0 .../032_wp3_delivery_record.md | 0 .../040_wp4_stack_d_usage_quota.md | 2 +- .../041_wp4_reverify.md | 4 +- .../044_wp4_delivery_record.md | 0 .../050_wp5_stack_e_else.md | 2 +- .../051_wp5_reverify.md | 2 +- .../052_wp5_delivery.md | 0 .../053_residual_integration.md | 0 .../054_final_ci_pin.md | 0 .../055_linux_ci_repair.md | 0 .../056_second_ci_head.md | 0 .../057_coordinated_final_ci.md | 0 .../058_final_execution_result.md | 0 .../059_owner_directed_stop.md | 0 .../260905_open_work_closeout/060_ledger.md | 0 .../000_plan.md | 0 .../001_roadmap_audit.md | 0 .../010_initial_selection.md | 0 .../020_registration_guidance.md | 0 .../021_registration_notice.png | Bin .../022_models_all_off.png | Bin .../023_onboarding_verification.md | 0 .../000_plan.md | 0 .../001_attribution_evidence.md | 0 .../002_audit_synthesis.md | 0 .../010_attribution.md | 0 .../011_attribution_build.md | 0 .../012_premerge_review.md | 0 .../013_ci_test_boundaries.md | 0 .../014_recovery_fixture_isolation.md | 0 .../020_account_quota_api.md | 0 .../021_api_build.md | 0 .../030_quota_views.md | 0 .../031_ui_build.md | 0 .../040_stack_landing.md | 0 .../assets/011_usage_attribution.png | Bin .../assets/031_current_overview.png | Bin .../assets/032_current_usage.png | Bin .../assets/033_oauth_accounts.png | Bin .../assets/034_api_key_balances.png | Bin .../assets/035_passive_current_unobserved.png | Bin .../assets/036_pool_current.png | Bin .../assets/037_tablet_usage.png | Bin .../assets/039_mobile_current.png | Bin .../260906_aside_profiles/000_research.md | 0 .../010_profiles_backend_cli.md | 0 .../260906_aside_profiles/020_profiles_gui.md | 0 .../000_research.md | 0 .../010_export_selection.md | 0 .../020_owned_refresh.md | 0 .../030_responses_patch.md | 0 .../040_native_tool_parity.md | 0 .../260906_key_login_ci_timeout/000_plan.md | 0 .../260906_release_244_followups/000_plan.md | 0 .../001_roadmap_lock.md | 0 .../010_policy.md | 0 .../011_policy_implementation.md | 0 .../020_task_input.md | 0 .../021_task_input_implementation.md | 0 .../022_management_auth_port_fixture.md | 0 .../030_kiro_results.md | 0 .../031_kiro_result_implementation.md | 0 .../032_review_doc_format.md | 0 .../033_web_search_deadline_fixture.md | 0 .../040_opaque_recovery.md | 0 .../041_opaque_recovery_implementation.md | 0 .../050_combo_recovery.md | 0 .../051_combo_recovery_implementation.md | 0 .../052_shutdown_fixture.md | 0 .../060_grok_terminal.md | 0 .../070_quota_proxy.md | 0 .../071_quota_proxy_outcome.md | 0 .../080_usage_source.md | 0 .../082_recovery_doc_alignment.md | 0 .../090_dashboard.md | 0 .../091_dashboard_verification.md | 0 .../100_release.md | 0 .../screenshots/dashboard-1024.png | Bin .../screenshots/dashboard-1440-dark.png | Bin .../screenshots/dashboard-1440-lower.png | Bin .../screenshots/dashboard-1440-zoom2.png | Bin .../screenshots/dashboard-1440.png | Bin .../dashboard-320-empty-repeat.png | Bin .../screenshots/dashboard-320-interaction.png | Bin .../dashboard-320-keyboard-open.png | Bin .../screenshots/dashboard-320-lower.png | Bin .../screenshots/dashboard-320.png | Bin .../screenshots/dashboard-390.png | Bin .../screenshots/dashboard-768.png | Bin .../260906_stateful_task_guidance/000_plan.md | 0 .../010_raw_boundary.md | 0 .../011_implementation.md | 0 .../260906_unix_shim_ci_restore/000_plan.md | 0 .../260906_unix_shim_ci_restore/010_repair.md | 0 .../{_plan => _fin}/260907_lane_c/000_plan.md | 0 .../260907_lane_c/010_web_search.md | 0 .../260907_lane_c/020_vision.md | 0 .../260907_lane_c/030_health.md | 0 .../260907_lane_c/040_desktop.md | 0 .../260907_lane_c/050_fallback.md | 0 .../{_plan => _fin}/260907_lane_d/000_plan.md | 0 .../260907_lane_d/001_roadmap_audit.md | 0 .../260907_lane_d/010_thinking.md | 0 .../260907_lane_d/020_receipt.md | 0 .../260907_lane_d/030_account_prices.md | 0 .../260907_lane_d/040_price_editor.md | 0 .../260907_lane_d/050_usage_ranges.md | 0 .../260907_lane_d/060_delivery.md | 0 .../000_plan.md | 2 +- .../010_recommendations.md | 0 .../260907_platform_validation/000_plan.md | 0 .../001_plan_audit.md | 0 .../010_oauth_teardown.md | 0 .../020_container_smoke.md | 0 .../025_container_lifecycle_mode.md | 0 .../030_container_ci.md | 0 .../035_body_diagnostics.md | 0 .../040_residual_evidence.md | 0 .../010_implementation.md | 0 .../260907_release_train/000_plan.md | 2 +- .../260907_release_train/010_wp1_execution.md | 0 .../260907_release_train/090_readiness.md | 0 .../260907_release_train_b/000_plan.md | 0 .../260907_release_train_b/010_carry.md | 0 .../260907_release_train_b/020_carry.md | 0 .../010_implementation.md | 0 .../260907_sponsor_branches/000_plan.md | 0 .../260907_sponsor_branches/010_phase1.md | 0 .../260907_sponsor_branches/020_phase2.md | 0 .../260907_sponsor_branches/030_phase3.md | 0 .../260907_track2_protocol/000_plan.md | 0 .../010_chat_json_sse.md | 0 .../011_chat_audit_amendment.md | 0 .../260907_track2_protocol/020_refusal.md | 0 .../030_custom_efforts.md | 0 .../040_hosted_search_disposition.md | 0 .../050_claude_compatibility.md | 0 .../060_remote_delivery.md | 0 .../070_windows_fixture_cache.md | 0 .../080_windows_sync_preparation.md | 0 .../090_windows_shim_budget.md | 0 .../260908_provider_runtime_stack/000_plan.md | 2 +- .../260908_sponsor_overview/010_overview.md | 0 .../260908_voice_relay/000_plan.md | 0 .../260908_voice_relay/001_sources.md | 0 .../000_plan.md | 0 .../010_wp1_terminal_verdict.md | 0 .../020_wp2_quota_registration.md | 0 .../030_wp3_anthropic_plan.md | 0 .../000_plan.md | 0 .../000_plan.md | 0 .../260909_post249_scope_cleanup/000_plan.md | 0 .../010_reconciliation.md | 0 .../020_branch_worktree_cleanup.md | 0 .../030_issue_disposition.md | 0 .../040_dispatch_roadmap.md | 0 .../050_delivery_record.md | 0 .../000_plan.md | 0 .../010_audit.md | 0 .../assets/010_before.png | Bin .../assets/020_after_collapsed.png | Bin .../assets/030_after_open.png | Bin .../000_plan.md | 2 +- .../010_phase1_retry_after_abort.md | 0 .../020_phase2_endpoint_validation.md | 0 .../000_plan.md | 0 .../010_audit_lanes.md | 0 .../020_release_plan.md | 0 .../030_evidence.md | 0 .../040_triage_protocol.md | 0 .../050_lane_packets.md | 0 .../060_release_readiness.md | 0 .../070_release_execution.md | 0 .../080_delivery_record.md | 0 .../260910_cursor_acp_bridge/000_plan.md | 4 +- .../010_protocol_identity.md | 0 .../020_cli_jaw_inventory.md | 0 .../030_opencodex_seams.md | 0 .../040_feasibility_verdict.md | 0 .../260910_cursor_acp_bridge/050_audit.md | 2 +- .../260910_cursor_acp_bridge/060_done.md | 2 +- .../070_live_trace.md | 0 .../000_plan.md | 2 +- .../260910_post249_round2/000_plan.md | 2 +- .../260910_post249_round2/010_lane_split.md | 0 .../020_4129_shadow_combo_failover.md | 0 .../030_4148_claude_system_hoist.md | 0 .../040_4141_launchctl_bootout.md | 0 .../050_3666_free_model_filter.md | 0 .../060_4075_gemini_setup_ux.md | 0 .../070_3859_email_mask_toggle.md | 0 .../080_1711_zero_credit_catalog.md | 0 .../090_4038_decode_rate.md | 0 .../100_4147_zcode_reasoning_landing.md | 0 .../110_delivery_record.md | 0 .../120_landing_gate_decision.md | 0 .../260910_post249_round2/_research/1711.md | 0 .../260910_post249_round2/_research/3666.md | 0 .../260910_post249_round2/_research/3859.md | 0 .../260910_post249_round2/_research/4038.md | 0 .../260910_post249_round2/_research/4075.md | 0 .../260910_post249_round2/_research/4129.md | 0 .../260910_post249_round2/_research/4141.md | 0 .../260910_post249_round2/_research/4148.md | 0 .../260910_post249_round2/_research/_audit.md | 30 +++++ .../_research/_audit_pr4153.md | 0 .../_research/_audit_wp2.md | 0 .../_research/_audit_wp3.md | 2 +- .../_research/_audit_wp3b.md | 0 .../260910_readme_i18n_parity/000_plan.md | 0 .../010_phase1_parity_guard.md | 0 .../020_phase2_locale_resync.md | 0 .../030_phase3_delivery.md | 0 .../000_plan.md | 2 +- .../010_phase1_manual_selection.md | 0 .../020_phase2_shared_kernel.md | 0 .../030_phase3_cache_affinity.md | 0 .../040_phase4_key_pool_strategy.md | 0 .../050_phase5_surface_consolidation.md | 0 .../assets/wp5b-pool-settings.png | Bin .../000_plan.md | 2 +- .../010_evidence.md | 0 .../020_architecture_dispositions.md | 0 .../030_test_impact.md | 0 .../040_open_gaps.md | 0 .../050_revalidation.md | 0 .../060_done.md | 0 .../000_plan.md | 2 +- .../001_evidence.md | 0 .../002_inventory.md | 0 .../010_phase1_pr4258.md | 0 .../020_phase2_v41_rollout.md | 0 .../030_phase3_v4pro_removal.md | 0 .../040_phase4_merge.md | 0 .../260911_devin_two_providers/001_plan.md | 0 .../260911_devin_two_providers/002_audit.md | 0 .../003_live_evidence.md | 0 .../004_devin_cli_split.md | 0 .../010_launchd_repair.md | 0 .../020_loopback_companion.md | 2 +- .../030_hub_local_clients.md | 2 +- .../040_hub_token_ux.md | 4 +- .../260911_hub_single_port/050_docs_skill.md | 2 +- .../060_client_hub_state.md | 2 +- .../260911_l1_responses_core/000_packet.md | 2 +- .../260911_l2_catalog_provider/000_packet.md | 2 +- .../010_4201_quota_admission.md | 0 .../020_flash_upstream_evidence.md | 0 .../260911_l3_account_pool/000_packet.md | 2 +- .../010_wp1_4126_warmup.md | 0 .../020_wp2_4212_attribution.md | 0 .../030_wp3_4211_plan_exclusion.md | 0 .../260911_l4_service_cli/000_packet.md | 2 +- .../010_wp1_pnpm_self_update.md | 0 .../020_wp2_stop_refusal.md | 0 .../030_wp3_client_catalog.md | 0 .../260911_l5_integrations_io/000_packet.md | 2 +- .../260911_l6_streaming_tools/000_packet.md | 2 +- .../010_4191_ws_failure_classification.md | 2 +- .../020_4190_qoder_scaffold_guard.md | 2 +- .../260911_l7_docs/000_packet.md | 2 +- .../260911_l7_docs/010_roadmap.md | 0 .../260911_l7_docs/020_4215_wording.md | 0 .../260911_l7_docs/030_4200_recipe.md | 0 .../260911_l7_docs/040_4215_delivery.md | 0 .../260911_l7_docs/050_4200_delivery.md | 0 .../260911_lane_dispatch_round/000_plan.md | 0 .../010_lane_partition.md | 0 .../020_lane_packets.md | 0 .../030_audit_round1.md | 0 .../040_audit_round2.md | 0 .../050_audit_round3.md | 0 .../260911_lane_dispatch_round/060_ledger.md | 0 .../070_dispatch_handoff.md | 14 +-- .../080_wp2_publish_plan.md | 0 .../090_wp2_execution.md | 0 .../100_wp3_plan.md | 0 .../110_tracking_refresh.md | 0 .../120_wp4_plan.md | 0 .../130_wp4_feasibility.md | 0 .../000_plan.md | 0 .../010_audit_round1.md | 0 .../000_plan.md | 2 +- .../001_issue_triage.md | 0 .../002_cross_proxy_survey.md | 0 .../003_registry_gap_inventory.md | 0 .../004_audit_rounds.md | 0 .../010_phase1_preset_structured_output.md | 0 .../020_phase2_preset_consistency_guard.md | 0 .../030_phase3_docs_and_pr.md | 0 .../031_wp4_outcome.md | 0 .../260911_r2_merge_train/000_plan.md | 0 .../010_phase1_pr4244.md | 0 .../020_phase2_pr4248.md | 0 .../030_phase3_pr4246.md | 0 .../040_phase4_pr4247.md | 0 .../260911_ws_commit_boundary/000_plan.md | 0 .../010_journey_evaluation.md | 0 .../020_design_record.md | 0 .../025_audit_round1.md | 0 .../260911_ws_commit_boundary/030_wp2_plan.md | 0 .../260911_ws_commit_boundary/040_wp3_plan.md | 0 .../260911_ws_commit_boundary/045_wp4_plan.md | 0 .../260911_ws_commit_boundary/050_review.md | 0 .../260912_audio_apis_stack/000_plan.md | 0 .../002_review_disposition.md | 0 .../010_transcription.md | 0 .../011_transcription_checks.md | 0 .../020_streaming_voice.md | 0 .../021_streaming_checks.md | 0 .../030_connections.md | 0 .../031_connections_checks.md | 0 .../screenshots/audio-1440-light.png | Bin .../screenshots/audio-320-ko.png | Bin .../screenshots/audio-390-light.png | Bin .../transcription-layer-baseline.png | Bin .../260912_beginner_pdf/000_plan.md | 0 .../260912_cache_lane/000_plan.md | 0 .../260912_cache_lane/010_claim.md | 0 .../260912_cache_lane/020_affinity.md | 0 .../260912_cache_lane/025_affinity_native.md | 0 .../260912_cache_lane/026_affinity_adapt.md | 0 .../260912_cache_lane/027_affinity_slot.md | 0 .../260912_cache_lane/030_prefix.md | 0 .../260912_cache_lane/035_prefix_adapt.md | 0 .../260912_cache_lane/036_prefix_linear.md | 0 .../260912_cache_lane/037_prefix_slot.md | 0 .../260912_cache_lane/040_hermes.md | 0 .../041_hermes_ci_refresh.md | 0 .../260912_cache_lane/050_verify.md | 0 .../260912_cache_lane/060_handoff.md | 0 .../260912_campaign_ci_fixtures/000_plan.md | 0 .../260912_catalog_lane_readiness/000_plan.md | 0 .../010_roadmap.md | 0 .../011_design_reflection.md | 0 .../020_review.md | 0 .../022_keyboard_repair.md | 0 .../030_evidence.md | 0 .../260912_cline_client/000_plan.md | 0 .../260912_cline_client/001_contract.md | 0 .../260912_cline_client/009_roadmap_result.md | 0 .../260912_cline_client/010_contract.md | 0 .../019_contract_result.md | 0 .../260912_cline_client/020_surfaces.md | 0 .../029_surfaces_result.md | 0 .../260912_cline_client/030_verification.md | 0 .../260912_cline_client/039_gui_evidence.md | 0 .../evidence/cline-export.png | Bin .../evidence/cline-integration.png | Bin .../260912_codex_gpt54_retirement/000_plan.md | 0 .../010_catalog_removal.md | 0 .../020_defaults_repoint.md | 0 .../030_surfaces_and_gate.md | 0 .../260912_codex_gpt54_retirement/040_done.md | 0 .../260912_codex_spark_retirement/000_plan.md | 0 .../001_source.md | 0 .../010_implementation.md | 0 .../020_review.md | 0 .../030_delivery.md | 0 .../260912_combo_carry/000_plan.md | 0 .../260912_combo_carry/010_runtime.md | 0 .../260912_combo_carry/020_editor.md | 0 .../260912_combo_carry/030_verification.md | 0 .../260912_combo_carry/031_exhausted.png | Bin .../260912_combo_carry/032_unknown.png | Bin .../260912_combo_carry/033_expired.png | Bin .../260912_combo_carry/034_render_evidence.md | 0 .../260912_combo_carry/040_pnpm_ci_repair.md | 0 .../050_active_reactivation_repair.md | 0 .../260912_devin_hardening/000_plan.md | 0 .../010_cli_token_transition.md | 0 .../020_cloud_direct_hardening.md | 0 .../030_cached_token_display.md | 0 .../040_stacked_delivery.md | 0 .../logs-devin-cached-restored.jpg | Bin .../260912_grok_reset_coupon_gui/000_plan.md | 2 +- .../005_status.md | 0 .../010_architect_dispositions.md | 0 .../020_reflection_gaps.md | 0 .../030_audit_round1.md | 0 .../evidence/architect-round1.md | 0 .../260912_grok_reset_coupons/000_plan.md | 2 +- .../001_survey_seams.md | 0 .../260912_grok_reset_coupons/005_status.md | 0 .../010_phase1_core_client.md | 0 .../020_phase2_surfaces.md | 0 .../030_phase3_delivery.md | 2 +- .../260912_history_containment/000_plan.md | 0 .../010_containment.md | 0 .../020_continuation.md | 0 .../260912_history_containment/030_relay.md | 0 .../040_verification.md | 0 .../051_resume_status.md | 0 .../260912_muse_device_oauth/000_plan.md | 0 .../001_reference_measurements.md | 0 .../002_design_decisions.md | 0 .../010_wp2_device_core.md | 4 +- .../020_wp3_login_integration.md | 0 .../030_wp4_header_and_quota.md | 0 .../040_wp5_tests_and_gate.md | 0 .../050_delivery_record.md | 0 .../260912_muse_tool_name_alias/000_plan.md | 0 .../260912_omo_client_integration/000_plan.md | 0 .../001_omo_contract.md | 0 .../002_registration_checklist.md | 0 .../003_brand_mark_provenance.md | 0 .../010_wp2_backend.md | 0 .../020_wp3_gui.md | 0 .../030_wp4_docs.md | 0 .../040_wp5_verification.md | 0 .../050_wp6_gjc_rename.md | 0 .../060_wp3_rendered_proof.md | 0 .../090_outcome.md | 0 .../evidence/integrations-omo-tab.png | Bin .../260912_operations/000_plan.md | 0 .../260912_operations/001_roadmap_audit.md | 0 .../260912_operations/010_update.md | 0 .../260912_operations/020_listeners.md | 0 .../260912_operations/030_totals.md | 0 .../260912_operations/040_client_usage.md | 0 .../260912_operations/050_pairing.md | 0 .../260912_operations/060_transport.md | 0 .../260912_operations/070_verification.md | 0 .../260912_operations/080_update_events.md | 0 .../090_listener_diagnostic.md | 0 .../260912_operations/100_usage_transport.md | 0 .../260912_operations/110_resume_status.md | 0 .../120_coordinator_probe.md | 0 .../000_plan.md | 0 .../010_phase1_drop_elapsed_short_carry.md | 0 .../000_plan.md | 0 .../010_context.md | 0 .../015_codesign_grok.md | 0 .../016_audit_corrections.md | 0 .../020_r3_local_tab.md | 0 .../030_r2_note_clamp.md | 0 .../040_r1_unified_search.md | 0 .../050_delivery.md | 0 .../060_delivery_record.md | 0 .../evidence/grok-4.6-codesign.md | 0 .../evidence/wp2-local-tab.png | Bin .../evidence/wp3-note-clamp.png | Bin .../evidence/wp3-note-popup.png | Bin .../evidence/wp4-browse-mode.png | Bin .../evidence/wp4-search-accounts.png | Bin .../evidence/wp4-search-groups.png | Bin .../000_decision.md | 2 +- .../260912_reasoning_metadata/000_decision.md | 0 .../000_plan.md | 0 .../010_ci_repair.md | 0 .../020_regression_sweep.md | 0 .../025_sweep_results.md | 0 .../030_defect_landing.md | 0 .../040_preview_release.md | 0 .../050_main_release.md | 0 .../260912_remote_workspace_carry/000_plan.md | 0 .../010_protocol.md | 0 .../020_executor_runtime.md | 0 .../030_integration.md | 0 .../040_hosted_validation.md | 0 .../041_resume_ci_repair.md | 0 .../assets/041_desktop_read_only.png | Bin .../assets/042_desktop_files_only.png | Bin .../remote-workspace-hub-dashboard.png | Bin .../remote-workspace-pairing-code.png | Bin .../260912_thinking_contract/000_plan.md | 0 .../260912_thinking_contract/001_sources.md | 0 .../010_presentation.md | 0 .../020_transport_hint.md | 0 .../260912_thinking_contract/030_spark.md | 0 .../260912_thinking_contract/040_delivery.md | 0 .../260912_thinking_contract/050_refresh.md | 0 .../260912_v2_contracts/000_plan.md | 0 .../260912_v2_contracts/010_plaintext.md | 0 .../260912_v2_contracts/020_recovery.md | 0 .../030_native_identity.md | 0 .../260912_v2_contracts/040_verification.md | 0 .../050_resume_evidence.md | 0 .../000_plan.md | 0 .../001_research_zai_model_facts.md | 0 .../002_research_zcode_bundle_schema.md | 0 .../003_research_ocx_internals.md | 0 .../010_wp2_zcode_export_responses.md | 0 .../020_wp3_glm53_flash_modalities.md | 0 .../030_wp4_zai_responses_default.md | 0 .../evidence/zai-responses-models.json | 0 .../000_plan.md | 0 .../010_rootcause_evidence.md | 0 .../020_fix_refusal_scope.md | 0 .../000_plan.md | 2 +- .../000_plan.md | 0 .../001_platform_topology.md | 0 .../002_audit_findings.md | 0 .../010_phase1_shared_restart_surface.md | 0 .../020_phase2_detached_self_handoff.md | 0 .../030_phase3_contract_merge.md | 2 +- .../040_phase4_verification_and_delivery.md | 0 .../041_execution_record.md | 0 .../000_plan.md | 2 +- .../010_wp1_swe2_effort_carry.md | 0 .../020_wp2_devin_cli_fixture_carry.md | 0 .../030_wp3_ttfb_generation_deadline.md | 0 ...040_wp4_devin_prompt_cache_and_identity.md | 0 .../050_wp5_effort_suffix_unification.md | 0 .../060_wp6_assign_model_router.md | 0 .../260913_devin_provider_merge/000_plan.md | 0 .../010_wp1_core_merge.md | 0 .../020_wp2_migration.md | 0 .../030_wp3_surface_sync.md | 0 .../260913_devin_provider_merge/040_wp4_pr.md | 0 .../260913_godfile_round1/000_plan.md | 0 .../260913_lane_stack_merge/000_plan.md | 0 .../001_merge_topology.md | 0 .../002_merge_mechanics.md | 2 +- .../260913_lane_stack_merge/010_wave1.md | 2 +- .../260913_lane_stack_merge/020_wave2.md | 0 .../030_tip_and_regression.md | 0 .../040_issue_closure.md | 0 .../260913_lane_stack_merge/050_outcome.md | 0 .../screenshots/codex-account-pool.png | Bin .../screenshots/dashboard-overview.png | Bin .../screenshots/integrations-clients.png | Bin .../screenshots/remote-workspace.png | Bin .../000_plan.md | 2 +- .../001_scan_evidence.md | 0 .../010_inventory_freeze.md | 0 .../020_credits_update.md | 0 .../030_pr_merge.md | 0 .../000_summary.md | 0 .../000_plan.md | 0 .../010_devin_effort_ladder.md | 0 .../260914_carry_pr4528/000_plan.md | 0 .../260914_carry_pr4528/010_phase1.md | 0 .../000_plan.md | 0 .../010_rootcause_evidence.md | 0 .../020_fix_and_contract_change.md | 0 .../000_unit.md | 2 +- .../010_bound_binding_policy.md | 0 .../020_backoff_preserves_binding.md | 0 .../030_move_reason_evidence.md | 0 .../040_send_budget.md | 0 .../050_worker_isolation.md | 0 .../060_quota_cache_domains.md | 0 .../070_delivery.md | 0 .../080_codex_cache_reinforcement.md | 0 .../090_remaining_stack.md | 0 .../100_dev_tip_closure_assessment.md | 0 .../110_spend_ceiling_configuration.md | 0 .../260914_godfile_round2/000_plan.md | 2 +- .../010_phase1_file_size_ratchet.md | 2 +- .../020_phase2_state_and_shim.md | 0 .../030_phase3_inject_and_catalog_sync.md | 0 .../040_phase4_routing_and_quota.md | 0 .../050_phase5_config.md | 0 .../260914_l2_pool_routing_cache/000_unit.md | 0 .../010_cache_safe_rebind.md | 0 .../020_routing_adoption.md | 0 .../030_delivery.md | 0 .../260914_l4_responses_media/010_roadmap.md | 0 .../000_plan.md | 0 .../010_wp1_account_lifecycle_edges.md | 0 .../260914_l7_web_search_bridge/000_plan.md | 0 .../010_mixed_tool_continuation.md | 0 .../020_alpha_search_fallback.md | 0 .../260914_provider_parity_stack/000_plan.md | 0 .../001_audit_evidence.md | 0 .../002_architect_dispositions.md | 0 .../003_blocker_corrections.md | 0 .../010_phase1_ingress_normalization.md | 0 .../020_phase2_chat_responses_controls.md | 0 .../030_phase3_provider_wire_contracts.md | 0 .../040_phase4_modality_fidelity.md | 0 .../050_residuals.md | 0 .../060_direct_media_guard.md | 0 .../010_roadmap.md | 0 .../020_issue_3377_capability_audit.md | 0 .../000_audit_and_release_plan.md | 0 .../010_audit_findings.md | 0 .../020_release_runbook.md | 0 .../260915_2560_release_train/000_roadmap.md | 0 .../010_land_4683.md | 0 .../020_regression_audit.md | 0 .../260915_2560_release_train/030_release.md | 0 .../040_release_decision.md | 0 .../260915_godfile_round3/000_plan.md | 0 .../010_phase1_config.md | 2 +- .../020_phase2_providers_registry.md | 0 .../030_phase3_codex_auth_api.md | 0 .../040_phase4_catalog_provider_fetch.md | 0 .../050_phase5_adapters_openai_chat.md | 0 .../260915_godfile_round3/090_outcome.md | 0 .../260915_godfile_round5/000_plan.md | 0 .../010_openai_responses.md | 0 .../260915_godfile_round5/020_bridge.md | 0 .../030_activation_guard.md | 0 .../260915_godfile_round5/040_server_index.md | 2 +- .../050_stack_and_gates.md | 0 .../260915_godfile_round5/060_audit_record.md | 0 .../061_server_index_outcome.md | 0 .../260915_godfile_round5/070_core_outcome.md | 0 .../080_round_outcome.md | 0 .../260915_workflow_budget_window/000_unit.md | 0 .../010_windowed_ceilings.md | 0 .../020_legible_refusal.md | 0 .../030_wfc_diff_plan.md | 0 .../260916_cursor_http2_toolcall/000_plan.md | 0 .../010_phase1_text_toolcall_quarantine.md | 0 .../020_phase2_observed_max_tokens.md | 0 .../031_openai_tiers_split.md | 0 .../041_preview_fence_test_is_structural.md | 0 .../260917_2570_release_train/000_roadmap.md | 0 .../010_dev_green.md | 0 .../020_pr_triage.md | 0 .../030_issue_triage.md | 0 .../260917_2570_release_train/040_release.md | 0 .../260917_devin_input_ceiling/000_review.md | 0 .../000_master_plan.md | 0 ...sue_4850_preview_pool_eligibility_fence.md | 0 .../020_pr_4873_dependency_audit_review.md | 0 .../030_unit_c_docs_site_build_gate.md | 0 .../000_master_plan.md | 2 +- .../010_upstream_resolution_facts.md | 0 .../020_issue_4812_contract.md | 0 .../030_issue_4809_contract.md | 0 .../040_verification.md | 0 .../000_roadmap.md | 0 .../010_admission_audit.md | 0 .../020_independent_review.md | 0 .../010_roadmap.md | 0 .../000_roadmap.md | 0 .../010_u1_text_toolcall_contract.md | 0 .../020_u2_observed_window_scope.md | 0 .../030_u3_remint_isolation_and_budget.md | 0 .../040_u4_codebuddy_bare_tool_names.md | 0 .../000_master_plan.md | 0 .../010_4855_terminal_stop_classification.md | 0 .../020_4822_zai_model_discovery.md | 0 .../030_carried_catalog_and_gui_prs.md | 0 .../040_4857_first_frame_usage_contract.md | 0 .../000_plan.md | 2 +- .../010_stage_diffs.md | 0 .../020_integration_contract.md | 0 .../030_l1_precondition.md | 0 .../040_activation_decision.md | 0 .../260918_2580_release_train/000_roadmap.md | 0 .../260918_2580_release_train/040_release.md | 0 .../260918_lane_a_bug_train/010_roadmap.md | 0 .../030_transient_passthrough_policy.md | 0 .../040_combo_response_format.md | 0 ...041_combo_response_format_second_vendor.md | 0 .../050_cohort_pool_affinity.md | 0 .../000_roadmap.md | 0 .../010_roadmap.md | 0 .../020_closure_evidence.md | 0 .../000_upstream_contract_evidence.md | 0 .../260919_contract_resolution/001_status.md | 2 +- .../042_release_followup_authorization.md | 2 +- .../043_implementation_handoff.md | 2 +- .../000_local_build.md | 0 .../010_roadmap.md | 0 .../011_acceptance.md | 0 .../020_build_state_guards.md | 0 .../030_icons_and_widget.md | 0 .../040_widget_never_offered.md | 0 .../050_landing.md | 0 .../260920_regression_release/000_scope.md | 0 .../010_execution.md | 0 .../260920_round2_followups/000_plan.md | 0 .../010_r1_paginated_history_guard.md | 0 .../020_r2_desktop_ci.md | 0 .../260920_round2_followups/030_lane_r3.md | 0 .../040_r4_retry_rework.md | 0 .../260920_round2_followups/050_lane_r5.md | 2 +- .../050_r4_remainders.md | 0 .../060_r6_usage_models_table.md | 0 .../070_widget_signing.md | 0 .../260920_round2_followups/090_closeout.md | 0 .../r6-usage-table/r6-01-column-order.png | Bin .../r6-usage-table/r6-02-pinned-scroll.png | Bin .../r6-usage-table/r6-03-narrow-fallback.png | Bin .../000_charter.md | 0 .../010_coexistence_findings.md | 0 .../020_windows_linux_findings.md | 0 .../030_contradictions.md | 0 .../040_verification_hosts.md | 0 .../050_webview_dialogs.md | 0 .../060_contradictions_round2.md | 0 .../070_decisions.md | 0 .../080_decisions_round2.md | 0 .../260921_app_runtime_ownership/090_lanes.md | 0 .../100_resolutions.md | 0 .../110_reaudit.md | 0 .../120_gate_runbook.md | 0 .../120_install_verification.md | 0 .../130_linux_surface_findings.md | 0 .../140_tray_popup_polish.md | 0 .../150_closeout.md | 0 .../tray-usage-popup-glass.png | Bin .../tray-usage-popup.png | Bin .../260922_native_tray_release/000_plan.md | 0 .../001_evidence.md | 0 .../002_plan_review.md | 0 .../010_native_presentation.md | 0 .../011_presentation_verification.md | 0 .../020_shell_integration.md | 0 .../021_integration_verification.md | 0 .../030_regression.md | 0 .../031_verification.md | 0 .../260922_native_tray_release/040_release.md | 0 .../evidence/native-glass-bottom.png | Bin .../evidence/native-glass-top.png | Bin .../evidence/native-panel-bottom.png | Bin .../evidence/native-panel-dark.png | Bin .../evidence/native-panel-light.png | Bin .../evidence/web-tray-opaque-bottom.png | Bin .../evidence/web-tray-vibrant-bottom.png | Bin .../260923_anthropic_fast_speed/010_plan.md | 0 .../020_probe-evidence.md | 0 .../030_reflection.md | 2 +- .../260923_anthropic_fast_speed/040_audit.md | 0 .../260923_anthropic_fast_speed/050_build.md | 0 .../260923_anthropic_fast_speed/060_done.md | 0 .../evidence/logs-fast-downgrade.png | Bin .../000_triage.md | 0 .../010_build.md | 0 .../020_delivery.md | 0 .../000_overview.md | 0 .../010_carry_plan.md | 0 .../020_delivery.md | 0 .../260923_bundle_lane_e/000_overview.md | 0 .../260923_bundle_lane_e/010_decisions.md | 0 .../260923_bundle_lane_e/020_carry.md | 0 .../260923_bundle_lane_e/030_verify.md | 0 .../000_plan.md | 0 .../001_probe_evidence.md | 0 .../010_roadmap.md | 0 .../020_wp2_first_party_bindings.md | 0 .../030_wp3_live_proof_and_pr.md | 0 .../260923_claude_reset_grants/010_plan.md | 0 .../010_plan.md | 0 .../020_audit.md | 0 .../260923_docs_polish_404/000_plan.md | 0 .../001_existing_link_failures.md | 0 .../010_wp2_link_integrity.md | 0 .../020_wp3_english_polish_readme_resync.md | 0 .../021_wp3_macos_menu_bar_draft.md | 0 .../030_wp4_locale_coverage.md | 0 .../040_wp5_delivery.md | 0 .../260923_docs_retirement/000_plan.md | 0 .../010_phase1_docs_retirement.md | 0 .../260923_gpt6_catalog_lanes/000_plan.md | 0 .../010_phase1_upstream_repin.md | 0 .../020_phase2_roster_admission.md | 0 .../030_phase3_gpt6_rows.md | 0 .../260923_grok47_parity/000_plan.md | 2 +- .../010_probe-evidence.md | 0 .../000_plan.md | 0 .../010_phase1_small_units.md | 0 .../020_phase2_responses_sequence.md | 0 .../030_phase3_search_usage.md | 0 .../040_phase4_pr_ci_review.md | 0 .../050_phase5_close_originals.md | 0 .../000_plan.md | 0 .../010_architect.md | 0 .../020_done.md | 0 .../evidence/ko-collapsed.png | Bin .../evidence/ko-expanded.png | Bin .../260923_opus_5_5_catalog/010_plan.md | 0 .../260923_opus_5_5_catalog/020_audit.md | 0 .../260923_opus_5_5_catalog/030_done.md | 0 .../040_plan_providers.md | 0 .../050_done_providers.md | 0 .../060_plan_preemptive.md | 0 .../000_overview.md | 0 .../010_part1_compat_contract.md | 0 .../020_part2_shadow_target_lifecycle.md | 0 .../030_delivery.md | 0 .../000_roadmap.md | 0 .../010_fenced_proxy_identity.md | 0 .../020_updater_leftovers_and_guidance.md | 0 .../000_roadmap.md | 0 .../010_source.md | 0 .../020_tests.md | 0 .../030_docs.md | 0 .../040_delivery.md | 0 .../050_review_followup.md | 0 .../260923_p4_ci_pr_finish/000_plan.md | 0 .../010_pr5469_privacy_gate.md | 0 .../020_pr5456_batch_deadline.md | 0 .../030_pr5471_latest_dev_wording.md | 0 .../260923_p5_ci_release_gaps/000_plan.md | 0 .../010_release_preflight.md | 0 .../020_release_outcome_report.md | 0 .../030_shard_balance.md | 0 .../040_scope_gap_checks.md | 0 .../260923_p5_ci_release_gaps/050_delivery.md | 0 .../000_README.md | 0 .../010_gpt6_default_roster.md | 0 .../020_roster_autosave.md | 0 .../030_delivery.md | 0 .../040_legacy_roster_cleanup.md | 0 .../000_plan.md | 0 .../010_phase1.md | 0 .../260924_anthropic_fast_opt_in/010_plan.md | 2 +- .../010_plan.md | 0 .../000_plan.md | 0 .../001_research.md | 0 .../010_wp2_gateway_default_and_warning.md | 0 .../020_wp3_picker_core.md | 0 .../030_wp4_picker_activation.md | 0 .../040_wp5_live_proof_pr_merge.md | 0 .../260924_cursor_fast_pricing/000_plan.md | 0 .../010_implementation.md | 0 .../020_verification.md | 0 .../260924_l3_provider_adapters/010_plan.md | 0 .../000_roadmap.md | 0 .../010_carry_ready_prs.md | 0 .../020_subagent_identity_5221.md | 0 .../030_agent_message_recovery_5009.md | 0 .../040_main_hard_lock_default_5694.md | 0 .../050_publish.md | 2 +- .../000_overview.md | 0 .../010_wsl_home.md | 0 .../020_windows_mise_node.md | 0 .../030_echo_filter.md | 0 .../040_tool_call_hold.md | 0 .../050_delivery.md | 0 .../260924_update_indicator/000_plan.md | 0 .../001_sol_plan_draft.md | 0 .../002_architect_proposal.md | 0 .../010_phase1_package_cache.md | 0 .../020_phase2_desktop_state_icons.md | 2 +- .../030_phase3_desktop_update_page.md | 4 +- .../040_phase4_windows_npm_tray.md | 0 .../260924_update_indicator/050_delivery.md | 0 .../260925_claude_cli_first_party/000_plan.md | 0 .../001_research.md | 0 .../002_consultation.md | 0 .../010_foundations.md | 0 .../020_intercept_classification.md | 2 +- .../030_management_cli.md | 0 .../040_surfaces.md | 0 .../050_delivery.md | 0 .../260925_remote_home_child_link/000_prd.md | 0 .../001_stack_plan.md | 0 .../002_arch_plan.md | 0 .../003_decisions.md | 0 .../010_wp1_link_core.md | 0 .../020_wp2_hub_link_listener.md | 4 +- .../030_wp3_client_link_transport.md | 0 .../040_wp4_supervisor_api_cli.md | 6 +- .../050_wp5_remote_gui.md | 6 +- .../060_wp6_client_initiated.md | 6 +- .../260926_bug_train_6/000_plan.md | 0 .../260926_bug_train_6/010_roadmap.md | 0 .../260926_bug_train_6/020_batch7.md | 0 .../030_post_merge_fixes.md | 0 .../260926_bug_train_6/040_batch8.md | 0 .../050_windows_mise_launcher.md | 0 .../000_overview.md | 0 .../010_estimation.md | 0 .../260926_kiro_lb_parity2/000_plan.md | 0 .../001_research_gap_inventory.md | 0 .../010_usage_probe_and_restart_continuity.md | 0 .../020_transport_egress_rotation_timeouts.md | 0 ...30_refusal_classes_and_account_failover.md | 0 .../040_account_load_cap_and_least_loaded.md | 0 .../050_per_account_model_catalog.md | 0 .../060_native_device_login.md | 0 .../070_measured_credits_metrics_routable.md | 0 .../080_head_to_head_method.md | 2 +- .../081_head_to_head_result.md | 0 .../090_context_and_timeout_corrections.md | 2 +- .../100_gui_device_login_and_skip_reason.md | 2 +- .../010_plan.md | 0 .../000_index.md | 0 .../010_server_capability.md | 0 .../020_panel_switch.md | 0 .../260926_menubar_quota_widget/000_index.md | 0 .../010_pr1_quota_windows.md | 0 .../020_pr2_widget_reload.md | 0 .../030_pr3_provider_logos.md | 0 .../040_pr4_companion_page.md | 0 .../260926_models_luna6_layout/000_plan.md | 0 .../010_wp2_shadow_source_luna6.md | 0 .../020_wp3_models_layout.md | 0 .../030_wp4_integration_pr.md | 0 .../010_wp1_quota_strip.md | 0 .../000_overview.md | 0 .../260926_unique_tool_call_ids/010_remint.md | 0 .../260927_merge_train_2/000_roadmap.md | 0 .../260927_merge_train_2/010_wave2.md | 0 .../260927_merge_train_2/020_outcome.md | 0 .../260927_merge_train_3/000_roadmap.md | 2 +- .../260927_merge_train_3/010_batch1.md | 0 .../260927_merge_train_3/020_batch2.md | 0 .../260927_merge_train_3/030_batch3.md | 0 .../260927_merge_train_3/040_batch4.md | 0 .../260927_merge_train_3/050_batch5.md | 0 .../260927_merge_train_3/060_batch6.md | 0 .../260927_merge_train_3/070_batch7.md | 0 .../260927_merge_train_3/080_batch8.md | 0 .../260927_merge_train_3/085_batch9.md | 0 .../260927_merge_train_3/090_outcome.md | 0 .../260927_merge_train_3/095_batch10.md | 0 .../260927_merge_train_3/097_batch11.md | 0 .../account-pool/000_plan.md | 4 +- .../account-pool/001_inventory.md | 2 +- .../account-pool/010_pause.md | 0 .../account-pool/020_desktop.md | 0 .../account-pool/030_auth_failover.md | 0 .../account-pool/040_closeout.md | 0 .../bug-hardening/000_plan.md | 2 +- .../bug-hardening/010_adapter_bounds.md | 0 .../bug-hardening/020_native_quota.md | 0 .../bug-hardening/030_restart_transaction.md | 0 .../bug-hardening/040_link_ssh.md | 0 .../bug-hardening/050_disposition_and_ci.md | 0 .../060_sibling_home_client_sync.md | 0 .../clients-proxy/000_plan.md | 0 .../clients-proxy/010_recipe.md | 0 .../clients-proxy/020_macos_proxy.md | 0 .../clients-proxy/030_qoder.md | 0 .../clients-proxy/040_kilo.md | 0 .../clients-proxy/050_droid.md | 0 .../clients-proxy/060_jev.md | 0 .../clients-proxy/070_memory.md | 0 .../clients-proxy/080_held_items.md | 0 .../clients-proxy/090_final_ci.md | 2 +- .../clients-proxy/100_outcome.md | 0 .../260927_release_train_4/gui-ux/000_plan.md | 0 .../gui-ux/001_inventory.md | 0 .../gui-ux/002_ux_states.md | 0 .../gui-ux/003_audit.md | 0 .../gui-ux/004_ui_baseline.md | 0 .../gui-ux/010_model_settings.md | 0 .../gui-ux/011_model_settings_evidence.md | 0 .../gui-ux/012_model_settings_done.md | 0 .../gui-ux/020_combo_sidecar.md | 0 .../gui-ux/030_visibility.md | 0 .../gui-ux/040_dispositions.md | 0 .../gui-ux/050_integration.md | 0 .../issue-triage/000_plan.md | 2 +- .../issue-triage/010_issue_actions.md | 0 .../issue-triage/020_pr_actions.md | 0 .../issue-triage/030_standalone_carry.md | 2 +- .../issue-triage/040_outcome.md | 2 +- .../picker-ca/000_plan.md | 0 .../picker-ca/010_ca_publication.md | 0 .../picker-ca/020_desktop_continuity.md | 0 .../picker-ca/030_codex_drift_heal.md | 0 .../picker-ca/040_integration.md | 2 +- .../provider-compat/000_plan.md | 2 +- .../001_candidate_inventory.md | 0 .../provider-compat/010_images.md | 0 .../provider-compat/020_response_tier.md | 0 .../provider-compat/030_issues.md | 0 .../provider-compat/040_integration.md | 0 .../provider-compat/050_trial_nux.md | 0 .../provider-compat/060_merge.md | 2 +- .../260928_rt5_reasoning_zen/000_plan.md | 0 .../010_hide_raw_reasoning.md | 0 .../020_zen_keyless_disposition.md | 0 .../260930_codex_credits_bar/000_plan.md | 0 .../010_phase1_credits_implementation.md | 0 .../020_phase2_pr_ci_merge.md | 0 .../260930_gpt_6_1_sol_rollout/000_README.md | 0 .../010_research_digest.md | 0 .../020_catalog_surfaces.md | 0 .../030_default_swap.md | 0 .../040_tokenlab_protocols.md | 0 .../260930_gpt_6_1_sol_rollout/050_release.md | 0 .../260930_grok47_build_unify/000_plan.md | 0 .../010_probe-evidence.md | 0 .../260930_local_test_stability/000_README.md | 0 .../010_diagnosis_and_plan.md | 0 .../000_README.md | 0 .../010_evidence_and_plan.md | 0 .../261001_jev_decision_routing/000_plan.md | 0 .../010_wp1_backend_interface.md | 0 .../020_wp2_model_backend_surfaces.md | 0 .../030_wp3_dashboard_docs.md | 0 .../040_wp4_landing.md | 0 .../010_finish_carry.md | 0 .../261002_claude_cli_picker/010_plan.md | 0 .../261002_claude_cli_picker/020_audit.md | 0 .../000_scope_and_boundary.md | 0 .../010_extraction_map.md | 0 .../020_contract_and_test_matrix.md | 0 .../030_foundation_implementation.md | 0 .../040_command_implementation.md | 0 .../050_cleanup_and_rebase_validation.md | 0 .../261003_lane_e_recovery/000_plan.md | 0 .../261003_lane_e_recovery/010_recovery.md | 0 .../261003_lane_e_recovery/090_summary.md | 0 .../000_plan.md | 0 .../010_replay.md | 0 .../261003_release_lane_a/000_plan.md | 0 .../261003_release_lane_a/001_evidence.md | 0 .../010_native_upload.md | 0 .../020_messages_context.md | 0 .../030_review_publication.md | 0 .../261003_release_lane_c/000_plan.md | 0 .../261003_release_lane_c/010_antigravity.md | 0 .../261003_release_lane_c/020_ollama.md | 0 .../261003_release_lane_c/030_handoff.md | 0 .../261003_release_lane_d/000_plan.md | 0 .../261003_release_stabilization/000_plan.md | 0 .../010_stabilization.md | 0 .../011_native_and_merge_acceptance.md | 0 .../012_integration_evidence.md | 0 .../015_independent_regression.md | 0 .../016_regression_acceptance.md | 0 .../020_candidate.md | 0 .../021_candidate_first_run.md | 0 .../022_candidate_acceptance.md | 0 .../030_publication.md | 0 .../031_publication_outcome.md | 0 .../261009_desktop_owned_path_cli/000_plan.md | 2 +- .../001_audit_evidence.md | 0 .../002_architecture.md | 2 +- .../003_reflection.md | 44 +++---- .../010_desktop_cli_command.md | 0 .../011_wp1_execution.md | 0 .../019_wp1_done.md | 0 .../020_launcher_handoff_and_diagnostics.md | 4 +- .../021_wp2_execution.md | 0 .../030_docs_review_merge.md | 0 .../031_wp3_review_fixes.md | 0 .../032_wp3_cycle1_outcome.md | 0 .../040_wp4_land.md | 0 .../049_outcome.md | 0 .../261010_cli_path_crossos_probe/000_plan.md | 2 +- .../260908_provider_runtime_stack/000_plan.md | 65 ----------- .../010_layer_plan.md | 34 ------ .../011_conflict_map.md | 24 ---- .../012_mark_sourcing.md | 23 ---- .../013_secondary_dispositions.md | 23 ---- .../020_wp2_carry.md | 23 ---- .../030_wp3_marks_docs.md | 15 --- .../040_wp4_publish_merge.md | 16 --- .../050_delivery_record.md | 58 ---------- .../060_ledger.md | 17 --- .../005_lane_feature_issues_and_stale_prs.md | 2 +- .../008_lane_stale_tail.md | 2 +- .../030_wp3_small_and_sponsors.md | 2 +- .../260910_post249_round2/_research/_audit.md | 30 ----- .../000_plan.md | 2 +- .../000_plan.md | 108 ------------------ .../260928_macos_quota_gate/000_design.md | 2 +- gui/src/action-dialogs.ts | 2 +- gui/src/pages/models-alias-editing.ts | 2 +- gui/src/ui.tsx | 2 +- gui/tests/models-alias-edit-emphasis.test.ts | 2 +- gui/tests/models-cap-cluster.test.ts | 2 +- gui/tests/models-control-affordances.test.ts | 2 +- gui/tests/models-provider-head.test.ts | 2 +- gui/tests/switch-labeled-dom.test.tsx | 2 +- src/adapters/cursor/catalog.ts | 4 +- src/adapters/cursor/effort-map.ts | 2 +- src/adapters/devin/live-models.ts | 4 +- src/claude/desktop-picker.ts | 2 +- src/cli/resolve.ts | 2 +- src/clients/config-export.ts | 2 +- src/codex/catalog/native-models.ts | 2 +- src/codex/desktop-app-restart.ts | 2 +- src/codex/desktop-app/darwin.ts | 2 +- src/codex/desktop-app/handoff.ts | 2 +- src/codex/desktop-app/linux.ts | 2 +- src/codex/desktop-app/lock.ts | 2 +- src/codex/desktop-app/types.ts | 2 +- src/codex/desktop-app/windows.ts | 2 +- src/integrations/cursor-detect.ts | 2 +- src/oauth/index.ts | 2 +- src/oauth/meta-muse-device.ts | 2 +- src/oauth/types.ts | 2 +- src/providers/anthropic-fast.ts | 2 +- src/providers/anthropic-reset-grant-ledger.ts | 2 +- src/providers/devin-cli-authmode-migration.ts | 2 +- .../devin-provider-merge-migration.ts | 2 +- src/providers/model-presets.ts | 2 +- src/providers/muse-subscription-usage.ts | 2 +- src/providers/registry/entries-core.ts | 12 +- src/providers/registry/model-seeds.ts | 6 +- src/providers/xai-fast-model.ts | 2 +- src/server/management/route-registry.ts | 4 +- src/usage/expected-prices.ts | 2 +- structure/adapters/registry.md | 2 +- structure/desktop-terminal-command.md | 2 +- structure/gui-and-management-api.md | 4 +- structure/providers/cursor.md | 2 +- structure/providers/xai-grok.md | 4 +- structure/transports/responses-wire-shapes.md | 2 +- .../anthropic/anthropic-fast-opt-in.test.ts | 2 +- tests/ci-workflows/file-size-ratchet.test.ts | 2 +- .../configured-native-models.test.ts | 2 +- .../codex-integration/gpt61-sol-rows.test.ts | 2 +- tests/gui/platform-dialog-guard.test.ts | 2 +- .../cursor/cursor-effort-suffix.test.ts | 2 +- tests/providers/tokenlab-protocols.test.ts | 2 +- .../xai/grok-47-build-fast-metadata.test.ts | 2 +- 1431 files changed, 249 insertions(+), 655 deletions(-) rename devlog/{_plan => _fin}/260819_next_roadmap/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/010_r1_split_rebase.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/020_r2_temp_reclaim_merge.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/030_r3_collisions_and_retargets.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/031_r3_posted_decisions.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/040_r4_modelrecordvalue_batch.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/041_r4_posted_verdicts.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/050_execution_ledger.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/060_outcome.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/070_next_roadmap_split_and_dogfood.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/080_merge_loop_ledger.md (100%) rename devlog/{_plan => _fin}/260819_next_roadmap/090_merge_loop_outcome.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/000_investigation.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/010_ranking.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/020_2114_systemd_bus.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/030_2107_service_proxy_env.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/031_2107_implementation.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/040_2108_windows_reboot_gate.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/050_1587_deferred_catalog.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/060_1933_tray_encoding.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/061_1933_implementation.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/070_sequencing.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/075_verification.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/080_outcome.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/090_1527_abort_slice.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/100_post_split_rebase.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/110_2114_disposition.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/120_2108_phase1.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/121_2108_implementation.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/130_ci_proxy_env_leak.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/140_final_audit.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/150_outcome.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/170_2114_2108_fences.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/180_windows_leg.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/190_release_readiness.md (100%) rename devlog/{_plan => _fin}/260819_unclaimed_bug_selection/200_local_windows_verification.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/000_triage_matrix.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/001_dependency_analysis.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/002_audit_synthesis.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/010_fix_dev_macos_ci.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/020_merge_2295.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/030_merge_2294.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/040_merge_2296.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/050_merge_2289.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/060_merge_2270.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/065_merge_2281.md (100%) rename devlog/{_plan => _fin}/260821_bug_merge_train/070_final_gate.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/000_plan.md (98%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/003_protocol_compare.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/004_auth_catalog_compare.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/005_exec_compare.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/006_stream_overflow_compare.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/007_cli_fallback.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/090_transfer_verdict.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/110_stream_health_watchdog.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/120_small_hardening_pair.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/200_round3_probe_plan.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/210_maxmode.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/220_rotation.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/230_issue2305.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/240_client_version.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/250_billed_usage.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/260_re_classification_refinement.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/290_round3_lock.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/300_opus_fast_catalog.md (100%) rename devlog/{_plan => _fin}/260822_senpi_cursor_transfer/310_maxmode_bigctx.md (100%) rename devlog/{_plan => _fin}/260824_model_ux_aliases_and_defaults/000_plan.md (97%) rename devlog/{_plan => _fin}/260824_model_ux_aliases_and_defaults/010_aliases.md (100%) rename devlog/{_plan => _fin}/260824_model_ux_aliases_and_defaults/020_new_models_off.md (100%) rename devlog/{_plan => _fin}/260824_model_ux_aliases_and_defaults/030_default_preset.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/000_baseline_and_scope.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/001_current_state_inventory.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/002_plan_audit.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/010_wp2_issue2457_sidecar_backend_resolution.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/020_wp3_issue2411_status_routing_visibility.md (100%) rename devlog/{_plan => _fin}/260825_operator_visibility_train/030_wp4_issue2412_version_manager_shim.md (100%) rename devlog/{_plan => _fin}/260826_config_rebase_provenance/010_design.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/000_plan.md (97%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/001_seed_thread_failure_catalog.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/010_probe_campaign.md (99%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/020_gap_summary.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/025_ultra_k3_research.md (96%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/030_callid_sse_parity.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/040_preamble_floor.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/050_checkpoint_continuity.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/060_catalog_honesty.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/070_ultra_mode.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/080_stall_corruption_diag.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/090_gap8_codex_exec_qa.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/100_wire_ndjson_qa.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/110_app_route_qa.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/120_repetition_breaker.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/130_envelope_echo_guard.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/140_round2_probe_results.md (100%) rename devlog/{_plan => _fin}/260826_cursor_responses_gap/150_routing_commentary_hallucination.md (100%) rename devlog/{_plan => _fin}/260826_pre_substrate_adoption/010_design.md (100%) rename devlog/{_plan => _fin}/260826_provenance_writer/010_design.md (100%) rename devlog/{_plan => _fin}/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md (100%) rename devlog/{_plan => _fin}/260826_session_lane_bounds/010_design.md (100%) rename devlog/{_plan => _fin}/260826_session_lane_bounds/020_reconnect_followup.md (100%) rename devlog/{_plan => _fin}/260826_wp7e_presence_driven_oauth_failover/010_plan.md (100%) rename devlog/{_plan => _fin}/260826_wp7e_presence_driven_oauth_failover/011_audit_response.md (100%) rename devlog/{_plan => _fin}/260826_wp7e_presence_driven_oauth_failover/020_execution.md (100%) rename devlog/{_plan => _fin}/260826_wp7e_presence_driven_oauth_failover/030_post_merge_f5.md (100%) rename devlog/{_plan => _fin}/260827_kiro_builder_id_profile/010_builder_id_request_scoped_profile.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/000_research_problem_and_state.md (98%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/001_research_upstream_wire_contract.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/002_research_kirolb_headtohead.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/003_research_pr_reconciliation.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/010_kiro_usage_fetcher.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/020_per_account_quota_wiring.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/030_quota_aware_pool_selection.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/040_surfaces_cli_gui_docs.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/050_verification_and_delivery.md (97%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/060_audit_round1_amendments.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/070_audit_round2_amendments.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/080_head_to_head_result.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/090_predispatch_selection.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/100_quota_persistence.md (100%) rename devlog/{_plan => _fin}/260829_kiro_quota_pool/110_integrated_verification.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/000_baseline_and_roadmap.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/010_toggle_basis_and_shrink.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/011_rejected_designs.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/020_control_affordances.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/030_uniform_row_and_hover.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/040_cap_cluster_and_occupied_slot.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/050_hover_affordance_and_column_gate.md (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/010-after-ko-1100.png (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/010-before-ko-1100.png (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/020-after-labeled-switch-ko-1280.png (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/020-after-labels.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/030-baseline.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/030-geometry-harness.ts (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/030-locale-harness.ts (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/030-locale-sweep.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/040-after-cap-slot-ko-1280.png (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/040-geometry-harness.ts (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/050-state-harness.ts (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/wp2-states.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/wp2-touch.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/wp3-geometry.json (100%) rename devlog/{_plan => _fin}/260830_models_provider_header/evidence/wp3-state.json (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/000_plan.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/002_audit_round1_synthesis.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/010_wp1_3114_docs_devlog.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/011_wp1_outcome.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/020_wp2_3122_provider_patch_fakeip.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/021_wp2_security_review.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/030_wp3_3104_service_and_closeouts.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/031_wp3_outcome.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/040_wp4_3042_pid_probe.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/050_wp5_close_3077_rebase_3109_3112.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/051_wp5_outcome.md (100%) rename devlog/{_plan => _fin}/260901_merge_train_round3/060_wp7_websocket_refresh_flake.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/000_plan.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/010_phase1.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/011_bd1_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/020_phase2.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/021_bd2_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/030_phase3.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/031_bd3_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/040_phase4.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/041_bd4_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/050_bd5_replan.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/050_phase5.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/051_i3141.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/052_i3152.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/053_i3136.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/054_i3150.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/055_i3155.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/056_i1419.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/057_i2999.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/058_i2813.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/059_i1527.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/060_phase6.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/061_p3193.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/062_p3193_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/063_i3217.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/064_i3217_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/070_regaudit.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/071_regaudit_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/072_regaudit2.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/080_p3226.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/081_p3226_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/082_p3227.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/083_p3227_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/084_p3228.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/085_p3228_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/086_p3229.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/087_p3229_landing.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/088_r3239.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/089_p3232.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/090_regaudit3.md (100%) rename devlog/{_plan => _fin}/260902_bug_label_drawdown/091_rv3239.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/000_research.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/001_bundle_protocol.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/005_audit_round1.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/010_wp1_bundle_effort_table.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/020_wp2_models_max_output.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md (99%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/040_wp4_gui_provenance_hint.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/041_wp4_screenshot.png (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/050_wp5_claude_id_normalizer.md (100%) rename devlog/{_plan => _fin}/260902_cursor_bundle_effort_table/060_wp6_guide.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/000_research.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/005_audit_round1.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/006_roadmap_lock.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/007_audit_round1_reviewer.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/010_layer1_server_status.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/020_layer2_gui_tab.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/030_layer3_docs.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/040_publish_stack.md (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/assets/cursor-overview-card.png (100%) rename devlog/{_plan => _fin}/260902_cursor_integrations_tab/assets/cursor-tab-detected.png (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/000_scope.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/010_wp1_adaptive_reasoning_effort.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/011_wp1_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/020_wp2_outbound_body_guard.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/021_wp2_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/030_wp3_compaction_provider.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/031_wp3_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/040_wp4_retain_models.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/041_wp4_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/050_wp5_xai_imagine_carry.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/051_wp5_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/060_wp6_authless_desktop.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/061_wp6_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/070_wp7_shim_free_token.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/071_wp7_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/080_wp8_windows_proxy_auto.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/081_wp8_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/090_wp9_keychain_keys.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/091_wp9_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/100_wp10_display_names_carry.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/101_wp10_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/110_wp11_antigravity_account_quota.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/111_wp11_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/120_wp12_oauth_pool_capability.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/121_wp12_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/131_wp13_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/140_wp14_upstream_ws_carry.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/141_wp14_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/150_wp15_plaintext_v2_disposition.md (100%) rename devlog/{_plan => _fin}/260902_nonbug_adoption_backlog/151_wp15_audit_r1_synthesis.md (100%) rename devlog/{_plan => _fin}/260904_flagship_native_always_visible/000_research.md (100%) rename devlog/{_plan => _fin}/260904_flagship_native_always_visible/005_audit_synthesis.md (100%) rename devlog/{_plan => _fin}/260904_flagship_native_always_visible/010_wp2_ungate.md (100%) rename devlog/{_plan => _fin}/260904_flagship_native_always_visible/020_wp3_landing.md (100%) rename devlog/{_plan => _fin}/260905_astra_subagent_roster/000_plan.md (100%) rename devlog/{_plan => _fin}/260905_astra_subagent_roster/010_roster_upgrade.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/000_plan.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/001_source_contract.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/002_audit_synthesis.md (91%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/003_roadmap_outcome.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/010_protocol.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/011_protocol_build.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/012_protocol_outcome.md (100%) rename devlog/{_plan => _fin}/260905_http_upstream_ws_parity/020_lifecycle.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/000_plan.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/001_source_findings.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/002_audit_synthesis.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/010_policy.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/011_policy_dispatch_contract.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/012_implementation_review.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/013_window_priority_steering.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/014_runtime_evidence.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/015_recovery_review.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/016_policy_input_review.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/017_persisted_policy_validation.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/018_dev_integration.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/019_quota_provenance_integration.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/020_settings.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/021_settings_dispatch.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/en-confirm-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/en-confirm-mobile.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-blocked-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-confirm-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-confirm-mobile.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-confirm-tablet.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-mobile.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-setting-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-setting-integrated-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/022_ui_evidence/ko-zero-unlocked-desktop.jpg (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/023_ui_review.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/024_ui_verification.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/025_focus_review.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/026_ui_dev_integration.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/030_reserve_compatibility.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/031_reserve_dispatch_contract.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/032_reserve_audit.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/033_parent_review_amendment.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/034_recovery_evidence_validation.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/039_reserve_verification.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/040_delivery.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/041_stack_ci_repairs.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/044_ingress_verification.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/047_claude_policy_verification.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/049_delivery_dispatch.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/050_ci_contract_repairs.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/052_loopback_target_parity.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/059_runtime_landing.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/063_ui_landing.md (100%) rename devlog/{_plan => _fin}/260905_main_quota_guard/064_final_rebase.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/000_plan.md (98%) rename devlog/{_plan => _fin}/260905_open_work_closeout/001_lane_bug_prs_a.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/002_lane_bug_prs_b.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/003_lane_v2_and_quota.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/004_lane_else_prs.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/005_lane_bug_issues.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/006_dispositions.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/007_audit_wp0.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/008_audit_synthesis.md (96%) rename devlog/{_plan => _fin}/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/011_wp1_execution.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/012_wp1_delivery_record.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/021_wp2_scope_amendment.md (95%) rename devlog/{_plan => _fin}/260905_open_work_closeout/024_wp2_delivery_record.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/031_wp3_reverify.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/032_wp3_delivery_record.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/041_wp4_reverify.md (92%) rename devlog/{_plan => _fin}/260905_open_work_closeout/044_wp4_delivery_record.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/050_wp5_stack_e_else.md (99%) rename devlog/{_plan => _fin}/260905_open_work_closeout/051_wp5_reverify.md (89%) rename devlog/{_plan => _fin}/260905_open_work_closeout/052_wp5_delivery.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/053_residual_integration.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/054_final_ci_pin.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/055_linux_ci_repair.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/056_second_ci_head.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/057_coordinated_final_ci.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/058_final_execution_result.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/059_owner_directed_stop.md (100%) rename devlog/{_plan => _fin}/260905_open_work_closeout/060_ledger.md (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/000_plan.md (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/001_roadmap_audit.md (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/010_initial_selection.md (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/020_registration_guidance.md (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/021_registration_notice.png (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/022_models_all_off.png (100%) rename devlog/{_plan => _fin}/260905_provider_registration_selection/023_onboarding_verification.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/000_plan.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/001_attribution_evidence.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/002_audit_synthesis.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/010_attribution.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/011_attribution_build.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/012_premerge_review.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/013_ci_test_boundaries.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/014_recovery_fixture_isolation.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/020_account_quota_api.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/021_api_build.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/030_quota_views.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/031_ui_build.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/040_stack_landing.md (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/011_usage_attribution.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/031_current_overview.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/032_current_usage.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/033_oauth_accounts.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/034_api_key_balances.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/035_passive_current_unobserved.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/036_pool_current.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/037_tablet_usage.png (100%) rename devlog/{_plan => _fin}/260905_provider_usage_quota_parity/assets/039_mobile_current.png (100%) rename devlog/{_plan => _fin}/260906_aside_profiles/000_research.md (100%) rename devlog/{_plan => _fin}/260906_aside_profiles/010_profiles_backend_cli.md (100%) rename devlog/{_plan => _fin}/260906_aside_profiles/020_profiles_gui.md (100%) rename devlog/{_plan => _fin}/260906_grok_catalog_and_patch/000_research.md (100%) rename devlog/{_plan => _fin}/260906_grok_catalog_and_patch/010_export_selection.md (100%) rename devlog/{_plan => _fin}/260906_grok_catalog_and_patch/020_owned_refresh.md (100%) rename devlog/{_plan => _fin}/260906_grok_catalog_and_patch/030_responses_patch.md (100%) rename devlog/{_plan => _fin}/260906_grok_catalog_and_patch/040_native_tool_parity.md (100%) rename devlog/{_plan => _fin}/260906_key_login_ci_timeout/000_plan.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/000_plan.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/001_roadmap_lock.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/010_policy.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/011_policy_implementation.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/020_task_input.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/021_task_input_implementation.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/022_management_auth_port_fixture.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/030_kiro_results.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/031_kiro_result_implementation.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/032_review_doc_format.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/033_web_search_deadline_fixture.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/040_opaque_recovery.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/041_opaque_recovery_implementation.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/050_combo_recovery.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/051_combo_recovery_implementation.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/052_shutdown_fixture.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/060_grok_terminal.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/070_quota_proxy.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/071_quota_proxy_outcome.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/080_usage_source.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/082_recovery_doc_alignment.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/090_dashboard.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/091_dashboard_verification.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/100_release.md (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-1024.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-1440-dark.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-1440-lower.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-1440-zoom2.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-1440.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-320-empty-repeat.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-320-interaction.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-320-keyboard-open.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-320-lower.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-320.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-390.png (100%) rename devlog/{_plan => _fin}/260906_release_244_followups/screenshots/dashboard-768.png (100%) rename devlog/{_plan => _fin}/260906_stateful_task_guidance/000_plan.md (100%) rename devlog/{_plan => _fin}/260906_stateful_task_guidance/010_raw_boundary.md (100%) rename devlog/{_plan => _fin}/260906_stateful_task_guidance/011_implementation.md (100%) rename devlog/{_plan => _fin}/260906_unix_shim_ci_restore/000_plan.md (100%) rename devlog/{_plan => _fin}/260906_unix_shim_ci_restore/010_repair.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/010_web_search.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/020_vision.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/030_health.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/040_desktop.md (100%) rename devlog/{_plan => _fin}/260907_lane_c/050_fallback.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/001_roadmap_audit.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/010_thinking.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/020_receipt.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/030_account_prices.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/040_price_editor.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/050_usage_ranges.md (100%) rename devlog/{_plan => _fin}/260907_lane_d/060_delivery.md (100%) rename devlog/{_plan => _fin}/260907_next_release_recommendations/000_plan.md (98%) rename devlog/{_plan => _fin}/260907_next_release_recommendations/010_recommendations.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/001_plan_audit.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/010_oauth_teardown.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/020_container_smoke.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/025_container_lifecycle_mode.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/030_container_ci.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/035_body_diagnostics.md (100%) rename devlog/{_plan => _fin}/260907_platform_validation/040_residual_evidence.md (100%) rename devlog/{_plan => _fin}/260907_release_note_prefix/010_implementation.md (100%) rename devlog/{_plan => _fin}/260907_release_train/000_plan.md (98%) rename devlog/{_plan => _fin}/260907_release_train/010_wp1_execution.md (100%) rename devlog/{_plan => _fin}/260907_release_train/090_readiness.md (100%) rename devlog/{_plan => _fin}/260907_release_train_b/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_release_train_b/010_carry.md (100%) rename devlog/{_plan => _fin}/260907_release_train_b/020_carry.md (100%) rename devlog/{_plan => _fin}/260907_router_selection_capture/010_implementation.md (100%) rename devlog/{_plan => _fin}/260907_sponsor_branches/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_sponsor_branches/010_phase1.md (100%) rename devlog/{_plan => _fin}/260907_sponsor_branches/020_phase2.md (100%) rename devlog/{_plan => _fin}/260907_sponsor_branches/030_phase3.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/000_plan.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/010_chat_json_sse.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/011_chat_audit_amendment.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/020_refusal.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/030_custom_efforts.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/040_hosted_search_disposition.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/050_claude_compatibility.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/060_remote_delivery.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/070_windows_fixture_cache.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/080_windows_sync_preparation.md (100%) rename devlog/{_plan => _fin}/260907_track2_protocol/090_windows_shim_budget.md (100%) rename devlog/{_plan => _fin}/260908_sponsor_overview/010_overview.md (100%) rename devlog/{_plan => _fin}/260908_voice_relay/000_plan.md (100%) rename devlog/{_plan => _fin}/260908_voice_relay/001_sources.md (100%) rename devlog/{_plan => _fin}/260909_codex_credential_health_chain/000_plan.md (100%) rename devlog/{_plan => _fin}/260909_codex_credential_health_chain/010_wp1_terminal_verdict.md (100%) rename devlog/{_plan => _fin}/260909_codex_credential_health_chain/020_wp2_quota_registration.md (100%) rename devlog/{_plan => _fin}/260909_codex_credential_health_chain/030_wp3_anthropic_plan.md (100%) rename devlog/{_plan => _fin}/260909_config_mutation_lock_windows/000_plan.md (100%) rename devlog/{_plan => _fin}/260909_mid_thread_agent_task_recovery/000_plan.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/000_plan.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/010_reconciliation.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/020_branch_worktree_cleanup.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/030_issue_disposition.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/040_dispatch_roadmap.md (100%) rename devlog/{_plan => _fin}/260909_post249_scope_cleanup/050_delivery_record.md (100%) rename devlog/{_plan => _fin}/260909_usage_custom_range_disclosure/000_plan.md (100%) rename devlog/{_plan => _fin}/260909_usage_custom_range_disclosure/010_audit.md (100%) rename devlog/{_plan => _fin}/260909_usage_custom_range_disclosure/assets/010_before.png (100%) rename devlog/{_plan => _fin}/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png (100%) rename devlog/{_plan => _fin}/260909_usage_custom_range_disclosure/assets/030_after_open.png (100%) rename devlog/{_plan => _fin}/260909_xai_oauth_retry_hardening/000_plan.md (98%) rename devlog/{_plan => _fin}/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md (100%) rename devlog/{_plan => _fin}/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/000_plan.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/010_audit_lanes.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/020_release_plan.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/030_evidence.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/040_triage_protocol.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/050_lane_packets.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/060_release_readiness.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/070_release_execution.md (100%) rename devlog/{_plan => _fin}/260910_250_regression_audit_release/080_delivery_record.md (100%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/000_plan.md (97%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/010_protocol_identity.md (100%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/020_cli_jaw_inventory.md (100%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/030_opencodex_seams.md (100%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/040_feasibility_verdict.md (100%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/050_audit.md (99%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/060_done.md (99%) rename devlog/{_plan => _fin}/260910_cursor_acp_bridge/070_live_trace.md (100%) rename devlog/{_plan => _fin}/260910_live_service_manager_guard/000_plan.md (97%) rename devlog/{_plan => _fin}/260910_post249_round2/000_plan.md (98%) rename devlog/{_plan => _fin}/260910_post249_round2/010_lane_split.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/020_4129_shadow_combo_failover.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/030_4148_claude_system_hoist.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/040_4141_launchctl_bootout.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/050_3666_free_model_filter.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/060_4075_gemini_setup_ux.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/070_3859_email_mask_toggle.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/080_1711_zero_credit_catalog.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/090_4038_decode_rate.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/100_4147_zcode_reasoning_landing.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/110_delivery_record.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/120_landing_gate_decision.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/1711.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/3666.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/3859.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/4038.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/4075.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/4129.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/4141.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/4148.md (100%) create mode 100644 devlog/_fin/260910_post249_round2/_research/_audit.md rename devlog/{_plan => _fin}/260910_post249_round2/_research/_audit_pr4153.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/_audit_wp2.md (100%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/_audit_wp3.md (97%) rename devlog/{_plan => _fin}/260910_post249_round2/_research/_audit_wp3b.md (100%) rename devlog/{_plan => _fin}/260910_readme_i18n_parity/000_plan.md (100%) rename devlog/{_plan => _fin}/260910_readme_i18n_parity/010_phase1_parity_guard.md (100%) rename devlog/{_plan => _fin}/260910_readme_i18n_parity/020_phase2_locale_resync.md (100%) rename devlog/{_plan => _fin}/260910_readme_i18n_parity/030_phase3_delivery.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/000_plan.md (99%) rename devlog/{_plan => _fin}/260911_account_pool_unification/010_phase1_manual_selection.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/020_phase2_shared_kernel.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/030_phase3_cache_affinity.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/040_phase4_key_pool_strategy.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/050_phase5_surface_consolidation.md (100%) rename devlog/{_plan => _fin}/260911_account_pool_unification/assets/wp5b-pool-settings.png (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/000_plan.md (99%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/010_evidence.md (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/020_architecture_dispositions.md (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/030_test_impact.md (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/040_open_gaps.md (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/050_revalidation.md (100%) rename devlog/{_plan => _fin}/260911_catalog_presentation_and_effort_projection/060_done.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/000_plan.md (98%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/001_evidence.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/002_inventory.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/010_phase1_pr4258.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/020_phase2_v41_rollout.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/030_phase3_v4pro_removal.md (100%) rename devlog/{_plan => _fin}/260911_deepseek_v41_transition/040_phase4_merge.md (100%) rename devlog/{_plan => _fin}/260911_devin_two_providers/001_plan.md (100%) rename devlog/{_plan => _fin}/260911_devin_two_providers/002_audit.md (100%) rename devlog/{_plan => _fin}/260911_devin_two_providers/003_live_evidence.md (100%) rename devlog/{_plan => _fin}/260911_devin_two_providers/004_devin_cli_split.md (100%) rename devlog/{_plan => _fin}/260911_hub_single_port/010_launchd_repair.md (100%) rename devlog/{_plan => _fin}/260911_hub_single_port/020_loopback_companion.md (99%) rename devlog/{_plan => _fin}/260911_hub_single_port/030_hub_local_clients.md (99%) rename devlog/{_plan => _fin}/260911_hub_single_port/040_hub_token_ux.md (99%) rename devlog/{_plan => _fin}/260911_hub_single_port/050_docs_skill.md (99%) rename devlog/{_plan => _fin}/260911_hub_single_port/060_client_hub_state.md (99%) rename devlog/{_plan => _fin}/260911_l1_responses_core/000_packet.md (98%) rename devlog/{_plan => _fin}/260911_l2_catalog_provider/000_packet.md (97%) rename devlog/{_plan => _fin}/260911_l2_catalog_provider/010_4201_quota_admission.md (100%) rename devlog/{_plan => _fin}/260911_l2_catalog_provider/020_flash_upstream_evidence.md (100%) rename devlog/{_plan => _fin}/260911_l3_account_pool/000_packet.md (98%) rename devlog/{_plan => _fin}/260911_l3_account_pool/010_wp1_4126_warmup.md (100%) rename devlog/{_plan => _fin}/260911_l3_account_pool/020_wp2_4212_attribution.md (100%) rename devlog/{_plan => _fin}/260911_l3_account_pool/030_wp3_4211_plan_exclusion.md (100%) rename devlog/{_plan => _fin}/260911_l4_service_cli/000_packet.md (98%) rename devlog/{_plan => _fin}/260911_l4_service_cli/010_wp1_pnpm_self_update.md (100%) rename devlog/{_plan => _fin}/260911_l4_service_cli/020_wp2_stop_refusal.md (100%) rename devlog/{_plan => _fin}/260911_l4_service_cli/030_wp3_client_catalog.md (100%) rename devlog/{_plan => _fin}/260911_l5_integrations_io/000_packet.md (98%) rename devlog/{_plan => _fin}/260911_l6_streaming_tools/000_packet.md (97%) rename devlog/{_plan => _fin}/260911_l6_streaming_tools/010_4191_ws_failure_classification.md (98%) rename devlog/{_plan => _fin}/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md (98%) rename devlog/{_plan => _fin}/260911_l7_docs/000_packet.md (97%) rename devlog/{_plan => _fin}/260911_l7_docs/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260911_l7_docs/020_4215_wording.md (100%) rename devlog/{_plan => _fin}/260911_l7_docs/030_4200_recipe.md (100%) rename devlog/{_plan => _fin}/260911_l7_docs/040_4215_delivery.md (100%) rename devlog/{_plan => _fin}/260911_l7_docs/050_4200_delivery.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/000_plan.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/010_lane_partition.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/020_lane_packets.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/030_audit_round1.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/040_audit_round2.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/050_audit_round3.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/060_ledger.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/070_dispatch_handoff.md (92%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/080_wp2_publish_plan.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/090_wp2_execution.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/100_wp3_plan.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/110_tracking_refresh.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/120_wp4_plan.md (100%) rename devlog/{_plan => _fin}/260911_lane_dispatch_round/130_wp4_feasibility.md (100%) rename devlog/{_plan => _fin}/260911_ocx_login_codex_routing/000_plan.md (100%) rename devlog/{_plan => _fin}/260911_ocx_login_codex_routing/010_audit_round1.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/000_plan.md (98%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/001_issue_triage.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/002_cross_proxy_survey.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/003_registry_gap_inventory.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/004_audit_rounds.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/010_phase1_preset_structured_output.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/020_phase2_preset_consistency_guard.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/030_phase3_docs_and_pr.md (100%) rename devlog/{_plan => _fin}/260911_opencode_go_free_stabilization/031_wp4_outcome.md (100%) rename devlog/{_plan => _fin}/260911_r2_merge_train/000_plan.md (100%) rename devlog/{_plan => _fin}/260911_r2_merge_train/010_phase1_pr4244.md (100%) rename devlog/{_plan => _fin}/260911_r2_merge_train/020_phase2_pr4248.md (100%) rename devlog/{_plan => _fin}/260911_r2_merge_train/030_phase3_pr4246.md (100%) rename devlog/{_plan => _fin}/260911_r2_merge_train/040_phase4_pr4247.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/000_plan.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/010_journey_evaluation.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/020_design_record.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/025_audit_round1.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/030_wp2_plan.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/040_wp3_plan.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/045_wp4_plan.md (100%) rename devlog/{_plan => _fin}/260911_ws_commit_boundary/050_review.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/002_review_disposition.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/010_transcription.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/011_transcription_checks.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/020_streaming_voice.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/021_streaming_checks.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/030_connections.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/031_connections_checks.md (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/screenshots/audio-1440-light.png (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/screenshots/audio-320-ko.png (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/screenshots/audio-390-light.png (100%) rename devlog/{_plan => _fin}/260912_audio_apis_stack/screenshots/transcription-layer-baseline.png (100%) rename devlog/{_plan => _fin}/260912_beginner_pdf/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/010_claim.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/020_affinity.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/025_affinity_native.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/026_affinity_adapt.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/027_affinity_slot.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/030_prefix.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/035_prefix_adapt.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/036_prefix_linear.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/037_prefix_slot.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/040_hermes.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/041_hermes_ci_refresh.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/050_verify.md (100%) rename devlog/{_plan => _fin}/260912_cache_lane/060_handoff.md (100%) rename devlog/{_plan => _fin}/260912_campaign_ci_fixtures/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/011_design_reflection.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/020_review.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/022_keyboard_repair.md (100%) rename devlog/{_plan => _fin}/260912_catalog_lane_readiness/030_evidence.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/001_contract.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/009_roadmap_result.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/010_contract.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/019_contract_result.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/020_surfaces.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/029_surfaces_result.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/030_verification.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/039_gui_evidence.md (100%) rename devlog/{_plan => _fin}/260912_cline_client/evidence/cline-export.png (100%) rename devlog/{_plan => _fin}/260912_cline_client/evidence/cline-integration.png (100%) rename devlog/{_plan => _fin}/260912_codex_gpt54_retirement/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_codex_gpt54_retirement/010_catalog_removal.md (100%) rename devlog/{_plan => _fin}/260912_codex_gpt54_retirement/020_defaults_repoint.md (100%) rename devlog/{_plan => _fin}/260912_codex_gpt54_retirement/030_surfaces_and_gate.md (100%) rename devlog/{_plan => _fin}/260912_codex_gpt54_retirement/040_done.md (100%) rename devlog/{_plan => _fin}/260912_codex_spark_retirement/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_codex_spark_retirement/001_source.md (100%) rename devlog/{_plan => _fin}/260912_codex_spark_retirement/010_implementation.md (100%) rename devlog/{_plan => _fin}/260912_codex_spark_retirement/020_review.md (100%) rename devlog/{_plan => _fin}/260912_codex_spark_retirement/030_delivery.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/010_runtime.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/020_editor.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/030_verification.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/031_exhausted.png (100%) rename devlog/{_plan => _fin}/260912_combo_carry/032_unknown.png (100%) rename devlog/{_plan => _fin}/260912_combo_carry/033_expired.png (100%) rename devlog/{_plan => _fin}/260912_combo_carry/034_render_evidence.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/040_pnpm_ci_repair.md (100%) rename devlog/{_plan => _fin}/260912_combo_carry/050_active_reactivation_repair.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/010_cli_token_transition.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/020_cloud_direct_hardening.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/030_cached_token_display.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/040_stacked_delivery.md (100%) rename devlog/{_plan => _fin}/260912_devin_hardening/logs-devin-cached-restored.jpg (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/000_plan.md (99%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/005_status.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/010_architect_dispositions.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/020_reflection_gaps.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/030_audit_round1.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupon_gui/evidence/architect-round1.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/000_plan.md (95%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/001_survey_seams.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/005_status.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/010_phase1_core_client.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/020_phase2_surfaces.md (100%) rename devlog/{_plan => _fin}/260912_grok_reset_coupons/030_phase3_delivery.md (99%) rename devlog/{_plan => _fin}/260912_history_containment/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_history_containment/010_containment.md (100%) rename devlog/{_plan => _fin}/260912_history_containment/020_continuation.md (100%) rename devlog/{_plan => _fin}/260912_history_containment/030_relay.md (100%) rename devlog/{_plan => _fin}/260912_history_containment/040_verification.md (100%) rename devlog/{_plan => _fin}/260912_history_containment/051_resume_status.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/001_reference_measurements.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/002_design_decisions.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/010_wp2_device_core.md (99%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/020_wp3_login_integration.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/030_wp4_header_and_quota.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/040_wp5_tests_and_gate.md (100%) rename devlog/{_plan => _fin}/260912_muse_device_oauth/050_delivery_record.md (100%) rename devlog/{_plan => _fin}/260912_muse_tool_name_alias/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/001_omo_contract.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/002_registration_checklist.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/003_brand_mark_provenance.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/010_wp2_backend.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/020_wp3_gui.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/030_wp4_docs.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/040_wp5_verification.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/050_wp6_gjc_rename.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/060_wp3_rendered_proof.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/090_outcome.md (100%) rename devlog/{_plan => _fin}/260912_omo_client_integration/evidence/integrations-omo-tab.png (100%) rename devlog/{_plan => _fin}/260912_operations/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_operations/001_roadmap_audit.md (100%) rename devlog/{_plan => _fin}/260912_operations/010_update.md (100%) rename devlog/{_plan => _fin}/260912_operations/020_listeners.md (100%) rename devlog/{_plan => _fin}/260912_operations/030_totals.md (100%) rename devlog/{_plan => _fin}/260912_operations/040_client_usage.md (100%) rename devlog/{_plan => _fin}/260912_operations/050_pairing.md (100%) rename devlog/{_plan => _fin}/260912_operations/060_transport.md (100%) rename devlog/{_plan => _fin}/260912_operations/070_verification.md (100%) rename devlog/{_plan => _fin}/260912_operations/080_update_events.md (100%) rename devlog/{_plan => _fin}/260912_operations/090_listener_diagnostic.md (100%) rename devlog/{_plan => _fin}/260912_operations/100_usage_transport.md (100%) rename devlog/{_plan => _fin}/260912_operations/110_resume_status.md (100%) rename devlog/{_plan => _fin}/260912_operations/120_coordinator_probe.md (100%) rename devlog/{_plan => _fin}/260912_phantom_account_short_quota/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_phantom_account_short_quota/010_phase1_drop_elapsed_short_carry.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/010_context.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/015_codesign_grok.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/016_audit_corrections.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/020_r3_local_tab.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/030_r2_note_clamp.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/040_r1_unified_search.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/050_delivery.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/060_delivery_record.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/grok-4.6-codesign.md (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp2-local-tab.png (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp3-note-clamp.png (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp3-note-popup.png (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp4-browse-mode.png (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp4-search-accounts.png (100%) rename devlog/{_plan => _fin}/260912_provider_catalog_unified_search/evidence/wp4-search-groups.png (100%) rename devlog/{_plan => _fin}/260912_reasoning_effort_downgrade/000_decision.md (96%) rename devlog/{_plan => _fin}/260912_reasoning_metadata/000_decision.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/010_ci_repair.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/020_regression_sweep.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/025_sweep_results.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/030_defect_landing.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/040_preview_release.md (100%) rename devlog/{_plan => _fin}/260912_release_regression_train/050_main_release.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/010_protocol.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/020_executor_runtime.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/030_integration.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/040_hosted_validation.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/041_resume_ci_repair.md (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/assets/041_desktop_read_only.png (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/assets/042_desktop_files_only.png (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/screenshots/remote-workspace-hub-dashboard.png (100%) rename devlog/{_plan => _fin}/260912_remote_workspace_carry/screenshots/remote-workspace-pairing-code.png (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/001_sources.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/010_presentation.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/020_transport_hint.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/030_spark.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/040_delivery.md (100%) rename devlog/{_plan => _fin}/260912_thinking_contract/050_refresh.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/010_plaintext.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/020_recovery.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/030_native_identity.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/040_verification.md (100%) rename devlog/{_plan => _fin}/260912_v2_contracts/050_resume_evidence.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/000_plan.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/001_research_zai_model_facts.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/002_research_zcode_bundle_schema.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/003_research_ocx_internals.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/010_wp2_zcode_export_responses.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/020_wp3_glm53_flash_modalities.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/030_wp4_zai_responses_default.md (100%) rename devlog/{_plan => _fin}/260912_zcode_protocol_and_catalog/evidence/zai-responses-models.json (100%) rename devlog/{_plan => _fin}/260913_chat_refusal_translator/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_chat_refusal_translator/010_rootcause_evidence.md (100%) rename devlog/{_plan => _fin}/260913_chat_refusal_translator/020_fix_refusal_scope.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/001_platform_topology.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/002_audit_findings.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/010_phase1_shared_restart_surface.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/020_phase2_detached_self_handoff.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md (99%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/040_phase4_verification_and_delivery.md (100%) rename devlog/{_plan => _fin}/260913_cross_platform_desktop_app_restart/041_execution_record.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/000_plan.md (99%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/010_wp1_swe2_effort_carry.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/020_wp2_devin_cli_fixture_carry.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/030_wp3_ttfb_generation_deadline.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/040_wp4_devin_prompt_cache_and_identity.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/050_wp5_effort_suffix_unification.md (100%) rename devlog/{_plan => _fin}/260913_devin_landing_and_caching/060_wp6_assign_model_router.md (100%) rename devlog/{_plan => _fin}/260913_devin_provider_merge/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_devin_provider_merge/010_wp1_core_merge.md (100%) rename devlog/{_plan => _fin}/260913_devin_provider_merge/020_wp2_migration.md (100%) rename devlog/{_plan => _fin}/260913_devin_provider_merge/030_wp3_surface_sync.md (100%) rename devlog/{_plan => _fin}/260913_devin_provider_merge/040_wp4_pr.md (100%) rename devlog/{_plan => _fin}/260913_godfile_round1/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/001_merge_topology.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/002_merge_mechanics.md (97%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/010_wave1.md (98%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/020_wave2.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/030_tip_and_regression.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/040_issue_closure.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/050_outcome.md (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/screenshots/codex-account-pool.png (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/screenshots/dashboard-overview.png (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/screenshots/integrations-clients.png (100%) rename devlog/{_plan => _fin}/260913_lane_stack_merge/screenshots/remote-workspace.png (100%) rename devlog/{_plan => _fin}/260913_missing_coauthor_credits/000_plan.md (98%) rename devlog/{_plan => _fin}/260913_missing_coauthor_credits/001_scan_evidence.md (100%) rename devlog/{_plan => _fin}/260913_missing_coauthor_credits/010_inventory_freeze.md (100%) rename devlog/{_plan => _fin}/260913_missing_coauthor_credits/020_credits_update.md (100%) rename devlog/{_plan => _fin}/260913_missing_coauthor_credits/030_pr_merge.md (100%) rename devlog/{_plan => _fin}/260913_model_availability_errors/000_summary.md (100%) rename devlog/{_plan => _fin}/260913_model_picker_grouping_and_effort/000_plan.md (100%) rename devlog/{_plan => _fin}/260913_model_picker_grouping_and_effort/010_devin_effort_ladder.md (100%) rename devlog/{_plan => _fin}/260914_carry_pr4528/000_plan.md (100%) rename devlog/{_plan => _fin}/260914_carry_pr4528/010_phase1.md (100%) rename devlog/{_plan => _fin}/260914_codex_history_preflight_scope/000_plan.md (100%) rename devlog/{_plan => _fin}/260914_codex_history_preflight_scope/010_rootcause_evidence.md (100%) rename devlog/{_plan => _fin}/260914_codex_history_preflight_scope/020_fix_and_contract_change.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/000_unit.md (98%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/010_bound_binding_policy.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/020_backoff_preserves_binding.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/030_move_reason_evidence.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/040_send_budget.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/050_worker_isolation.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/060_quota_cache_domains.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/070_delivery.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/080_codex_cache_reinforcement.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/090_remaining_stack.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/100_dev_tip_closure_assessment.md (100%) rename devlog/{_plan => _fin}/260914_cost_guard_stabilization/110_spend_ceiling_configuration.md (100%) rename devlog/{_plan => _fin}/260914_godfile_round2/000_plan.md (98%) rename devlog/{_plan => _fin}/260914_godfile_round2/010_phase1_file_size_ratchet.md (99%) rename devlog/{_plan => _fin}/260914_godfile_round2/020_phase2_state_and_shim.md (100%) rename devlog/{_plan => _fin}/260914_godfile_round2/030_phase3_inject_and_catalog_sync.md (100%) rename devlog/{_plan => _fin}/260914_godfile_round2/040_phase4_routing_and_quota.md (100%) rename devlog/{_plan => _fin}/260914_godfile_round2/050_phase5_config.md (100%) rename devlog/{_plan => _fin}/260914_l2_pool_routing_cache/000_unit.md (100%) rename devlog/{_plan => _fin}/260914_l2_pool_routing_cache/010_cache_safe_rebind.md (100%) rename devlog/{_plan => _fin}/260914_l2_pool_routing_cache/020_routing_adoption.md (100%) rename devlog/{_plan => _fin}/260914_l2_pool_routing_cache/030_delivery.md (100%) rename devlog/{_plan => _fin}/260914_l4_responses_media/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260914_l5_provider_account_edges/000_plan.md (100%) rename devlog/{_plan => _fin}/260914_l5_provider_account_edges/010_wp1_account_lifecycle_edges.md (100%) rename devlog/{_plan => _fin}/260914_l7_web_search_bridge/000_plan.md (100%) rename devlog/{_plan => _fin}/260914_l7_web_search_bridge/010_mixed_tool_continuation.md (100%) rename devlog/{_plan => _fin}/260914_l7_web_search_bridge/020_alpha_search_fallback.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/000_plan.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/001_audit_evidence.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/002_architect_dispositions.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/003_blocker_corrections.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/010_phase1_ingress_normalization.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/020_phase2_chat_responses_controls.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/030_phase3_provider_wire_contracts.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/040_phase4_modality_fidelity.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/050_residuals.md (100%) rename devlog/{_plan => _fin}/260914_provider_parity_stack/060_direct_media_guard.md (100%) rename devlog/{_plan => _fin}/260914_r2l8_catalog_autorefresh/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260914_r2l8_catalog_autorefresh/020_issue_3377_capability_audit.md (100%) rename devlog/{_plan => _fin}/260914_regression_audit_and_release/000_audit_and_release_plan.md (100%) rename devlog/{_plan => _fin}/260914_regression_audit_and_release/010_audit_findings.md (100%) rename devlog/{_plan => _fin}/260914_regression_audit_and_release/020_release_runbook.md (100%) rename devlog/{_plan => _fin}/260915_2560_release_train/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260915_2560_release_train/010_land_4683.md (100%) rename devlog/{_plan => _fin}/260915_2560_release_train/020_regression_audit.md (100%) rename devlog/{_plan => _fin}/260915_2560_release_train/030_release.md (100%) rename devlog/{_plan => _fin}/260915_2560_release_train/040_release_decision.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/000_plan.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/010_phase1_config.md (97%) rename devlog/{_plan => _fin}/260915_godfile_round3/020_phase2_providers_registry.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/030_phase3_codex_auth_api.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/040_phase4_catalog_provider_fetch.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/050_phase5_adapters_openai_chat.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round3/090_outcome.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/000_plan.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/010_openai_responses.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/020_bridge.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/030_activation_guard.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/040_server_index.md (99%) rename devlog/{_plan => _fin}/260915_godfile_round5/050_stack_and_gates.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/060_audit_record.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/061_server_index_outcome.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/070_core_outcome.md (100%) rename devlog/{_plan => _fin}/260915_godfile_round5/080_round_outcome.md (100%) rename devlog/{_plan => _fin}/260915_workflow_budget_window/000_unit.md (100%) rename devlog/{_plan => _fin}/260915_workflow_budget_window/010_windowed_ceilings.md (100%) rename devlog/{_plan => _fin}/260915_workflow_budget_window/020_legible_refusal.md (100%) rename devlog/{_plan => _fin}/260915_workflow_budget_window/030_wfc_diff_plan.md (100%) rename devlog/{_plan => _fin}/260916_cursor_http2_toolcall/000_plan.md (100%) rename devlog/{_plan => _fin}/260916_cursor_http2_toolcall/010_phase1_text_toolcall_quarantine.md (100%) rename devlog/{_plan => _fin}/260916_cursor_http2_toolcall/020_phase2_observed_max_tokens.md (100%) rename devlog/{_plan => _fin}/260916_release_2570_stabilization/031_openai_tiers_split.md (100%) rename devlog/{_plan => _fin}/260916_release_2570_stabilization/041_preview_fence_test_is_structural.md (100%) rename devlog/{_plan => _fin}/260917_2570_release_train/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260917_2570_release_train/010_dev_green.md (100%) rename devlog/{_plan => _fin}/260917_2570_release_train/020_pr_triage.md (100%) rename devlog/{_plan => _fin}/260917_2570_release_train/030_issue_triage.md (100%) rename devlog/{_plan => _fin}/260917_2570_release_train/040_release.md (100%) rename devlog/{_plan => _fin}/260917_devin_input_ceiling/000_review.md (100%) rename devlog/{_plan => _fin}/260917_l1_preview_read_fence_and_dep_audit/000_master_plan.md (100%) rename devlog/{_plan => _fin}/260917_l1_preview_read_fence_and_dep_audit/010_issue_4850_preview_pool_eligibility_fence.md (100%) rename devlog/{_plan => _fin}/260917_l1_preview_read_fence_and_dep_audit/020_pr_4873_dependency_audit_review.md (100%) rename devlog/{_plan => _fin}/260917_l1_preview_read_fence_and_dep_audit/030_unit_c_docs_site_build_gate.md (100%) rename devlog/{_plan => _fin}/260917_l2_safe_teardown/000_master_plan.md (98%) rename devlog/{_plan => _fin}/260917_l2_safe_teardown/010_upstream_resolution_facts.md (100%) rename devlog/{_plan => _fin}/260917_l2_safe_teardown/020_issue_4812_contract.md (100%) rename devlog/{_plan => _fin}/260917_l2_safe_teardown/030_issue_4809_contract.md (100%) rename devlog/{_plan => _fin}/260917_l2_safe_teardown/040_verification.md (100%) rename devlog/{_plan => _fin}/260917_l3_retry_budget_admission/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260917_l3_retry_budget_admission/010_admission_audit.md (100%) rename devlog/{_plan => _fin}/260917_l3_retry_budget_admission/020_independent_review.md (100%) rename devlog/{_plan => _fin}/260917_l4_responses_private_fields_and_history/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260917_l5_cursor_stabilization/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260917_l5_cursor_stabilization/010_u1_text_toolcall_contract.md (100%) rename devlog/{_plan => _fin}/260917_l5_cursor_stabilization/020_u2_observed_window_scope.md (100%) rename devlog/{_plan => _fin}/260917_l5_cursor_stabilization/030_u3_remint_isolation_and_budget.md (100%) rename devlog/{_plan => _fin}/260917_l5_cursor_stabilization/040_u4_codebuddy_bare_tool_names.md (100%) rename devlog/{_plan => _fin}/260917_l6_contract_quality_fixes/000_master_plan.md (100%) rename devlog/{_plan => _fin}/260917_l6_contract_quality_fixes/010_4855_terminal_stop_classification.md (100%) rename devlog/{_plan => _fin}/260917_l6_contract_quality_fixes/020_4822_zai_model_discovery.md (100%) rename devlog/{_plan => _fin}/260917_l6_contract_quality_fixes/030_carried_catalog_and_gui_prs.md (100%) rename devlog/{_plan => _fin}/260917_l6_contract_quality_fixes/040_4857_first_frame_usage_contract.md (100%) rename devlog/{_plan => _fin}/260917_l7_native_control_stack_audit/000_plan.md (96%) rename devlog/{_plan => _fin}/260917_l7_native_control_stack_audit/010_stage_diffs.md (100%) rename devlog/{_plan => _fin}/260917_l7_native_control_stack_audit/020_integration_contract.md (100%) rename devlog/{_plan => _fin}/260917_l7_native_control_stack_audit/030_l1_precondition.md (100%) rename devlog/{_plan => _fin}/260917_l7_native_control_stack_audit/040_activation_decision.md (100%) rename devlog/{_plan => _fin}/260918_2580_release_train/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260918_2580_release_train/040_release.md (100%) rename devlog/{_plan => _fin}/260918_lane_a_bug_train/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260918_lane_a_bug_train/030_transient_passthrough_policy.md (100%) rename devlog/{_plan => _fin}/260918_lane_a_bug_train/040_combo_response_format.md (100%) rename devlog/{_plan => _fin}/260918_lane_a_bug_train/041_combo_response_format_second_vendor.md (100%) rename devlog/{_plan => _fin}/260918_lane_a_bug_train/050_cohort_pool_affinity.md (100%) rename devlog/{_plan => _fin}/260918_lane_b_provider_reliability/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260918_ld_search_bridge_and_thinking_replay/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260918_ld_search_bridge_and_thinking_replay/020_closure_evidence.md (100%) rename devlog/{_plan => _fin}/260919_5008_antigravity_turn_ordering/000_upstream_contract_evidence.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/000_local_build.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/011_acceptance.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/020_build_state_guards.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/030_icons_and_widget.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/040_widget_never_offered.md (100%) rename devlog/{_plan => _fin}/260920_desktop_app_stabilization/050_landing.md (100%) rename devlog/{_plan => _fin}/260920_regression_release/000_scope.md (100%) rename devlog/{_plan => _fin}/260920_regression_release/010_execution.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/000_plan.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/010_r1_paginated_history_guard.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/020_r2_desktop_ci.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/030_lane_r3.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/040_r4_retry_rework.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/050_lane_r5.md (99%) rename devlog/{_plan => _fin}/260920_round2_followups/050_r4_remainders.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/060_r6_usage_models_table.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/070_widget_signing.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/090_closeout.md (100%) rename devlog/{_plan => _fin}/260920_round2_followups/r6-usage-table/r6-01-column-order.png (100%) rename devlog/{_plan => _fin}/260920_round2_followups/r6-usage-table/r6-02-pinned-scroll.png (100%) rename devlog/{_plan => _fin}/260920_round2_followups/r6-usage-table/r6-03-narrow-fallback.png (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/000_charter.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/010_coexistence_findings.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/020_windows_linux_findings.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/030_contradictions.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/040_verification_hosts.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/050_webview_dialogs.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/060_contradictions_round2.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/070_decisions.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/080_decisions_round2.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/090_lanes.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/100_resolutions.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/110_reaudit.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/120_gate_runbook.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/120_install_verification.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/130_linux_surface_findings.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/140_tray_popup_polish.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/150_closeout.md (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/tray-usage-popup-glass.png (100%) rename devlog/{_plan => _fin}/260921_app_runtime_ownership/tray-usage-popup.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/000_plan.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/001_evidence.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/002_plan_review.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/010_native_presentation.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/011_presentation_verification.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/020_shell_integration.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/021_integration_verification.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/030_regression.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/031_verification.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/040_release.md (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/native-glass-bottom.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/native-glass-top.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/native-panel-bottom.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/native-panel-dark.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/native-panel-light.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/web-tray-opaque-bottom.png (100%) rename devlog/{_plan => _fin}/260922_native_tray_release/evidence/web-tray-vibrant-bottom.png (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/010_plan.md (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/020_probe-evidence.md (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/030_reflection.md (96%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/040_audit.md (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/050_build.md (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/060_done.md (100%) rename devlog/{_plan => _fin}/260923_anthropic_fast_speed/evidence/logs-fast-downgrade.png (100%) rename devlog/{_plan => _fin}/260923_bundle_a_tests_hygiene/000_triage.md (100%) rename devlog/{_plan => _fin}/260923_bundle_a_tests_hygiene/010_build.md (100%) rename devlog/{_plan => _fin}/260923_bundle_a_tests_hygiene/020_delivery.md (100%) rename devlog/{_plan => _fin}/260923_bundle_f1_provider_registry/000_overview.md (100%) rename devlog/{_plan => _fin}/260923_bundle_f1_provider_registry/010_carry_plan.md (100%) rename devlog/{_plan => _fin}/260923_bundle_f1_provider_registry/020_delivery.md (100%) rename devlog/{_plan => _fin}/260923_bundle_lane_e/000_overview.md (100%) rename devlog/{_plan => _fin}/260923_bundle_lane_e/010_decisions.md (100%) rename devlog/{_plan => _fin}/260923_bundle_lane_e/020_carry.md (100%) rename devlog/{_plan => _fin}/260923_bundle_lane_e/030_verify.md (100%) rename devlog/{_plan => _fin}/260923_claude_desktop_first_party_models/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_claude_desktop_first_party_models/001_probe_evidence.md (100%) rename devlog/{_plan => _fin}/260923_claude_desktop_first_party_models/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260923_claude_desktop_first_party_models/020_wp2_first_party_bindings.md (100%) rename devlog/{_plan => _fin}/260923_claude_desktop_first_party_models/030_wp3_live_proof_and_pr.md (100%) rename devlog/{_plan => _fin}/260923_claude_reset_grants/010_plan.md (100%) rename devlog/{_plan => _fin}/260923_configured_native_gpt_models/010_plan.md (100%) rename devlog/{_plan => _fin}/260923_configured_native_gpt_models/020_audit.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/001_existing_link_failures.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/010_wp2_link_integrity.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/020_wp3_english_polish_readme_resync.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/021_wp3_macos_menu_bar_draft.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/030_wp4_locale_coverage.md (100%) rename devlog/{_plan => _fin}/260923_docs_polish_404/040_wp5_delivery.md (100%) rename devlog/{_plan => _fin}/260923_docs_retirement/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_docs_retirement/010_phase1_docs_retirement.md (100%) rename devlog/{_plan => _fin}/260923_gpt6_catalog_lanes/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md (100%) rename devlog/{_plan => _fin}/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md (100%) rename devlog/{_plan => _fin}/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md (100%) rename devlog/{_plan => _fin}/260923_grok47_parity/000_plan.md (98%) rename devlog/{_plan => _fin}/260923_grok47_parity/010_probe-evidence.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/010_phase1_small_units.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/020_phase2_responses_sequence.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/030_phase3_search_usage.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/040_phase4_pr_ci_review.md (100%) rename devlog/{_plan => _fin}/260923_luvs_l5_responses_usage/050_phase5_close_originals.md (100%) rename devlog/{_plan => _fin}/260923_models_catalog_delivery_disclosure/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_models_catalog_delivery_disclosure/010_architect.md (100%) rename devlog/{_plan => _fin}/260923_models_catalog_delivery_disclosure/020_done.md (100%) rename devlog/{_plan => _fin}/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png (100%) rename devlog/{_plan => _fin}/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/010_plan.md (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/020_audit.md (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/030_done.md (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/040_plan_providers.md (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/050_done_providers.md (100%) rename devlog/{_plan => _fin}/260923_opus_5_5_catalog/060_plan_preemptive.md (100%) rename devlog/{_plan => _fin}/260923_p1_provider_state_continuity/000_overview.md (100%) rename devlog/{_plan => _fin}/260923_p1_provider_state_continuity/010_part1_compat_contract.md (100%) rename devlog/{_plan => _fin}/260923_p1_provider_state_continuity/020_part2_shadow_target_lifecycle.md (100%) rename devlog/{_plan => _fin}/260923_p1_provider_state_continuity/030_delivery.md (100%) rename devlog/{_plan => _fin}/260923_p2_update_continuity/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260923_p2_update_continuity/010_fenced_proxy_identity.md (100%) rename devlog/{_plan => _fin}/260923_p2_update_continuity/020_updater_leftovers_and_guidance.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/010_source.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/020_tests.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/030_docs.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/040_delivery.md (100%) rename devlog/{_plan => _fin}/260923_p3_azure_opaque_recovery/050_review_followup.md (100%) rename devlog/{_plan => _fin}/260923_p4_ci_pr_finish/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_p4_ci_pr_finish/010_pr5469_privacy_gate.md (100%) rename devlog/{_plan => _fin}/260923_p4_ci_pr_finish/020_pr5456_batch_deadline.md (100%) rename devlog/{_plan => _fin}/260923_p4_ci_pr_finish/030_pr5471_latest_dev_wording.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/010_release_preflight.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/020_release_outcome_report.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/030_shard_balance.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/040_scope_gap_checks.md (100%) rename devlog/{_plan => _fin}/260923_p5_ci_release_gaps/050_delivery.md (100%) rename devlog/{_plan => _fin}/260923_subagent_roster_defaults_autosave/000_README.md (100%) rename devlog/{_plan => _fin}/260923_subagent_roster_defaults_autosave/010_gpt6_default_roster.md (100%) rename devlog/{_plan => _fin}/260923_subagent_roster_defaults_autosave/020_roster_autosave.md (100%) rename devlog/{_plan => _fin}/260923_subagent_roster_defaults_autosave/030_delivery.md (100%) rename devlog/{_plan => _fin}/260923_subagent_roster_defaults_autosave/040_legacy_roster_cleanup.md (100%) rename devlog/{_plan => _fin}/260923_usage_timeline_pool_merge/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_usage_timeline_pool_merge/010_phase1.md (100%) rename devlog/{_plan => _fin}/260924_anthropic_fast_opt_in/010_plan.md (97%) rename devlog/{_plan => _fin}/260924_anthropic_forced_tool_choice/010_plan.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/000_plan.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/001_research.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/010_wp2_gateway_default_and_warning.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/020_wp3_picker_core.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/030_wp4_picker_activation.md (100%) rename devlog/{_plan => _fin}/260924_claude_desktop_picker_mode/040_wp5_live_proof_pr_merge.md (100%) rename devlog/{_plan => _fin}/260924_cursor_fast_pricing/000_plan.md (100%) rename devlog/{_plan => _fin}/260924_cursor_fast_pricing/010_implementation.md (100%) rename devlog/{_plan => _fin}/260924_cursor_fast_pricing/020_verification.md (100%) rename devlog/{_plan => _fin}/260924_l3_provider_adapters/010_plan.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/010_carry_ready_prs.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/020_subagent_identity_5221.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/030_agent_message_recovery_5009.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/040_main_hard_lock_default_5694.md (100%) rename devlog/{_plan => _fin}/260924_l4_codex_cli_service/050_publish.md (90%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/000_overview.md (100%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/010_wsl_home.md (100%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/020_windows_mise_node.md (100%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/030_echo_filter.md (100%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/040_tool_call_hold.md (100%) rename devlog/{_plan => _fin}/260924_regression_risk_fixes/050_delivery.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/000_plan.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/001_sol_plan_draft.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/002_architect_proposal.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/010_phase1_package_cache.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/020_phase2_desktop_state_icons.md (99%) rename devlog/{_plan => _fin}/260924_update_indicator/030_phase3_desktop_update_page.md (98%) rename devlog/{_plan => _fin}/260924_update_indicator/040_phase4_windows_npm_tray.md (100%) rename devlog/{_plan => _fin}/260924_update_indicator/050_delivery.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/000_plan.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/001_research.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/002_consultation.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/010_foundations.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/020_intercept_classification.md (99%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/030_management_cli.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/040_surfaces.md (100%) rename devlog/{_plan => _fin}/260925_claude_cli_first_party/050_delivery.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/000_prd.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/001_stack_plan.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/002_arch_plan.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/003_decisions.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/010_wp1_link_core.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/020_wp2_hub_link_listener.md (98%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/030_wp3_client_link_transport.md (100%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/040_wp4_supervisor_api_cli.md (99%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/050_wp5_remote_gui.md (99%) rename devlog/{_plan => _fin}/260925_remote_home_child_link/060_wp6_client_initiated.md (98%) rename devlog/{_plan => _fin}/260926_bug_train_6/000_plan.md (100%) rename devlog/{_plan => _fin}/260926_bug_train_6/010_roadmap.md (100%) rename devlog/{_plan => _fin}/260926_bug_train_6/020_batch7.md (100%) rename devlog/{_plan => _fin}/260926_bug_train_6/030_post_merge_fixes.md (100%) rename devlog/{_plan => _fin}/260926_bug_train_6/040_batch8.md (100%) rename devlog/{_plan => _fin}/260926_bug_train_6/050_windows_mise_launcher.md (100%) rename devlog/{_plan => _fin}/260926_claude_input_estimate/000_overview.md (100%) rename devlog/{_plan => _fin}/260926_claude_input_estimate/010_estimation.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/000_plan.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/001_research_gap_inventory.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/010_usage_probe_and_restart_continuity.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/020_transport_egress_rotation_timeouts.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/030_refusal_classes_and_account_failover.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/040_account_load_cap_and_least_loaded.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/050_per_account_model_catalog.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/060_native_device_login.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/070_measured_credits_metrics_routable.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/080_head_to_head_method.md (96%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/081_head_to_head_result.md (100%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/090_context_and_timeout_corrections.md (84%) rename devlog/{_plan => _fin}/260926_kiro_lb_parity2/100_gui_device_login_and_skip_reason.md (99%) rename devlog/{_plan => _fin}/260926_main_hard_lock_any_window/010_plan.md (100%) rename devlog/{_plan => _fin}/260926_menubar_account_switch/000_index.md (100%) rename devlog/{_plan => _fin}/260926_menubar_account_switch/010_server_capability.md (100%) rename devlog/{_plan => _fin}/260926_menubar_account_switch/020_panel_switch.md (100%) rename devlog/{_plan => _fin}/260926_menubar_quota_widget/000_index.md (100%) rename devlog/{_plan => _fin}/260926_menubar_quota_widget/010_pr1_quota_windows.md (100%) rename devlog/{_plan => _fin}/260926_menubar_quota_widget/020_pr2_widget_reload.md (100%) rename devlog/{_plan => _fin}/260926_menubar_quota_widget/030_pr3_provider_logos.md (100%) rename devlog/{_plan => _fin}/260926_menubar_quota_widget/040_pr4_companion_page.md (100%) rename devlog/{_plan => _fin}/260926_models_luna6_layout/000_plan.md (100%) rename devlog/{_plan => _fin}/260926_models_luna6_layout/010_wp2_shadow_source_luna6.md (100%) rename devlog/{_plan => _fin}/260926_models_luna6_layout/020_wp3_models_layout.md (100%) rename devlog/{_plan => _fin}/260926_models_luna6_layout/030_wp4_integration_pr.md (100%) rename devlog/{_plan => _fin}/260926_quota_strip_single_line/010_wp1_quota_strip.md (100%) rename devlog/{_plan => _fin}/260926_unique_tool_call_ids/000_overview.md (100%) rename devlog/{_plan => _fin}/260926_unique_tool_call_ids/010_remint.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_2/000_roadmap.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_2/010_wave2.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_2/020_outcome.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/000_roadmap.md (97%) rename devlog/{_plan => _fin}/260927_merge_train_3/010_batch1.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/020_batch2.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/030_batch3.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/040_batch4.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/050_batch5.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/060_batch6.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/070_batch7.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/080_batch8.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/085_batch9.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/090_outcome.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/095_batch10.md (100%) rename devlog/{_plan => _fin}/260927_merge_train_3/097_batch11.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/000_plan.md (92%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/001_inventory.md (96%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/010_pause.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/020_desktop.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/030_auth_failover.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/account-pool/040_closeout.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/000_plan.md (97%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/010_adapter_bounds.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/020_native_quota.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/030_restart_transaction.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/040_link_ssh.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/050_disposition_and_ci.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/bug-hardening/060_sibling_home_client_sync.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/000_plan.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/010_recipe.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/020_macos_proxy.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/030_qoder.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/040_kilo.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/050_droid.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/060_jev.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/070_memory.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/080_held_items.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/090_final_ci.md (95%) rename devlog/{_plan => _fin}/260927_release_train_4/clients-proxy/100_outcome.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/000_plan.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/001_inventory.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/002_ux_states.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/003_audit.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/004_ui_baseline.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/010_model_settings.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/011_model_settings_evidence.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/012_model_settings_done.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/020_combo_sidecar.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/030_visibility.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/040_dispositions.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/gui-ux/050_integration.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/issue-triage/000_plan.md (98%) rename devlog/{_plan => _fin}/260927_release_train_4/issue-triage/010_issue_actions.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/issue-triage/020_pr_actions.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/issue-triage/030_standalone_carry.md (96%) rename devlog/{_plan => _fin}/260927_release_train_4/issue-triage/040_outcome.md (99%) rename devlog/{_plan => _fin}/260927_release_train_4/picker-ca/000_plan.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/picker-ca/010_ca_publication.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/picker-ca/020_desktop_continuity.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/picker-ca/030_codex_drift_heal.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/picker-ca/040_integration.md (93%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/000_plan.md (94%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/001_candidate_inventory.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/010_images.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/020_response_tier.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/030_issues.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/040_integration.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/050_trial_nux.md (100%) rename devlog/{_plan => _fin}/260927_release_train_4/provider-compat/060_merge.md (96%) rename devlog/{_plan => _fin}/260928_rt5_reasoning_zen/000_plan.md (100%) rename devlog/{_plan => _fin}/260928_rt5_reasoning_zen/010_hide_raw_reasoning.md (100%) rename devlog/{_plan => _fin}/260928_rt5_reasoning_zen/020_zen_keyless_disposition.md (100%) rename devlog/{_plan => _fin}/260930_codex_credits_bar/000_plan.md (100%) rename devlog/{_plan => _fin}/260930_codex_credits_bar/010_phase1_credits_implementation.md (100%) rename devlog/{_plan => _fin}/260930_codex_credits_bar/020_phase2_pr_ci_merge.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/000_README.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/010_research_digest.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/020_catalog_surfaces.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/030_default_swap.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/040_tokenlab_protocols.md (100%) rename devlog/{_plan => _fin}/260930_gpt_6_1_sol_rollout/050_release.md (100%) rename devlog/{_plan => _fin}/260930_grok47_build_unify/000_plan.md (100%) rename devlog/{_plan => _fin}/260930_grok47_build_unify/010_probe-evidence.md (100%) rename devlog/{_plan => _fin}/260930_local_test_stability/000_README.md (100%) rename devlog/{_plan => _fin}/260930_local_test_stability/010_diagnosis_and_plan.md (100%) rename devlog/{_plan => _fin}/260930_minimax_m31_flash_preview/000_README.md (100%) rename devlog/{_plan => _fin}/260930_minimax_m31_flash_preview/010_evidence_and_plan.md (100%) rename devlog/{_plan => _fin}/261001_jev_decision_routing/000_plan.md (100%) rename devlog/{_plan => _fin}/261001_jev_decision_routing/010_wp1_backend_interface.md (100%) rename devlog/{_plan => _fin}/261001_jev_decision_routing/020_wp2_model_backend_surfaces.md (100%) rename devlog/{_plan => _fin}/261001_jev_decision_routing/030_wp3_dashboard_docs.md (100%) rename devlog/{_plan => _fin}/261001_jev_decision_routing/040_wp4_landing.md (100%) rename devlog/{_plan => _fin}/261001_zed_hosted_uayor_carry/010_finish_carry.md (100%) rename devlog/{_plan => _fin}/261002_claude_cli_picker/010_plan.md (100%) rename devlog/{_plan => _fin}/261002_claude_cli_picker/020_audit.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/000_scope_and_boundary.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/010_extraction_map.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/020_contract_and_test_matrix.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/030_foundation_implementation.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/040_command_implementation.md (100%) rename devlog/{_plan => _fin}/261003_codex_local_messaging/050_cleanup_and_rebase_validation.md (100%) rename devlog/{_plan => _fin}/261003_lane_e_recovery/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_lane_e_recovery/010_recovery.md (100%) rename devlog/{_plan => _fin}/261003_lane_e_recovery/090_summary.md (100%) rename devlog/{_plan => _fin}/261003_ollama_commentary_replay/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_ollama_commentary_replay/010_replay.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_a/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_a/001_evidence.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_a/010_native_upload.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_a/020_messages_context.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_a/030_review_publication.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_c/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_c/010_antigravity.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_c/020_ollama.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_c/030_handoff.md (100%) rename devlog/{_plan => _fin}/261003_release_lane_d/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/000_plan.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/010_stabilization.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/011_native_and_merge_acceptance.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/012_integration_evidence.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/015_independent_regression.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/016_regression_acceptance.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/020_candidate.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/021_candidate_first_run.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/022_candidate_acceptance.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/030_publication.md (100%) rename devlog/{_plan => _fin}/261003_release_stabilization/031_publication_outcome.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/000_plan.md (97%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/001_audit_evidence.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/002_architecture.md (99%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/003_reflection.md (74%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/010_desktop_cli_command.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/011_wp1_execution.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/019_wp1_done.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/020_launcher_handoff_and_diagnostics.md (99%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/021_wp2_execution.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/030_docs_review_merge.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/031_wp3_review_fixes.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/032_wp3_cycle1_outcome.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/040_wp4_land.md (100%) rename devlog/{_plan => _fin}/261009_desktop_owned_path_cli/049_outcome.md (100%) delete mode 100644 devlog/_plan/260908_provider_runtime_stack/000_plan.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/010_layer_plan.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/011_conflict_map.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/012_mark_sourcing.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/013_secondary_dispositions.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/020_wp2_carry.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/030_wp3_marks_docs.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/040_wp4_publish_merge.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/050_delivery_record.md delete mode 100644 devlog/_plan/260908_provider_runtime_stack/060_ledger.md delete mode 100644 devlog/_plan/260910_post249_round2/_research/_audit.md delete mode 100644 devlog/_plan/260913_devin_image_passthrough/000_plan.md diff --git a/devlog/_plan/260819_next_roadmap/000_roadmap.md b/devlog/_fin/260819_next_roadmap/000_roadmap.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/000_roadmap.md rename to devlog/_fin/260819_next_roadmap/000_roadmap.md diff --git a/devlog/_plan/260819_next_roadmap/010_r1_split_rebase.md b/devlog/_fin/260819_next_roadmap/010_r1_split_rebase.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/010_r1_split_rebase.md rename to devlog/_fin/260819_next_roadmap/010_r1_split_rebase.md diff --git a/devlog/_plan/260819_next_roadmap/020_r2_temp_reclaim_merge.md b/devlog/_fin/260819_next_roadmap/020_r2_temp_reclaim_merge.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/020_r2_temp_reclaim_merge.md rename to devlog/_fin/260819_next_roadmap/020_r2_temp_reclaim_merge.md diff --git a/devlog/_plan/260819_next_roadmap/030_r3_collisions_and_retargets.md b/devlog/_fin/260819_next_roadmap/030_r3_collisions_and_retargets.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/030_r3_collisions_and_retargets.md rename to devlog/_fin/260819_next_roadmap/030_r3_collisions_and_retargets.md diff --git a/devlog/_plan/260819_next_roadmap/031_r3_posted_decisions.md b/devlog/_fin/260819_next_roadmap/031_r3_posted_decisions.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/031_r3_posted_decisions.md rename to devlog/_fin/260819_next_roadmap/031_r3_posted_decisions.md diff --git a/devlog/_plan/260819_next_roadmap/040_r4_modelrecordvalue_batch.md b/devlog/_fin/260819_next_roadmap/040_r4_modelrecordvalue_batch.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/040_r4_modelrecordvalue_batch.md rename to devlog/_fin/260819_next_roadmap/040_r4_modelrecordvalue_batch.md diff --git a/devlog/_plan/260819_next_roadmap/041_r4_posted_verdicts.md b/devlog/_fin/260819_next_roadmap/041_r4_posted_verdicts.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/041_r4_posted_verdicts.md rename to devlog/_fin/260819_next_roadmap/041_r4_posted_verdicts.md diff --git a/devlog/_plan/260819_next_roadmap/050_execution_ledger.md b/devlog/_fin/260819_next_roadmap/050_execution_ledger.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/050_execution_ledger.md rename to devlog/_fin/260819_next_roadmap/050_execution_ledger.md diff --git a/devlog/_plan/260819_next_roadmap/060_outcome.md b/devlog/_fin/260819_next_roadmap/060_outcome.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/060_outcome.md rename to devlog/_fin/260819_next_roadmap/060_outcome.md diff --git a/devlog/_plan/260819_next_roadmap/070_next_roadmap_split_and_dogfood.md b/devlog/_fin/260819_next_roadmap/070_next_roadmap_split_and_dogfood.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/070_next_roadmap_split_and_dogfood.md rename to devlog/_fin/260819_next_roadmap/070_next_roadmap_split_and_dogfood.md diff --git a/devlog/_plan/260819_next_roadmap/080_merge_loop_ledger.md b/devlog/_fin/260819_next_roadmap/080_merge_loop_ledger.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/080_merge_loop_ledger.md rename to devlog/_fin/260819_next_roadmap/080_merge_loop_ledger.md diff --git a/devlog/_plan/260819_next_roadmap/090_merge_loop_outcome.md b/devlog/_fin/260819_next_roadmap/090_merge_loop_outcome.md similarity index 100% rename from devlog/_plan/260819_next_roadmap/090_merge_loop_outcome.md rename to devlog/_fin/260819_next_roadmap/090_merge_loop_outcome.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/000_investigation.md b/devlog/_fin/260819_unclaimed_bug_selection/000_investigation.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/000_investigation.md rename to devlog/_fin/260819_unclaimed_bug_selection/000_investigation.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/010_ranking.md b/devlog/_fin/260819_unclaimed_bug_selection/010_ranking.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/010_ranking.md rename to devlog/_fin/260819_unclaimed_bug_selection/010_ranking.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/020_2114_systemd_bus.md b/devlog/_fin/260819_unclaimed_bug_selection/020_2114_systemd_bus.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/020_2114_systemd_bus.md rename to devlog/_fin/260819_unclaimed_bug_selection/020_2114_systemd_bus.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/030_2107_service_proxy_env.md b/devlog/_fin/260819_unclaimed_bug_selection/030_2107_service_proxy_env.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/030_2107_service_proxy_env.md rename to devlog/_fin/260819_unclaimed_bug_selection/030_2107_service_proxy_env.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/031_2107_implementation.md b/devlog/_fin/260819_unclaimed_bug_selection/031_2107_implementation.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/031_2107_implementation.md rename to devlog/_fin/260819_unclaimed_bug_selection/031_2107_implementation.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/040_2108_windows_reboot_gate.md b/devlog/_fin/260819_unclaimed_bug_selection/040_2108_windows_reboot_gate.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/040_2108_windows_reboot_gate.md rename to devlog/_fin/260819_unclaimed_bug_selection/040_2108_windows_reboot_gate.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/050_1587_deferred_catalog.md b/devlog/_fin/260819_unclaimed_bug_selection/050_1587_deferred_catalog.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/050_1587_deferred_catalog.md rename to devlog/_fin/260819_unclaimed_bug_selection/050_1587_deferred_catalog.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/060_1933_tray_encoding.md b/devlog/_fin/260819_unclaimed_bug_selection/060_1933_tray_encoding.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/060_1933_tray_encoding.md rename to devlog/_fin/260819_unclaimed_bug_selection/060_1933_tray_encoding.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/061_1933_implementation.md b/devlog/_fin/260819_unclaimed_bug_selection/061_1933_implementation.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/061_1933_implementation.md rename to devlog/_fin/260819_unclaimed_bug_selection/061_1933_implementation.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/070_sequencing.md b/devlog/_fin/260819_unclaimed_bug_selection/070_sequencing.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/070_sequencing.md rename to devlog/_fin/260819_unclaimed_bug_selection/070_sequencing.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/075_verification.md b/devlog/_fin/260819_unclaimed_bug_selection/075_verification.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/075_verification.md rename to devlog/_fin/260819_unclaimed_bug_selection/075_verification.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/080_outcome.md b/devlog/_fin/260819_unclaimed_bug_selection/080_outcome.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/080_outcome.md rename to devlog/_fin/260819_unclaimed_bug_selection/080_outcome.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/090_1527_abort_slice.md b/devlog/_fin/260819_unclaimed_bug_selection/090_1527_abort_slice.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/090_1527_abort_slice.md rename to devlog/_fin/260819_unclaimed_bug_selection/090_1527_abort_slice.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/100_post_split_rebase.md b/devlog/_fin/260819_unclaimed_bug_selection/100_post_split_rebase.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/100_post_split_rebase.md rename to devlog/_fin/260819_unclaimed_bug_selection/100_post_split_rebase.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/110_2114_disposition.md b/devlog/_fin/260819_unclaimed_bug_selection/110_2114_disposition.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/110_2114_disposition.md rename to devlog/_fin/260819_unclaimed_bug_selection/110_2114_disposition.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/120_2108_phase1.md b/devlog/_fin/260819_unclaimed_bug_selection/120_2108_phase1.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/120_2108_phase1.md rename to devlog/_fin/260819_unclaimed_bug_selection/120_2108_phase1.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/121_2108_implementation.md b/devlog/_fin/260819_unclaimed_bug_selection/121_2108_implementation.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/121_2108_implementation.md rename to devlog/_fin/260819_unclaimed_bug_selection/121_2108_implementation.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/130_ci_proxy_env_leak.md b/devlog/_fin/260819_unclaimed_bug_selection/130_ci_proxy_env_leak.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/130_ci_proxy_env_leak.md rename to devlog/_fin/260819_unclaimed_bug_selection/130_ci_proxy_env_leak.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/140_final_audit.md b/devlog/_fin/260819_unclaimed_bug_selection/140_final_audit.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/140_final_audit.md rename to devlog/_fin/260819_unclaimed_bug_selection/140_final_audit.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/150_outcome.md b/devlog/_fin/260819_unclaimed_bug_selection/150_outcome.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/150_outcome.md rename to devlog/_fin/260819_unclaimed_bug_selection/150_outcome.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/170_2114_2108_fences.md b/devlog/_fin/260819_unclaimed_bug_selection/170_2114_2108_fences.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/170_2114_2108_fences.md rename to devlog/_fin/260819_unclaimed_bug_selection/170_2114_2108_fences.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/180_windows_leg.md b/devlog/_fin/260819_unclaimed_bug_selection/180_windows_leg.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/180_windows_leg.md rename to devlog/_fin/260819_unclaimed_bug_selection/180_windows_leg.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/190_release_readiness.md b/devlog/_fin/260819_unclaimed_bug_selection/190_release_readiness.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/190_release_readiness.md rename to devlog/_fin/260819_unclaimed_bug_selection/190_release_readiness.md diff --git a/devlog/_plan/260819_unclaimed_bug_selection/200_local_windows_verification.md b/devlog/_fin/260819_unclaimed_bug_selection/200_local_windows_verification.md similarity index 100% rename from devlog/_plan/260819_unclaimed_bug_selection/200_local_windows_verification.md rename to devlog/_fin/260819_unclaimed_bug_selection/200_local_windows_verification.md diff --git a/devlog/_plan/260821_bug_merge_train/000_triage_matrix.md b/devlog/_fin/260821_bug_merge_train/000_triage_matrix.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/000_triage_matrix.md rename to devlog/_fin/260821_bug_merge_train/000_triage_matrix.md diff --git a/devlog/_plan/260821_bug_merge_train/001_dependency_analysis.md b/devlog/_fin/260821_bug_merge_train/001_dependency_analysis.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/001_dependency_analysis.md rename to devlog/_fin/260821_bug_merge_train/001_dependency_analysis.md diff --git a/devlog/_plan/260821_bug_merge_train/002_audit_synthesis.md b/devlog/_fin/260821_bug_merge_train/002_audit_synthesis.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/002_audit_synthesis.md rename to devlog/_fin/260821_bug_merge_train/002_audit_synthesis.md diff --git a/devlog/_plan/260821_bug_merge_train/010_fix_dev_macos_ci.md b/devlog/_fin/260821_bug_merge_train/010_fix_dev_macos_ci.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/010_fix_dev_macos_ci.md rename to devlog/_fin/260821_bug_merge_train/010_fix_dev_macos_ci.md diff --git a/devlog/_plan/260821_bug_merge_train/020_merge_2295.md b/devlog/_fin/260821_bug_merge_train/020_merge_2295.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/020_merge_2295.md rename to devlog/_fin/260821_bug_merge_train/020_merge_2295.md diff --git a/devlog/_plan/260821_bug_merge_train/030_merge_2294.md b/devlog/_fin/260821_bug_merge_train/030_merge_2294.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/030_merge_2294.md rename to devlog/_fin/260821_bug_merge_train/030_merge_2294.md diff --git a/devlog/_plan/260821_bug_merge_train/040_merge_2296.md b/devlog/_fin/260821_bug_merge_train/040_merge_2296.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/040_merge_2296.md rename to devlog/_fin/260821_bug_merge_train/040_merge_2296.md diff --git a/devlog/_plan/260821_bug_merge_train/050_merge_2289.md b/devlog/_fin/260821_bug_merge_train/050_merge_2289.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/050_merge_2289.md rename to devlog/_fin/260821_bug_merge_train/050_merge_2289.md diff --git a/devlog/_plan/260821_bug_merge_train/060_merge_2270.md b/devlog/_fin/260821_bug_merge_train/060_merge_2270.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/060_merge_2270.md rename to devlog/_fin/260821_bug_merge_train/060_merge_2270.md diff --git a/devlog/_plan/260821_bug_merge_train/065_merge_2281.md b/devlog/_fin/260821_bug_merge_train/065_merge_2281.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/065_merge_2281.md rename to devlog/_fin/260821_bug_merge_train/065_merge_2281.md diff --git a/devlog/_plan/260821_bug_merge_train/070_final_gate.md b/devlog/_fin/260821_bug_merge_train/070_final_gate.md similarity index 100% rename from devlog/_plan/260821_bug_merge_train/070_final_gate.md rename to devlog/_fin/260821_bug_merge_train/070_final_gate.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/000_plan.md b/devlog/_fin/260822_senpi_cursor_transfer/000_plan.md similarity index 98% rename from devlog/_plan/260822_senpi_cursor_transfer/000_plan.md rename to devlog/_fin/260822_senpi_cursor_transfer/000_plan.md index 75685484b4d..03227694671 100644 --- a/devlog/_plan/260822_senpi_cursor_transfer/000_plan.md +++ b/devlog/_fin/260822_senpi_cursor_transfer/000_plan.md @@ -45,7 +45,7 @@ Do not implement two slices in one B. Do not start wp1 until this research cycle ## IN / OUT -IN: this `devlog/_plan/260822_senpi_cursor_transfer/` directory. +IN: this `devlog/_fin/260822_senpi_cursor_transfer/` directory. OUT: `src/`, `tests/`, `gui/`, `docs-site/`; senpi vendored proto copy; CLI spawn of `cursor-agent`. ## Already-have headline diff --git a/devlog/_plan/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md b/devlog/_fin/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md rename to devlog/_fin/260822_senpi_cursor_transfer/001_opencodex_cursor_inventory.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md b/devlog/_fin/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md rename to devlog/_fin/260822_senpi_cursor_transfer/002_senpi_cursor_inventory.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/003_protocol_compare.md b/devlog/_fin/260822_senpi_cursor_transfer/003_protocol_compare.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/003_protocol_compare.md rename to devlog/_fin/260822_senpi_cursor_transfer/003_protocol_compare.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/004_auth_catalog_compare.md b/devlog/_fin/260822_senpi_cursor_transfer/004_auth_catalog_compare.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/004_auth_catalog_compare.md rename to devlog/_fin/260822_senpi_cursor_transfer/004_auth_catalog_compare.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/005_exec_compare.md b/devlog/_fin/260822_senpi_cursor_transfer/005_exec_compare.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/005_exec_compare.md rename to devlog/_fin/260822_senpi_cursor_transfer/005_exec_compare.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/006_stream_overflow_compare.md b/devlog/_fin/260822_senpi_cursor_transfer/006_stream_overflow_compare.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/006_stream_overflow_compare.md rename to devlog/_fin/260822_senpi_cursor_transfer/006_stream_overflow_compare.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/007_cli_fallback.md b/devlog/_fin/260822_senpi_cursor_transfer/007_cli_fallback.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/007_cli_fallback.md rename to devlog/_fin/260822_senpi_cursor_transfer/007_cli_fallback.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/090_transfer_verdict.md b/devlog/_fin/260822_senpi_cursor_transfer/090_transfer_verdict.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/090_transfer_verdict.md rename to devlog/_fin/260822_senpi_cursor_transfer/090_transfer_verdict.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md b/devlog/_fin/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md rename to devlog/_fin/260822_senpi_cursor_transfer/100_stabilization_round2_plan.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/110_stream_health_watchdog.md b/devlog/_fin/260822_senpi_cursor_transfer/110_stream_health_watchdog.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/110_stream_health_watchdog.md rename to devlog/_fin/260822_senpi_cursor_transfer/110_stream_health_watchdog.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/120_small_hardening_pair.md b/devlog/_fin/260822_senpi_cursor_transfer/120_small_hardening_pair.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/120_small_hardening_pair.md rename to devlog/_fin/260822_senpi_cursor_transfer/120_small_hardening_pair.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md b/devlog/_fin/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md rename to devlog/_fin/260822_senpi_cursor_transfer/190_round2_roadmap_lock.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/200_round3_probe_plan.md b/devlog/_fin/260822_senpi_cursor_transfer/200_round3_probe_plan.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/200_round3_probe_plan.md rename to devlog/_fin/260822_senpi_cursor_transfer/200_round3_probe_plan.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/210_maxmode.md b/devlog/_fin/260822_senpi_cursor_transfer/210_maxmode.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/210_maxmode.md rename to devlog/_fin/260822_senpi_cursor_transfer/210_maxmode.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/220_rotation.md b/devlog/_fin/260822_senpi_cursor_transfer/220_rotation.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/220_rotation.md rename to devlog/_fin/260822_senpi_cursor_transfer/220_rotation.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/230_issue2305.md b/devlog/_fin/260822_senpi_cursor_transfer/230_issue2305.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/230_issue2305.md rename to devlog/_fin/260822_senpi_cursor_transfer/230_issue2305.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/240_client_version.md b/devlog/_fin/260822_senpi_cursor_transfer/240_client_version.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/240_client_version.md rename to devlog/_fin/260822_senpi_cursor_transfer/240_client_version.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/250_billed_usage.md b/devlog/_fin/260822_senpi_cursor_transfer/250_billed_usage.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/250_billed_usage.md rename to devlog/_fin/260822_senpi_cursor_transfer/250_billed_usage.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/260_re_classification_refinement.md b/devlog/_fin/260822_senpi_cursor_transfer/260_re_classification_refinement.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/260_re_classification_refinement.md rename to devlog/_fin/260822_senpi_cursor_transfer/260_re_classification_refinement.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/290_round3_lock.md b/devlog/_fin/260822_senpi_cursor_transfer/290_round3_lock.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/290_round3_lock.md rename to devlog/_fin/260822_senpi_cursor_transfer/290_round3_lock.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/300_opus_fast_catalog.md b/devlog/_fin/260822_senpi_cursor_transfer/300_opus_fast_catalog.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/300_opus_fast_catalog.md rename to devlog/_fin/260822_senpi_cursor_transfer/300_opus_fast_catalog.md diff --git a/devlog/_plan/260822_senpi_cursor_transfer/310_maxmode_bigctx.md b/devlog/_fin/260822_senpi_cursor_transfer/310_maxmode_bigctx.md similarity index 100% rename from devlog/_plan/260822_senpi_cursor_transfer/310_maxmode_bigctx.md rename to devlog/_fin/260822_senpi_cursor_transfer/310_maxmode_bigctx.md diff --git a/devlog/_plan/260824_model_ux_aliases_and_defaults/000_plan.md b/devlog/_fin/260824_model_ux_aliases_and_defaults/000_plan.md similarity index 97% rename from devlog/_plan/260824_model_ux_aliases_and_defaults/000_plan.md rename to devlog/_fin/260824_model_ux_aliases_and_defaults/000_plan.md index b935c2678a9..4c4e6b8202c 100644 --- a/devlog/_plan/260824_model_ux_aliases_and_defaults/000_plan.md +++ b/devlog/_fin/260824_model_ux_aliases_and_defaults/000_plan.md @@ -45,7 +45,7 @@ catalog refresh introduces new models already enabled. ## Loop-spec - Loop archetype: verifier-defined (issues exist + PR merged = done). -- Write scope: `devlog/_plan/260824_model_ux_aliases_and_defaults/**` only. +- Write scope: `devlog/_fin/260824_model_ux_aliases_and_defaults/**` only. Out of scope: any `src/`, `gui/`, `docs-site/` change; implementation. - External writes: 3 issues on lidge-jun/opencodex; 1 PR to `dev` + merge (explicitly user-authorized in the request). diff --git a/devlog/_plan/260824_model_ux_aliases_and_defaults/010_aliases.md b/devlog/_fin/260824_model_ux_aliases_and_defaults/010_aliases.md similarity index 100% rename from devlog/_plan/260824_model_ux_aliases_and_defaults/010_aliases.md rename to devlog/_fin/260824_model_ux_aliases_and_defaults/010_aliases.md diff --git a/devlog/_plan/260824_model_ux_aliases_and_defaults/020_new_models_off.md b/devlog/_fin/260824_model_ux_aliases_and_defaults/020_new_models_off.md similarity index 100% rename from devlog/_plan/260824_model_ux_aliases_and_defaults/020_new_models_off.md rename to devlog/_fin/260824_model_ux_aliases_and_defaults/020_new_models_off.md diff --git a/devlog/_plan/260824_model_ux_aliases_and_defaults/030_default_preset.md b/devlog/_fin/260824_model_ux_aliases_and_defaults/030_default_preset.md similarity index 100% rename from devlog/_plan/260824_model_ux_aliases_and_defaults/030_default_preset.md rename to devlog/_fin/260824_model_ux_aliases_and_defaults/030_default_preset.md diff --git a/devlog/_plan/260825_operator_visibility_train/000_baseline_and_scope.md b/devlog/_fin/260825_operator_visibility_train/000_baseline_and_scope.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/000_baseline_and_scope.md rename to devlog/_fin/260825_operator_visibility_train/000_baseline_and_scope.md diff --git a/devlog/_plan/260825_operator_visibility_train/001_current_state_inventory.md b/devlog/_fin/260825_operator_visibility_train/001_current_state_inventory.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/001_current_state_inventory.md rename to devlog/_fin/260825_operator_visibility_train/001_current_state_inventory.md diff --git a/devlog/_plan/260825_operator_visibility_train/002_plan_audit.md b/devlog/_fin/260825_operator_visibility_train/002_plan_audit.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/002_plan_audit.md rename to devlog/_fin/260825_operator_visibility_train/002_plan_audit.md diff --git a/devlog/_plan/260825_operator_visibility_train/010_wp2_issue2457_sidecar_backend_resolution.md b/devlog/_fin/260825_operator_visibility_train/010_wp2_issue2457_sidecar_backend_resolution.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/010_wp2_issue2457_sidecar_backend_resolution.md rename to devlog/_fin/260825_operator_visibility_train/010_wp2_issue2457_sidecar_backend_resolution.md diff --git a/devlog/_plan/260825_operator_visibility_train/020_wp3_issue2411_status_routing_visibility.md b/devlog/_fin/260825_operator_visibility_train/020_wp3_issue2411_status_routing_visibility.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/020_wp3_issue2411_status_routing_visibility.md rename to devlog/_fin/260825_operator_visibility_train/020_wp3_issue2411_status_routing_visibility.md diff --git a/devlog/_plan/260825_operator_visibility_train/030_wp4_issue2412_version_manager_shim.md b/devlog/_fin/260825_operator_visibility_train/030_wp4_issue2412_version_manager_shim.md similarity index 100% rename from devlog/_plan/260825_operator_visibility_train/030_wp4_issue2412_version_manager_shim.md rename to devlog/_fin/260825_operator_visibility_train/030_wp4_issue2412_version_manager_shim.md diff --git a/devlog/_plan/260826_config_rebase_provenance/010_design.md b/devlog/_fin/260826_config_rebase_provenance/010_design.md similarity index 100% rename from devlog/_plan/260826_config_rebase_provenance/010_design.md rename to devlog/_fin/260826_config_rebase_provenance/010_design.md diff --git a/devlog/_plan/260826_cursor_responses_gap/000_plan.md b/devlog/_fin/260826_cursor_responses_gap/000_plan.md similarity index 97% rename from devlog/_plan/260826_cursor_responses_gap/000_plan.md rename to devlog/_fin/260826_cursor_responses_gap/000_plan.md index 748f3be5483..4840cd4073e 100644 --- a/devlog/_plan/260826_cursor_responses_gap/000_plan.md +++ b/devlog/_fin/260826_cursor_responses_gap/000_plan.md @@ -15,7 +15,7 @@ live probe campaign against `cursor/grok-4.6` through the local proxy - Goal: severity-ranked gap catalog with file:line citations + >=10 probe evidence rows. - Non-goals: fixing the adapter, provider config changes, issues/PRs, pushes. -- Verifier: `ls devlog/_plan/260826_cursor_responses_gap` (docs), +- Verifier: `ls devlog/_fin/260826_cursor_responses_gap` (docs), `git status --short src/` (must be empty), probe-count grep in 010 doc. All three run and read the change target (this unit's files / src tree). - Stop: all three docs written and consistent; bounds = ~40min probing, @@ -98,7 +98,7 @@ probes toward the >=10 minimum. secondary references. durationMs:0 is plausibly Codex-client-side — 001 carries it as UNKNOWN with the evidence gap stated. 4. (Medium) Probe-count verifier is now concrete: - `rg -c '^\| (P|C|S)[0-9]' devlog/_plan/260826_cursor_responses_gap/010_probe_campaign.md` + `rg -c '^\| (P|C|S)[0-9]' devlog/_fin/260826_cursor_responses_gap/010_probe_campaign.md` must report >= 10 evidence rows (pass condition), and each row carries a pass/fail column. diff --git a/devlog/_plan/260826_cursor_responses_gap/001_seed_thread_failure_catalog.md b/devlog/_fin/260826_cursor_responses_gap/001_seed_thread_failure_catalog.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/001_seed_thread_failure_catalog.md rename to devlog/_fin/260826_cursor_responses_gap/001_seed_thread_failure_catalog.md diff --git a/devlog/_plan/260826_cursor_responses_gap/010_probe_campaign.md b/devlog/_fin/260826_cursor_responses_gap/010_probe_campaign.md similarity index 99% rename from devlog/_plan/260826_cursor_responses_gap/010_probe_campaign.md rename to devlog/_fin/260826_cursor_responses_gap/010_probe_campaign.md index 791e8a9345d..d5382f8f710 100644 --- a/devlog/_plan/260826_cursor_responses_gap/010_probe_campaign.md +++ b/devlog/_fin/260826_cursor_responses_gap/010_probe_campaign.md @@ -8,7 +8,7 @@ cursor-model workers (S1), plugin-surface exposure (S2), all fenced to read-only tasks or mktemp scratch. Verifier (from 000 plan): -`rg -c '^\| (P|C|S)[0-9]' devlog/_plan/260826_cursor_responses_gap/010_probe_campaign.md` +`rg -c '^\| (P|C|S)[0-9]' devlog/_fin/260826_cursor_responses_gap/010_probe_campaign.md` pass condition >= 10 evidence rows. Bounds: <=30 live probes, <=3 retries/class, ~40min wall clock. diff --git a/devlog/_plan/260826_cursor_responses_gap/020_gap_summary.md b/devlog/_fin/260826_cursor_responses_gap/020_gap_summary.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/020_gap_summary.md rename to devlog/_fin/260826_cursor_responses_gap/020_gap_summary.md diff --git a/devlog/_plan/260826_cursor_responses_gap/025_ultra_k3_research.md b/devlog/_fin/260826_cursor_responses_gap/025_ultra_k3_research.md similarity index 96% rename from devlog/_plan/260826_cursor_responses_gap/025_ultra_k3_research.md rename to devlog/_fin/260826_cursor_responses_gap/025_ultra_k3_research.md index a9592a10b1d..60d2ee5763b 100644 --- a/devlog/_plan/260826_cursor_responses_gap/025_ultra_k3_research.md +++ b/devlog/_fin/260826_cursor_responses_gap/025_ultra_k3_research.md @@ -14,7 +14,7 @@ Claim ledger — status per cxc-search discipline: | K3 1M specifically unlocked on Ultra | user-confirmed 2026-08-26 (operator saw the 1M option live in Cursor on the Ultra plan); public primary source still absent | user observation (authoritative for this deployment) + reddit lead | | Wire: max mode = RequestedModel.max_mode (field 2) AND ModelDetails.max_mode (field 7); missing either can invalid_argument | lead (2 impl sources) | oh-my-pi #4969, cursor-opencode-provider | | 1M exposure pattern: synthetic -1m picker variant w/ limit.context=1M, wire sends original id + maxMode | lead | cursor-opencode-provider README | -| In-repo: GetUsableModels ModelDetails.maxMode=true observed on 28 -fast ids (260822); no contextTokenLimit field | verified (own probe) | devlog/_plan/260822_senpi_cursor_transfer/210_maxmode.md | +| In-repo: GetUsableModels ModelDetails.maxMode=true observed on 28 -fast ids (260822); no contextTokenLimit field | verified (own probe) | devlog/_fin/260822_senpi_cursor_transfer/210_maxmode.md | Design consequence for 070 (ultra toggle): treat "ultra" as a per-model toggle that (a) sets the wire maxMode flag in both RequestedModel and diff --git a/devlog/_plan/260826_cursor_responses_gap/030_callid_sse_parity.md b/devlog/_fin/260826_cursor_responses_gap/030_callid_sse_parity.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/030_callid_sse_parity.md rename to devlog/_fin/260826_cursor_responses_gap/030_callid_sse_parity.md diff --git a/devlog/_plan/260826_cursor_responses_gap/040_preamble_floor.md b/devlog/_fin/260826_cursor_responses_gap/040_preamble_floor.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/040_preamble_floor.md rename to devlog/_fin/260826_cursor_responses_gap/040_preamble_floor.md diff --git a/devlog/_plan/260826_cursor_responses_gap/050_checkpoint_continuity.md b/devlog/_fin/260826_cursor_responses_gap/050_checkpoint_continuity.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/050_checkpoint_continuity.md rename to devlog/_fin/260826_cursor_responses_gap/050_checkpoint_continuity.md diff --git a/devlog/_plan/260826_cursor_responses_gap/060_catalog_honesty.md b/devlog/_fin/260826_cursor_responses_gap/060_catalog_honesty.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/060_catalog_honesty.md rename to devlog/_fin/260826_cursor_responses_gap/060_catalog_honesty.md diff --git a/devlog/_plan/260826_cursor_responses_gap/070_ultra_mode.md b/devlog/_fin/260826_cursor_responses_gap/070_ultra_mode.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/070_ultra_mode.md rename to devlog/_fin/260826_cursor_responses_gap/070_ultra_mode.md diff --git a/devlog/_plan/260826_cursor_responses_gap/080_stall_corruption_diag.md b/devlog/_fin/260826_cursor_responses_gap/080_stall_corruption_diag.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/080_stall_corruption_diag.md rename to devlog/_fin/260826_cursor_responses_gap/080_stall_corruption_diag.md diff --git a/devlog/_plan/260826_cursor_responses_gap/090_gap8_codex_exec_qa.md b/devlog/_fin/260826_cursor_responses_gap/090_gap8_codex_exec_qa.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/090_gap8_codex_exec_qa.md rename to devlog/_fin/260826_cursor_responses_gap/090_gap8_codex_exec_qa.md diff --git a/devlog/_plan/260826_cursor_responses_gap/100_wire_ndjson_qa.md b/devlog/_fin/260826_cursor_responses_gap/100_wire_ndjson_qa.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/100_wire_ndjson_qa.md rename to devlog/_fin/260826_cursor_responses_gap/100_wire_ndjson_qa.md diff --git a/devlog/_plan/260826_cursor_responses_gap/110_app_route_qa.md b/devlog/_fin/260826_cursor_responses_gap/110_app_route_qa.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/110_app_route_qa.md rename to devlog/_fin/260826_cursor_responses_gap/110_app_route_qa.md diff --git a/devlog/_plan/260826_cursor_responses_gap/120_repetition_breaker.md b/devlog/_fin/260826_cursor_responses_gap/120_repetition_breaker.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/120_repetition_breaker.md rename to devlog/_fin/260826_cursor_responses_gap/120_repetition_breaker.md diff --git a/devlog/_plan/260826_cursor_responses_gap/130_envelope_echo_guard.md b/devlog/_fin/260826_cursor_responses_gap/130_envelope_echo_guard.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/130_envelope_echo_guard.md rename to devlog/_fin/260826_cursor_responses_gap/130_envelope_echo_guard.md diff --git a/devlog/_plan/260826_cursor_responses_gap/140_round2_probe_results.md b/devlog/_fin/260826_cursor_responses_gap/140_round2_probe_results.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/140_round2_probe_results.md rename to devlog/_fin/260826_cursor_responses_gap/140_round2_probe_results.md diff --git a/devlog/_plan/260826_cursor_responses_gap/150_routing_commentary_hallucination.md b/devlog/_fin/260826_cursor_responses_gap/150_routing_commentary_hallucination.md similarity index 100% rename from devlog/_plan/260826_cursor_responses_gap/150_routing_commentary_hallucination.md rename to devlog/_fin/260826_cursor_responses_gap/150_routing_commentary_hallucination.md diff --git a/devlog/_plan/260826_pre_substrate_adoption/010_design.md b/devlog/_fin/260826_pre_substrate_adoption/010_design.md similarity index 100% rename from devlog/_plan/260826_pre_substrate_adoption/010_design.md rename to devlog/_fin/260826_pre_substrate_adoption/010_design.md diff --git a/devlog/_plan/260826_provenance_writer/010_design.md b/devlog/_fin/260826_provenance_writer/010_design.md similarity index 100% rename from devlog/_plan/260826_provenance_writer/010_design.md rename to devlog/_fin/260826_provenance_writer/010_design.md diff --git a/devlog/_plan/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md b/devlog/_fin/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md similarity index 100% rename from devlog/_plan/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md rename to devlog/_fin/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md diff --git a/devlog/_plan/260826_session_lane_bounds/010_design.md b/devlog/_fin/260826_session_lane_bounds/010_design.md similarity index 100% rename from devlog/_plan/260826_session_lane_bounds/010_design.md rename to devlog/_fin/260826_session_lane_bounds/010_design.md diff --git a/devlog/_plan/260826_session_lane_bounds/020_reconnect_followup.md b/devlog/_fin/260826_session_lane_bounds/020_reconnect_followup.md similarity index 100% rename from devlog/_plan/260826_session_lane_bounds/020_reconnect_followup.md rename to devlog/_fin/260826_session_lane_bounds/020_reconnect_followup.md diff --git a/devlog/_plan/260826_wp7e_presence_driven_oauth_failover/010_plan.md b/devlog/_fin/260826_wp7e_presence_driven_oauth_failover/010_plan.md similarity index 100% rename from devlog/_plan/260826_wp7e_presence_driven_oauth_failover/010_plan.md rename to devlog/_fin/260826_wp7e_presence_driven_oauth_failover/010_plan.md diff --git a/devlog/_plan/260826_wp7e_presence_driven_oauth_failover/011_audit_response.md b/devlog/_fin/260826_wp7e_presence_driven_oauth_failover/011_audit_response.md similarity index 100% rename from devlog/_plan/260826_wp7e_presence_driven_oauth_failover/011_audit_response.md rename to devlog/_fin/260826_wp7e_presence_driven_oauth_failover/011_audit_response.md diff --git a/devlog/_plan/260826_wp7e_presence_driven_oauth_failover/020_execution.md b/devlog/_fin/260826_wp7e_presence_driven_oauth_failover/020_execution.md similarity index 100% rename from devlog/_plan/260826_wp7e_presence_driven_oauth_failover/020_execution.md rename to devlog/_fin/260826_wp7e_presence_driven_oauth_failover/020_execution.md diff --git a/devlog/_plan/260826_wp7e_presence_driven_oauth_failover/030_post_merge_f5.md b/devlog/_fin/260826_wp7e_presence_driven_oauth_failover/030_post_merge_f5.md similarity index 100% rename from devlog/_plan/260826_wp7e_presence_driven_oauth_failover/030_post_merge_f5.md rename to devlog/_fin/260826_wp7e_presence_driven_oauth_failover/030_post_merge_f5.md diff --git a/devlog/_fin/260827_igwanu_bug_pr_merge_round/011_wp1_outcome.md b/devlog/_fin/260827_igwanu_bug_pr_merge_round/011_wp1_outcome.md index f5fde1ac427..36ab5a3b092 100644 --- a/devlog/_fin/260827_igwanu_bug_pr_merge_round/011_wp1_outcome.md +++ b/devlog/_fin/260827_igwanu_bug_pr_merge_round/011_wp1_outcome.md @@ -99,6 +99,6 @@ runs the native TypeScript 7.0.2 compiler at ~0.44s for a full typecheck. 2. Review, rebase, and verification of other PRs may proceed in parallel — only the merges serialize. 3. Follow-up outside this round's scope: the same pre-disclosure material exists - in `devlog/_plan/260826_wp7e_presence_driven_oauth_failover/` and + in `devlog/_fin/260826_wp7e_presence_driven_oauth_failover/` and `devlog/_plan/260827_dev_hardening/`. Pre-existing, belongs to other active work streams, needs separate authority. **Escalate; do not silently rewrite.** diff --git a/devlog/_fin/260827_igwanu_bug_pr_merge_round/070_outcome.md b/devlog/_fin/260827_igwanu_bug_pr_merge_round/070_outcome.md index 635eae70a7a..4a830113d3a 100644 --- a/devlog/_fin/260827_igwanu_bug_pr_merge_round/070_outcome.md +++ b/devlog/_fin/260827_igwanu_bug_pr_merge_round/070_outcome.md @@ -96,7 +96,7 @@ incorrect correction is worse than the original error. ## Follow-ups outside this round's scope - The same pre-disclosure OAuth material exists in - `devlog/_plan/260826_wp7e_presence_driven_oauth_failover/` and + `devlog/_fin/260826_wp7e_presence_driven_oauth_failover/` and `devlog/_plan/260827_dev_hardening/`. Pre-existing, other work streams, needs separate authority. **Escalated, not silently rewritten.** - `CL-07 task effectiveness producer > inactivity timeout is bounded for trusted diff --git a/devlog/_plan/260827_kiro_builder_id_profile/010_builder_id_request_scoped_profile.md b/devlog/_fin/260827_kiro_builder_id_profile/010_builder_id_request_scoped_profile.md similarity index 100% rename from devlog/_plan/260827_kiro_builder_id_profile/010_builder_id_request_scoped_profile.md rename to devlog/_fin/260827_kiro_builder_id_profile/010_builder_id_request_scoped_profile.md diff --git a/devlog/_plan/260829_kiro_quota_pool/000_research_problem_and_state.md b/devlog/_fin/260829_kiro_quota_pool/000_research_problem_and_state.md similarity index 98% rename from devlog/_plan/260829_kiro_quota_pool/000_research_problem_and_state.md rename to devlog/_fin/260829_kiro_quota_pool/000_research_problem_and_state.md index 468ac62dee4..3bffbfc1fe4 100644 --- a/devlog/_plan/260829_kiro_quota_pool/000_research_problem_and_state.md +++ b/devlog/_fin/260829_kiro_quota_pool/000_research_problem_and_state.md @@ -1,6 +1,6 @@ # 000 — Kiro quota + pool: problem statement and current state -Unit: `devlog/_plan/260829_kiro_quota_pool/` +Unit: `devlog/_fin/260829_kiro_quota_pool/` Opened: 2026-08-29 Work classes: C3 (quota fetcher, pool selection), C2 (surfaces, docs) diff --git a/devlog/_plan/260829_kiro_quota_pool/001_research_upstream_wire_contract.md b/devlog/_fin/260829_kiro_quota_pool/001_research_upstream_wire_contract.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/001_research_upstream_wire_contract.md rename to devlog/_fin/260829_kiro_quota_pool/001_research_upstream_wire_contract.md diff --git a/devlog/_plan/260829_kiro_quota_pool/002_research_kirolb_headtohead.md b/devlog/_fin/260829_kiro_quota_pool/002_research_kirolb_headtohead.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/002_research_kirolb_headtohead.md rename to devlog/_fin/260829_kiro_quota_pool/002_research_kirolb_headtohead.md diff --git a/devlog/_plan/260829_kiro_quota_pool/003_research_pr_reconciliation.md b/devlog/_fin/260829_kiro_quota_pool/003_research_pr_reconciliation.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/003_research_pr_reconciliation.md rename to devlog/_fin/260829_kiro_quota_pool/003_research_pr_reconciliation.md diff --git a/devlog/_plan/260829_kiro_quota_pool/010_kiro_usage_fetcher.md b/devlog/_fin/260829_kiro_quota_pool/010_kiro_usage_fetcher.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/010_kiro_usage_fetcher.md rename to devlog/_fin/260829_kiro_quota_pool/010_kiro_usage_fetcher.md diff --git a/devlog/_plan/260829_kiro_quota_pool/020_per_account_quota_wiring.md b/devlog/_fin/260829_kiro_quota_pool/020_per_account_quota_wiring.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/020_per_account_quota_wiring.md rename to devlog/_fin/260829_kiro_quota_pool/020_per_account_quota_wiring.md diff --git a/devlog/_plan/260829_kiro_quota_pool/030_quota_aware_pool_selection.md b/devlog/_fin/260829_kiro_quota_pool/030_quota_aware_pool_selection.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/030_quota_aware_pool_selection.md rename to devlog/_fin/260829_kiro_quota_pool/030_quota_aware_pool_selection.md diff --git a/devlog/_plan/260829_kiro_quota_pool/040_surfaces_cli_gui_docs.md b/devlog/_fin/260829_kiro_quota_pool/040_surfaces_cli_gui_docs.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/040_surfaces_cli_gui_docs.md rename to devlog/_fin/260829_kiro_quota_pool/040_surfaces_cli_gui_docs.md diff --git a/devlog/_plan/260829_kiro_quota_pool/050_verification_and_delivery.md b/devlog/_fin/260829_kiro_quota_pool/050_verification_and_delivery.md similarity index 97% rename from devlog/_plan/260829_kiro_quota_pool/050_verification_and_delivery.md rename to devlog/_fin/260829_kiro_quota_pool/050_verification_and_delivery.md index 94ab6a785e0..636369a317e 100644 --- a/devlog/_plan/260829_kiro_quota_pool/050_verification_and_delivery.md +++ b/devlog/_fin/260829_kiro_quota_pool/050_verification_and_delivery.md @@ -55,7 +55,7 @@ restart to seed routing. This unit does neither. - Commits: one per phase (`010`…`040`), plus the devlog unit. - PR against `dev`, full template (Summary / Verification / Checklist), GUI screenshot. - Push with `--no-verify` (user-authorized), merge after CI green. -- Move `devlog/_plan/260829_kiro_quota_pool/` → `devlog/_fin/` at close-out, since the +- Move `devlog/_fin/260829_kiro_quota_pool/` → `devlog/_fin/` at close-out, since the fix will be public by then. ## Security note diff --git a/devlog/_plan/260829_kiro_quota_pool/060_audit_round1_amendments.md b/devlog/_fin/260829_kiro_quota_pool/060_audit_round1_amendments.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/060_audit_round1_amendments.md rename to devlog/_fin/260829_kiro_quota_pool/060_audit_round1_amendments.md diff --git a/devlog/_plan/260829_kiro_quota_pool/070_audit_round2_amendments.md b/devlog/_fin/260829_kiro_quota_pool/070_audit_round2_amendments.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/070_audit_round2_amendments.md rename to devlog/_fin/260829_kiro_quota_pool/070_audit_round2_amendments.md diff --git a/devlog/_plan/260829_kiro_quota_pool/080_head_to_head_result.md b/devlog/_fin/260829_kiro_quota_pool/080_head_to_head_result.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/080_head_to_head_result.md rename to devlog/_fin/260829_kiro_quota_pool/080_head_to_head_result.md diff --git a/devlog/_plan/260829_kiro_quota_pool/090_predispatch_selection.md b/devlog/_fin/260829_kiro_quota_pool/090_predispatch_selection.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/090_predispatch_selection.md rename to devlog/_fin/260829_kiro_quota_pool/090_predispatch_selection.md diff --git a/devlog/_plan/260829_kiro_quota_pool/100_quota_persistence.md b/devlog/_fin/260829_kiro_quota_pool/100_quota_persistence.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/100_quota_persistence.md rename to devlog/_fin/260829_kiro_quota_pool/100_quota_persistence.md diff --git a/devlog/_plan/260829_kiro_quota_pool/110_integrated_verification.md b/devlog/_fin/260829_kiro_quota_pool/110_integrated_verification.md similarity index 100% rename from devlog/_plan/260829_kiro_quota_pool/110_integrated_verification.md rename to devlog/_fin/260829_kiro_quota_pool/110_integrated_verification.md diff --git a/devlog/_plan/260830_models_provider_header/000_baseline_and_roadmap.md b/devlog/_fin/260830_models_provider_header/000_baseline_and_roadmap.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/000_baseline_and_roadmap.md rename to devlog/_fin/260830_models_provider_header/000_baseline_and_roadmap.md diff --git a/devlog/_plan/260830_models_provider_header/010_toggle_basis_and_shrink.md b/devlog/_fin/260830_models_provider_header/010_toggle_basis_and_shrink.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/010_toggle_basis_and_shrink.md rename to devlog/_fin/260830_models_provider_header/010_toggle_basis_and_shrink.md diff --git a/devlog/_plan/260830_models_provider_header/011_rejected_designs.md b/devlog/_fin/260830_models_provider_header/011_rejected_designs.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/011_rejected_designs.md rename to devlog/_fin/260830_models_provider_header/011_rejected_designs.md diff --git a/devlog/_plan/260830_models_provider_header/020_control_affordances.md b/devlog/_fin/260830_models_provider_header/020_control_affordances.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/020_control_affordances.md rename to devlog/_fin/260830_models_provider_header/020_control_affordances.md diff --git a/devlog/_plan/260830_models_provider_header/030_uniform_row_and_hover.md b/devlog/_fin/260830_models_provider_header/030_uniform_row_and_hover.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/030_uniform_row_and_hover.md rename to devlog/_fin/260830_models_provider_header/030_uniform_row_and_hover.md diff --git a/devlog/_plan/260830_models_provider_header/040_cap_cluster_and_occupied_slot.md b/devlog/_fin/260830_models_provider_header/040_cap_cluster_and_occupied_slot.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/040_cap_cluster_and_occupied_slot.md rename to devlog/_fin/260830_models_provider_header/040_cap_cluster_and_occupied_slot.md diff --git a/devlog/_plan/260830_models_provider_header/050_hover_affordance_and_column_gate.md b/devlog/_fin/260830_models_provider_header/050_hover_affordance_and_column_gate.md similarity index 100% rename from devlog/_plan/260830_models_provider_header/050_hover_affordance_and_column_gate.md rename to devlog/_fin/260830_models_provider_header/050_hover_affordance_and_column_gate.md diff --git a/devlog/_plan/260830_models_provider_header/evidence/010-after-ko-1100.png b/devlog/_fin/260830_models_provider_header/evidence/010-after-ko-1100.png similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/010-after-ko-1100.png rename to devlog/_fin/260830_models_provider_header/evidence/010-after-ko-1100.png diff --git a/devlog/_plan/260830_models_provider_header/evidence/010-before-ko-1100.png b/devlog/_fin/260830_models_provider_header/evidence/010-before-ko-1100.png similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/010-before-ko-1100.png rename to devlog/_fin/260830_models_provider_header/evidence/010-before-ko-1100.png diff --git a/devlog/_plan/260830_models_provider_header/evidence/020-after-labeled-switch-ko-1280.png b/devlog/_fin/260830_models_provider_header/evidence/020-after-labeled-switch-ko-1280.png similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/020-after-labeled-switch-ko-1280.png rename to devlog/_fin/260830_models_provider_header/evidence/020-after-labeled-switch-ko-1280.png diff --git a/devlog/_plan/260830_models_provider_header/evidence/020-after-labels.json b/devlog/_fin/260830_models_provider_header/evidence/020-after-labels.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/020-after-labels.json rename to devlog/_fin/260830_models_provider_header/evidence/020-after-labels.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/030-baseline.json b/devlog/_fin/260830_models_provider_header/evidence/030-baseline.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/030-baseline.json rename to devlog/_fin/260830_models_provider_header/evidence/030-baseline.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/030-geometry-harness.ts b/devlog/_fin/260830_models_provider_header/evidence/030-geometry-harness.ts similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/030-geometry-harness.ts rename to devlog/_fin/260830_models_provider_header/evidence/030-geometry-harness.ts diff --git a/devlog/_plan/260830_models_provider_header/evidence/030-locale-harness.ts b/devlog/_fin/260830_models_provider_header/evidence/030-locale-harness.ts similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/030-locale-harness.ts rename to devlog/_fin/260830_models_provider_header/evidence/030-locale-harness.ts diff --git a/devlog/_plan/260830_models_provider_header/evidence/030-locale-sweep.json b/devlog/_fin/260830_models_provider_header/evidence/030-locale-sweep.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/030-locale-sweep.json rename to devlog/_fin/260830_models_provider_header/evidence/030-locale-sweep.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/040-after-cap-slot-ko-1280.png b/devlog/_fin/260830_models_provider_header/evidence/040-after-cap-slot-ko-1280.png similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/040-after-cap-slot-ko-1280.png rename to devlog/_fin/260830_models_provider_header/evidence/040-after-cap-slot-ko-1280.png diff --git a/devlog/_plan/260830_models_provider_header/evidence/040-geometry-harness.ts b/devlog/_fin/260830_models_provider_header/evidence/040-geometry-harness.ts similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/040-geometry-harness.ts rename to devlog/_fin/260830_models_provider_header/evidence/040-geometry-harness.ts diff --git a/devlog/_plan/260830_models_provider_header/evidence/050-state-harness.ts b/devlog/_fin/260830_models_provider_header/evidence/050-state-harness.ts similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/050-state-harness.ts rename to devlog/_fin/260830_models_provider_header/evidence/050-state-harness.ts diff --git a/devlog/_plan/260830_models_provider_header/evidence/wp2-states.json b/devlog/_fin/260830_models_provider_header/evidence/wp2-states.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/wp2-states.json rename to devlog/_fin/260830_models_provider_header/evidence/wp2-states.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/wp2-touch.json b/devlog/_fin/260830_models_provider_header/evidence/wp2-touch.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/wp2-touch.json rename to devlog/_fin/260830_models_provider_header/evidence/wp2-touch.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/wp3-geometry.json b/devlog/_fin/260830_models_provider_header/evidence/wp3-geometry.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/wp3-geometry.json rename to devlog/_fin/260830_models_provider_header/evidence/wp3-geometry.json diff --git a/devlog/_plan/260830_models_provider_header/evidence/wp3-state.json b/devlog/_fin/260830_models_provider_header/evidence/wp3-state.json similarity index 100% rename from devlog/_plan/260830_models_provider_header/evidence/wp3-state.json rename to devlog/_fin/260830_models_provider_header/evidence/wp3-state.json diff --git a/devlog/_plan/260901_merge_train_round3/000_plan.md b/devlog/_fin/260901_merge_train_round3/000_plan.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/000_plan.md rename to devlog/_fin/260901_merge_train_round3/000_plan.md diff --git a/devlog/_plan/260901_merge_train_round3/002_audit_round1_synthesis.md b/devlog/_fin/260901_merge_train_round3/002_audit_round1_synthesis.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/002_audit_round1_synthesis.md rename to devlog/_fin/260901_merge_train_round3/002_audit_round1_synthesis.md diff --git a/devlog/_plan/260901_merge_train_round3/010_wp1_3114_docs_devlog.md b/devlog/_fin/260901_merge_train_round3/010_wp1_3114_docs_devlog.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/010_wp1_3114_docs_devlog.md rename to devlog/_fin/260901_merge_train_round3/010_wp1_3114_docs_devlog.md diff --git a/devlog/_plan/260901_merge_train_round3/011_wp1_outcome.md b/devlog/_fin/260901_merge_train_round3/011_wp1_outcome.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/011_wp1_outcome.md rename to devlog/_fin/260901_merge_train_round3/011_wp1_outcome.md diff --git a/devlog/_plan/260901_merge_train_round3/020_wp2_3122_provider_patch_fakeip.md b/devlog/_fin/260901_merge_train_round3/020_wp2_3122_provider_patch_fakeip.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/020_wp2_3122_provider_patch_fakeip.md rename to devlog/_fin/260901_merge_train_round3/020_wp2_3122_provider_patch_fakeip.md diff --git a/devlog/_plan/260901_merge_train_round3/021_wp2_security_review.md b/devlog/_fin/260901_merge_train_round3/021_wp2_security_review.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/021_wp2_security_review.md rename to devlog/_fin/260901_merge_train_round3/021_wp2_security_review.md diff --git a/devlog/_plan/260901_merge_train_round3/030_wp3_3104_service_and_closeouts.md b/devlog/_fin/260901_merge_train_round3/030_wp3_3104_service_and_closeouts.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/030_wp3_3104_service_and_closeouts.md rename to devlog/_fin/260901_merge_train_round3/030_wp3_3104_service_and_closeouts.md diff --git a/devlog/_plan/260901_merge_train_round3/031_wp3_outcome.md b/devlog/_fin/260901_merge_train_round3/031_wp3_outcome.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/031_wp3_outcome.md rename to devlog/_fin/260901_merge_train_round3/031_wp3_outcome.md diff --git a/devlog/_plan/260901_merge_train_round3/040_wp4_3042_pid_probe.md b/devlog/_fin/260901_merge_train_round3/040_wp4_3042_pid_probe.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/040_wp4_3042_pid_probe.md rename to devlog/_fin/260901_merge_train_round3/040_wp4_3042_pid_probe.md diff --git a/devlog/_plan/260901_merge_train_round3/050_wp5_close_3077_rebase_3109_3112.md b/devlog/_fin/260901_merge_train_round3/050_wp5_close_3077_rebase_3109_3112.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/050_wp5_close_3077_rebase_3109_3112.md rename to devlog/_fin/260901_merge_train_round3/050_wp5_close_3077_rebase_3109_3112.md diff --git a/devlog/_plan/260901_merge_train_round3/051_wp5_outcome.md b/devlog/_fin/260901_merge_train_round3/051_wp5_outcome.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/051_wp5_outcome.md rename to devlog/_fin/260901_merge_train_round3/051_wp5_outcome.md diff --git a/devlog/_plan/260901_merge_train_round3/060_wp7_websocket_refresh_flake.md b/devlog/_fin/260901_merge_train_round3/060_wp7_websocket_refresh_flake.md similarity index 100% rename from devlog/_plan/260901_merge_train_round3/060_wp7_websocket_refresh_flake.md rename to devlog/_fin/260901_merge_train_round3/060_wp7_websocket_refresh_flake.md diff --git a/devlog/_plan/260902_bug_label_drawdown/000_plan.md b/devlog/_fin/260902_bug_label_drawdown/000_plan.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/000_plan.md rename to devlog/_fin/260902_bug_label_drawdown/000_plan.md diff --git a/devlog/_plan/260902_bug_label_drawdown/010_phase1.md b/devlog/_fin/260902_bug_label_drawdown/010_phase1.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/010_phase1.md rename to devlog/_fin/260902_bug_label_drawdown/010_phase1.md diff --git a/devlog/_plan/260902_bug_label_drawdown/011_bd1_landing.md b/devlog/_fin/260902_bug_label_drawdown/011_bd1_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/011_bd1_landing.md rename to devlog/_fin/260902_bug_label_drawdown/011_bd1_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/020_phase2.md b/devlog/_fin/260902_bug_label_drawdown/020_phase2.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/020_phase2.md rename to devlog/_fin/260902_bug_label_drawdown/020_phase2.md diff --git a/devlog/_plan/260902_bug_label_drawdown/021_bd2_landing.md b/devlog/_fin/260902_bug_label_drawdown/021_bd2_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/021_bd2_landing.md rename to devlog/_fin/260902_bug_label_drawdown/021_bd2_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/030_phase3.md b/devlog/_fin/260902_bug_label_drawdown/030_phase3.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/030_phase3.md rename to devlog/_fin/260902_bug_label_drawdown/030_phase3.md diff --git a/devlog/_plan/260902_bug_label_drawdown/031_bd3_landing.md b/devlog/_fin/260902_bug_label_drawdown/031_bd3_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/031_bd3_landing.md rename to devlog/_fin/260902_bug_label_drawdown/031_bd3_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/040_phase4.md b/devlog/_fin/260902_bug_label_drawdown/040_phase4.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/040_phase4.md rename to devlog/_fin/260902_bug_label_drawdown/040_phase4.md diff --git a/devlog/_plan/260902_bug_label_drawdown/041_bd4_landing.md b/devlog/_fin/260902_bug_label_drawdown/041_bd4_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/041_bd4_landing.md rename to devlog/_fin/260902_bug_label_drawdown/041_bd4_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/050_bd5_replan.md b/devlog/_fin/260902_bug_label_drawdown/050_bd5_replan.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/050_bd5_replan.md rename to devlog/_fin/260902_bug_label_drawdown/050_bd5_replan.md diff --git a/devlog/_plan/260902_bug_label_drawdown/050_phase5.md b/devlog/_fin/260902_bug_label_drawdown/050_phase5.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/050_phase5.md rename to devlog/_fin/260902_bug_label_drawdown/050_phase5.md diff --git a/devlog/_plan/260902_bug_label_drawdown/051_i3141.md b/devlog/_fin/260902_bug_label_drawdown/051_i3141.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/051_i3141.md rename to devlog/_fin/260902_bug_label_drawdown/051_i3141.md diff --git a/devlog/_plan/260902_bug_label_drawdown/052_i3152.md b/devlog/_fin/260902_bug_label_drawdown/052_i3152.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/052_i3152.md rename to devlog/_fin/260902_bug_label_drawdown/052_i3152.md diff --git a/devlog/_plan/260902_bug_label_drawdown/053_i3136.md b/devlog/_fin/260902_bug_label_drawdown/053_i3136.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/053_i3136.md rename to devlog/_fin/260902_bug_label_drawdown/053_i3136.md diff --git a/devlog/_plan/260902_bug_label_drawdown/054_i3150.md b/devlog/_fin/260902_bug_label_drawdown/054_i3150.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/054_i3150.md rename to devlog/_fin/260902_bug_label_drawdown/054_i3150.md diff --git a/devlog/_plan/260902_bug_label_drawdown/055_i3155.md b/devlog/_fin/260902_bug_label_drawdown/055_i3155.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/055_i3155.md rename to devlog/_fin/260902_bug_label_drawdown/055_i3155.md diff --git a/devlog/_plan/260902_bug_label_drawdown/056_i1419.md b/devlog/_fin/260902_bug_label_drawdown/056_i1419.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/056_i1419.md rename to devlog/_fin/260902_bug_label_drawdown/056_i1419.md diff --git a/devlog/_plan/260902_bug_label_drawdown/057_i2999.md b/devlog/_fin/260902_bug_label_drawdown/057_i2999.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/057_i2999.md rename to devlog/_fin/260902_bug_label_drawdown/057_i2999.md diff --git a/devlog/_plan/260902_bug_label_drawdown/058_i2813.md b/devlog/_fin/260902_bug_label_drawdown/058_i2813.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/058_i2813.md rename to devlog/_fin/260902_bug_label_drawdown/058_i2813.md diff --git a/devlog/_plan/260902_bug_label_drawdown/059_i1527.md b/devlog/_fin/260902_bug_label_drawdown/059_i1527.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/059_i1527.md rename to devlog/_fin/260902_bug_label_drawdown/059_i1527.md diff --git a/devlog/_plan/260902_bug_label_drawdown/060_phase6.md b/devlog/_fin/260902_bug_label_drawdown/060_phase6.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/060_phase6.md rename to devlog/_fin/260902_bug_label_drawdown/060_phase6.md diff --git a/devlog/_plan/260902_bug_label_drawdown/061_p3193.md b/devlog/_fin/260902_bug_label_drawdown/061_p3193.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/061_p3193.md rename to devlog/_fin/260902_bug_label_drawdown/061_p3193.md diff --git a/devlog/_plan/260902_bug_label_drawdown/062_p3193_landing.md b/devlog/_fin/260902_bug_label_drawdown/062_p3193_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/062_p3193_landing.md rename to devlog/_fin/260902_bug_label_drawdown/062_p3193_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/063_i3217.md b/devlog/_fin/260902_bug_label_drawdown/063_i3217.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/063_i3217.md rename to devlog/_fin/260902_bug_label_drawdown/063_i3217.md diff --git a/devlog/_plan/260902_bug_label_drawdown/064_i3217_landing.md b/devlog/_fin/260902_bug_label_drawdown/064_i3217_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/064_i3217_landing.md rename to devlog/_fin/260902_bug_label_drawdown/064_i3217_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/070_regaudit.md b/devlog/_fin/260902_bug_label_drawdown/070_regaudit.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/070_regaudit.md rename to devlog/_fin/260902_bug_label_drawdown/070_regaudit.md diff --git a/devlog/_plan/260902_bug_label_drawdown/071_regaudit_landing.md b/devlog/_fin/260902_bug_label_drawdown/071_regaudit_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/071_regaudit_landing.md rename to devlog/_fin/260902_bug_label_drawdown/071_regaudit_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/072_regaudit2.md b/devlog/_fin/260902_bug_label_drawdown/072_regaudit2.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/072_regaudit2.md rename to devlog/_fin/260902_bug_label_drawdown/072_regaudit2.md diff --git a/devlog/_plan/260902_bug_label_drawdown/080_p3226.md b/devlog/_fin/260902_bug_label_drawdown/080_p3226.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/080_p3226.md rename to devlog/_fin/260902_bug_label_drawdown/080_p3226.md diff --git a/devlog/_plan/260902_bug_label_drawdown/081_p3226_landing.md b/devlog/_fin/260902_bug_label_drawdown/081_p3226_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/081_p3226_landing.md rename to devlog/_fin/260902_bug_label_drawdown/081_p3226_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/082_p3227.md b/devlog/_fin/260902_bug_label_drawdown/082_p3227.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/082_p3227.md rename to devlog/_fin/260902_bug_label_drawdown/082_p3227.md diff --git a/devlog/_plan/260902_bug_label_drawdown/083_p3227_landing.md b/devlog/_fin/260902_bug_label_drawdown/083_p3227_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/083_p3227_landing.md rename to devlog/_fin/260902_bug_label_drawdown/083_p3227_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/084_p3228.md b/devlog/_fin/260902_bug_label_drawdown/084_p3228.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/084_p3228.md rename to devlog/_fin/260902_bug_label_drawdown/084_p3228.md diff --git a/devlog/_plan/260902_bug_label_drawdown/085_p3228_landing.md b/devlog/_fin/260902_bug_label_drawdown/085_p3228_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/085_p3228_landing.md rename to devlog/_fin/260902_bug_label_drawdown/085_p3228_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/086_p3229.md b/devlog/_fin/260902_bug_label_drawdown/086_p3229.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/086_p3229.md rename to devlog/_fin/260902_bug_label_drawdown/086_p3229.md diff --git a/devlog/_plan/260902_bug_label_drawdown/087_p3229_landing.md b/devlog/_fin/260902_bug_label_drawdown/087_p3229_landing.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/087_p3229_landing.md rename to devlog/_fin/260902_bug_label_drawdown/087_p3229_landing.md diff --git a/devlog/_plan/260902_bug_label_drawdown/088_r3239.md b/devlog/_fin/260902_bug_label_drawdown/088_r3239.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/088_r3239.md rename to devlog/_fin/260902_bug_label_drawdown/088_r3239.md diff --git a/devlog/_plan/260902_bug_label_drawdown/089_p3232.md b/devlog/_fin/260902_bug_label_drawdown/089_p3232.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/089_p3232.md rename to devlog/_fin/260902_bug_label_drawdown/089_p3232.md diff --git a/devlog/_plan/260902_bug_label_drawdown/090_regaudit3.md b/devlog/_fin/260902_bug_label_drawdown/090_regaudit3.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/090_regaudit3.md rename to devlog/_fin/260902_bug_label_drawdown/090_regaudit3.md diff --git a/devlog/_plan/260902_bug_label_drawdown/091_rv3239.md b/devlog/_fin/260902_bug_label_drawdown/091_rv3239.md similarity index 100% rename from devlog/_plan/260902_bug_label_drawdown/091_rv3239.md rename to devlog/_fin/260902_bug_label_drawdown/091_rv3239.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/000_research.md b/devlog/_fin/260902_cursor_bundle_effort_table/000_research.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/000_research.md rename to devlog/_fin/260902_cursor_bundle_effort_table/000_research.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/001_bundle_protocol.md b/devlog/_fin/260902_cursor_bundle_effort_table/001_bundle_protocol.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/001_bundle_protocol.md rename to devlog/_fin/260902_cursor_bundle_effort_table/001_bundle_protocol.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/005_audit_round1.md b/devlog/_fin/260902_cursor_bundle_effort_table/005_audit_round1.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/005_audit_round1.md rename to devlog/_fin/260902_cursor_bundle_effort_table/005_audit_round1.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/010_wp1_bundle_effort_table.md b/devlog/_fin/260902_cursor_bundle_effort_table/010_wp1_bundle_effort_table.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/010_wp1_bundle_effort_table.md rename to devlog/_fin/260902_cursor_bundle_effort_table/010_wp1_bundle_effort_table.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/020_wp2_models_max_output.md b/devlog/_fin/260902_cursor_bundle_effort_table/020_wp2_models_max_output.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/020_wp2_models_max_output.md rename to devlog/_fin/260902_cursor_bundle_effort_table/020_wp2_models_max_output.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md b/devlog/_fin/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md similarity index 99% rename from devlog/_plan/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md rename to devlog/_fin/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md index ae113988fe2..c695c70ce52 100644 --- a/devlog/_plan/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md +++ b/devlog/_fin/260902_cursor_bundle_effort_table/030_wp3_effort_variant_rows.md @@ -28,7 +28,7 @@ Amendment (d): `tableLess` in the status route uses `predictCursorEffort(id, tab --- -No files were modified. The untracked `devlog/_plan/260902_cursor_bundle_effort_table/` appeared concurrently and was left untouched. No tests were run. +No files were modified. The untracked `devlog/_fin/260902_cursor_bundle_effort_table/` appeared concurrently and was left untouched. No tests were run. ## Recommendation diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/040_wp4_gui_provenance_hint.md b/devlog/_fin/260902_cursor_bundle_effort_table/040_wp4_gui_provenance_hint.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/040_wp4_gui_provenance_hint.md rename to devlog/_fin/260902_cursor_bundle_effort_table/040_wp4_gui_provenance_hint.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/041_wp4_screenshot.png b/devlog/_fin/260902_cursor_bundle_effort_table/041_wp4_screenshot.png similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/041_wp4_screenshot.png rename to devlog/_fin/260902_cursor_bundle_effort_table/041_wp4_screenshot.png diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/050_wp5_claude_id_normalizer.md b/devlog/_fin/260902_cursor_bundle_effort_table/050_wp5_claude_id_normalizer.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/050_wp5_claude_id_normalizer.md rename to devlog/_fin/260902_cursor_bundle_effort_table/050_wp5_claude_id_normalizer.md diff --git a/devlog/_plan/260902_cursor_bundle_effort_table/060_wp6_guide.md b/devlog/_fin/260902_cursor_bundle_effort_table/060_wp6_guide.md similarity index 100% rename from devlog/_plan/260902_cursor_bundle_effort_table/060_wp6_guide.md rename to devlog/_fin/260902_cursor_bundle_effort_table/060_wp6_guide.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/000_research.md b/devlog/_fin/260902_cursor_integrations_tab/000_research.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/000_research.md rename to devlog/_fin/260902_cursor_integrations_tab/000_research.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/005_audit_round1.md b/devlog/_fin/260902_cursor_integrations_tab/005_audit_round1.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/005_audit_round1.md rename to devlog/_fin/260902_cursor_integrations_tab/005_audit_round1.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/006_roadmap_lock.md b/devlog/_fin/260902_cursor_integrations_tab/006_roadmap_lock.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/006_roadmap_lock.md rename to devlog/_fin/260902_cursor_integrations_tab/006_roadmap_lock.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/007_audit_round1_reviewer.md b/devlog/_fin/260902_cursor_integrations_tab/007_audit_round1_reviewer.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/007_audit_round1_reviewer.md rename to devlog/_fin/260902_cursor_integrations_tab/007_audit_round1_reviewer.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/010_layer1_server_status.md b/devlog/_fin/260902_cursor_integrations_tab/010_layer1_server_status.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/010_layer1_server_status.md rename to devlog/_fin/260902_cursor_integrations_tab/010_layer1_server_status.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/020_layer2_gui_tab.md b/devlog/_fin/260902_cursor_integrations_tab/020_layer2_gui_tab.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/020_layer2_gui_tab.md rename to devlog/_fin/260902_cursor_integrations_tab/020_layer2_gui_tab.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/030_layer3_docs.md b/devlog/_fin/260902_cursor_integrations_tab/030_layer3_docs.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/030_layer3_docs.md rename to devlog/_fin/260902_cursor_integrations_tab/030_layer3_docs.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/040_publish_stack.md b/devlog/_fin/260902_cursor_integrations_tab/040_publish_stack.md similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/040_publish_stack.md rename to devlog/_fin/260902_cursor_integrations_tab/040_publish_stack.md diff --git a/devlog/_plan/260902_cursor_integrations_tab/assets/cursor-overview-card.png b/devlog/_fin/260902_cursor_integrations_tab/assets/cursor-overview-card.png similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/assets/cursor-overview-card.png rename to devlog/_fin/260902_cursor_integrations_tab/assets/cursor-overview-card.png diff --git a/devlog/_plan/260902_cursor_integrations_tab/assets/cursor-tab-detected.png b/devlog/_fin/260902_cursor_integrations_tab/assets/cursor-tab-detected.png similarity index 100% rename from devlog/_plan/260902_cursor_integrations_tab/assets/cursor-tab-detected.png rename to devlog/_fin/260902_cursor_integrations_tab/assets/cursor-tab-detected.png diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/000_scope.md b/devlog/_fin/260902_nonbug_adoption_backlog/000_scope.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/000_scope.md rename to devlog/_fin/260902_nonbug_adoption_backlog/000_scope.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/010_wp1_adaptive_reasoning_effort.md b/devlog/_fin/260902_nonbug_adoption_backlog/010_wp1_adaptive_reasoning_effort.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/010_wp1_adaptive_reasoning_effort.md rename to devlog/_fin/260902_nonbug_adoption_backlog/010_wp1_adaptive_reasoning_effort.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/011_wp1_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/011_wp1_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/011_wp1_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/011_wp1_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/020_wp2_outbound_body_guard.md b/devlog/_fin/260902_nonbug_adoption_backlog/020_wp2_outbound_body_guard.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/020_wp2_outbound_body_guard.md rename to devlog/_fin/260902_nonbug_adoption_backlog/020_wp2_outbound_body_guard.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/021_wp2_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/021_wp2_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/021_wp2_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/021_wp2_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/030_wp3_compaction_provider.md b/devlog/_fin/260902_nonbug_adoption_backlog/030_wp3_compaction_provider.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/030_wp3_compaction_provider.md rename to devlog/_fin/260902_nonbug_adoption_backlog/030_wp3_compaction_provider.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/031_wp3_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/031_wp3_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/031_wp3_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/031_wp3_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/040_wp4_retain_models.md b/devlog/_fin/260902_nonbug_adoption_backlog/040_wp4_retain_models.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/040_wp4_retain_models.md rename to devlog/_fin/260902_nonbug_adoption_backlog/040_wp4_retain_models.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/041_wp4_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/041_wp4_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/041_wp4_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/041_wp4_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/050_wp5_xai_imagine_carry.md b/devlog/_fin/260902_nonbug_adoption_backlog/050_wp5_xai_imagine_carry.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/050_wp5_xai_imagine_carry.md rename to devlog/_fin/260902_nonbug_adoption_backlog/050_wp5_xai_imagine_carry.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/051_wp5_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/051_wp5_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/051_wp5_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/051_wp5_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/060_wp6_authless_desktop.md b/devlog/_fin/260902_nonbug_adoption_backlog/060_wp6_authless_desktop.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/060_wp6_authless_desktop.md rename to devlog/_fin/260902_nonbug_adoption_backlog/060_wp6_authless_desktop.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/061_wp6_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/061_wp6_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/061_wp6_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/061_wp6_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/070_wp7_shim_free_token.md b/devlog/_fin/260902_nonbug_adoption_backlog/070_wp7_shim_free_token.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/070_wp7_shim_free_token.md rename to devlog/_fin/260902_nonbug_adoption_backlog/070_wp7_shim_free_token.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/071_wp7_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/071_wp7_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/071_wp7_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/071_wp7_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/080_wp8_windows_proxy_auto.md b/devlog/_fin/260902_nonbug_adoption_backlog/080_wp8_windows_proxy_auto.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/080_wp8_windows_proxy_auto.md rename to devlog/_fin/260902_nonbug_adoption_backlog/080_wp8_windows_proxy_auto.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/081_wp8_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/081_wp8_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/081_wp8_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/081_wp8_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/090_wp9_keychain_keys.md b/devlog/_fin/260902_nonbug_adoption_backlog/090_wp9_keychain_keys.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/090_wp9_keychain_keys.md rename to devlog/_fin/260902_nonbug_adoption_backlog/090_wp9_keychain_keys.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/091_wp9_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/091_wp9_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/091_wp9_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/091_wp9_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/100_wp10_display_names_carry.md b/devlog/_fin/260902_nonbug_adoption_backlog/100_wp10_display_names_carry.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/100_wp10_display_names_carry.md rename to devlog/_fin/260902_nonbug_adoption_backlog/100_wp10_display_names_carry.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/101_wp10_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/101_wp10_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/101_wp10_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/101_wp10_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/110_wp11_antigravity_account_quota.md b/devlog/_fin/260902_nonbug_adoption_backlog/110_wp11_antigravity_account_quota.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/110_wp11_antigravity_account_quota.md rename to devlog/_fin/260902_nonbug_adoption_backlog/110_wp11_antigravity_account_quota.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/111_wp11_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/111_wp11_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/111_wp11_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/111_wp11_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/120_wp12_oauth_pool_capability.md b/devlog/_fin/260902_nonbug_adoption_backlog/120_wp12_oauth_pool_capability.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/120_wp12_oauth_pool_capability.md rename to devlog/_fin/260902_nonbug_adoption_backlog/120_wp12_oauth_pool_capability.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/121_wp12_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/121_wp12_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/121_wp12_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/121_wp12_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md b/devlog/_fin/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md rename to devlog/_fin/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/131_wp13_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/131_wp13_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/131_wp13_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/131_wp13_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/140_wp14_upstream_ws_carry.md b/devlog/_fin/260902_nonbug_adoption_backlog/140_wp14_upstream_ws_carry.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/140_wp14_upstream_ws_carry.md rename to devlog/_fin/260902_nonbug_adoption_backlog/140_wp14_upstream_ws_carry.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/141_wp14_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/141_wp14_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/141_wp14_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/141_wp14_audit_r1_synthesis.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/150_wp15_plaintext_v2_disposition.md b/devlog/_fin/260902_nonbug_adoption_backlog/150_wp15_plaintext_v2_disposition.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/150_wp15_plaintext_v2_disposition.md rename to devlog/_fin/260902_nonbug_adoption_backlog/150_wp15_plaintext_v2_disposition.md diff --git a/devlog/_plan/260902_nonbug_adoption_backlog/151_wp15_audit_r1_synthesis.md b/devlog/_fin/260902_nonbug_adoption_backlog/151_wp15_audit_r1_synthesis.md similarity index 100% rename from devlog/_plan/260902_nonbug_adoption_backlog/151_wp15_audit_r1_synthesis.md rename to devlog/_fin/260902_nonbug_adoption_backlog/151_wp15_audit_r1_synthesis.md diff --git a/devlog/_fin/260902_windows_ci_release/070_outcome.md b/devlog/_fin/260902_windows_ci_release/070_outcome.md index a0791df4ea9..707161b1505 100644 --- a/devlog/_fin/260902_windows_ci_release/070_outcome.md +++ b/devlog/_fin/260902_windows_ci_release/070_outcome.md @@ -33,7 +33,7 @@ fuck-powershell: 56e1801, 2f2107d — 87→90 cases, graph 313/643, validate OK. ## Regression audit (wp4) -Reused `devlog/_plan/260902_bug_label_drawdown/071_regaudit_landing.md` (four reviewers, +Reused `devlog/_fin/260902_bug_label_drawdown/071_regaudit_landing.md` (four reviewers, no regression main..dev at 5bc6939d8) plus the Windows repair reviews above for the delta since. ## Release (wp5) diff --git a/devlog/_plan/260904_flagship_native_always_visible/000_research.md b/devlog/_fin/260904_flagship_native_always_visible/000_research.md similarity index 100% rename from devlog/_plan/260904_flagship_native_always_visible/000_research.md rename to devlog/_fin/260904_flagship_native_always_visible/000_research.md diff --git a/devlog/_plan/260904_flagship_native_always_visible/005_audit_synthesis.md b/devlog/_fin/260904_flagship_native_always_visible/005_audit_synthesis.md similarity index 100% rename from devlog/_plan/260904_flagship_native_always_visible/005_audit_synthesis.md rename to devlog/_fin/260904_flagship_native_always_visible/005_audit_synthesis.md diff --git a/devlog/_plan/260904_flagship_native_always_visible/010_wp2_ungate.md b/devlog/_fin/260904_flagship_native_always_visible/010_wp2_ungate.md similarity index 100% rename from devlog/_plan/260904_flagship_native_always_visible/010_wp2_ungate.md rename to devlog/_fin/260904_flagship_native_always_visible/010_wp2_ungate.md diff --git a/devlog/_plan/260904_flagship_native_always_visible/020_wp3_landing.md b/devlog/_fin/260904_flagship_native_always_visible/020_wp3_landing.md similarity index 100% rename from devlog/_plan/260904_flagship_native_always_visible/020_wp3_landing.md rename to devlog/_fin/260904_flagship_native_always_visible/020_wp3_landing.md diff --git a/devlog/_fin/260904_priority65_closeout/040_wp5_reset_credit_identity.md b/devlog/_fin/260904_priority65_closeout/040_wp5_reset_credit_identity.md index 97db7fc90bd..77dc8ce2c5e 100644 --- a/devlog/_fin/260904_priority65_closeout/040_wp5_reset_credit_identity.md +++ b/devlog/_fin/260904_priority65_closeout/040_wp5_reset_credit_identity.md @@ -39,7 +39,7 @@ $ rg -n 'openResetCreditOperation|settleResetCreditOperation|markResetCreditOper (출력 없음) $ rg -n 'reset-credit-operation-ledger' -g '!node_modules' . -devlog/_plan/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md:6 +devlog/_fin/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md:6 tests/codex-reset-credit-operation-ledger.test.ts:24 ``` @@ -60,7 +60,7 @@ legacy 행 승격 + 부분 실패 롤백을 넣지 않는다. 이건 "언젠가 **(4) 별도 devlog가 이 원장을 "unused"로 명시하고 재사용을 계획한다.** -`devlog/_plan/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md:6`: +`devlog/_fin/260902_nonbug_adoption_backlog/130_wp13_reset_credit_auto_redeem.md:6`: > An unused #657 ledger (`reset-credit-operation-ledger.ts`, kinds `recovery|manual`) exists. diff --git a/devlog/_plan/260905_astra_subagent_roster/000_plan.md b/devlog/_fin/260905_astra_subagent_roster/000_plan.md similarity index 100% rename from devlog/_plan/260905_astra_subagent_roster/000_plan.md rename to devlog/_fin/260905_astra_subagent_roster/000_plan.md diff --git a/devlog/_plan/260905_astra_subagent_roster/010_roster_upgrade.md b/devlog/_fin/260905_astra_subagent_roster/010_roster_upgrade.md similarity index 100% rename from devlog/_plan/260905_astra_subagent_roster/010_roster_upgrade.md rename to devlog/_fin/260905_astra_subagent_roster/010_roster_upgrade.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/000_plan.md b/devlog/_fin/260905_http_upstream_ws_parity/000_plan.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/000_plan.md rename to devlog/_fin/260905_http_upstream_ws_parity/000_plan.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/001_source_contract.md b/devlog/_fin/260905_http_upstream_ws_parity/001_source_contract.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/001_source_contract.md rename to devlog/_fin/260905_http_upstream_ws_parity/001_source_contract.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/002_audit_synthesis.md b/devlog/_fin/260905_http_upstream_ws_parity/002_audit_synthesis.md similarity index 91% rename from devlog/_plan/260905_http_upstream_ws_parity/002_audit_synthesis.md rename to devlog/_fin/260905_http_upstream_ws_parity/002_audit_synthesis.md index 4fc60e5cd87..a5575a085b5 100644 --- a/devlog/_plan/260905_http_upstream_ws_parity/002_audit_synthesis.md +++ b/devlog/_fin/260905_http_upstream_ws_parity/002_audit_synthesis.md @@ -10,7 +10,7 @@ First independent verdict: FAIL, four High and one Medium planning blockers. No No blockers were dismissed for convenience. Re-review is limited to these amendments and their interaction with existing retry/cleanup boundaries. Final resolution remains pending until the reviewer returns. -Additional baseline checks: direct `/Users/jun/.bun/bin/bun x --no-install tsc --noEmit` passed; `/Users/jun/.bun/bin/bun scripts/privacy-scan.ts` passed; `gitleaks dir devlog/_plan/260905_http_upstream_ws_parity --no-banner --redact` found no leaks. `bun run` aliases initially encountered the intentionally uninstalled package-local Bun stub after `--ignore-scripts`; direct installed Bun executes the same checker without invoking package install scripts or changing the live install. +Additional baseline checks: direct `/Users/jun/.bun/bin/bun x --no-install tsc --noEmit` passed; `/Users/jun/.bun/bin/bun scripts/privacy-scan.ts` passed; `gitleaks dir devlog/_fin/260905_http_upstream_ws_parity --no-banner --redact` found no leaks. `bun run` aliases initially encountered the intentionally uninstalled package-local Bun stub after `--ignore-scripts`; direct installed Bun executes the same checker without invoking package install scripts or changing the live install. Second audit: FAIL with three bounded amendments. Accepted missing preparation-stage placement and null lease fallback; both are fixed in 020, including final-byte-cap tests. Accepted unsupported nested quota/promo projection: 010 now projects only the inspected native event contract, while unknown fields remain in the bounded original event. Header-family projection now agrees with the shared safe-header owner. diff --git a/devlog/_plan/260905_http_upstream_ws_parity/003_roadmap_outcome.md b/devlog/_fin/260905_http_upstream_ws_parity/003_roadmap_outcome.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/003_roadmap_outcome.md rename to devlog/_fin/260905_http_upstream_ws_parity/003_roadmap_outcome.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/010_protocol.md b/devlog/_fin/260905_http_upstream_ws_parity/010_protocol.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/010_protocol.md rename to devlog/_fin/260905_http_upstream_ws_parity/010_protocol.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/011_protocol_build.md b/devlog/_fin/260905_http_upstream_ws_parity/011_protocol_build.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/011_protocol_build.md rename to devlog/_fin/260905_http_upstream_ws_parity/011_protocol_build.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/012_protocol_outcome.md b/devlog/_fin/260905_http_upstream_ws_parity/012_protocol_outcome.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/012_protocol_outcome.md rename to devlog/_fin/260905_http_upstream_ws_parity/012_protocol_outcome.md diff --git a/devlog/_plan/260905_http_upstream_ws_parity/020_lifecycle.md b/devlog/_fin/260905_http_upstream_ws_parity/020_lifecycle.md similarity index 100% rename from devlog/_plan/260905_http_upstream_ws_parity/020_lifecycle.md rename to devlog/_fin/260905_http_upstream_ws_parity/020_lifecycle.md diff --git a/devlog/_plan/260905_main_quota_guard/000_plan.md b/devlog/_fin/260905_main_quota_guard/000_plan.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/000_plan.md rename to devlog/_fin/260905_main_quota_guard/000_plan.md diff --git a/devlog/_plan/260905_main_quota_guard/001_source_findings.md b/devlog/_fin/260905_main_quota_guard/001_source_findings.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/001_source_findings.md rename to devlog/_fin/260905_main_quota_guard/001_source_findings.md diff --git a/devlog/_plan/260905_main_quota_guard/002_audit_synthesis.md b/devlog/_fin/260905_main_quota_guard/002_audit_synthesis.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/002_audit_synthesis.md rename to devlog/_fin/260905_main_quota_guard/002_audit_synthesis.md diff --git a/devlog/_plan/260905_main_quota_guard/010_policy.md b/devlog/_fin/260905_main_quota_guard/010_policy.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/010_policy.md rename to devlog/_fin/260905_main_quota_guard/010_policy.md diff --git a/devlog/_plan/260905_main_quota_guard/011_policy_dispatch_contract.md b/devlog/_fin/260905_main_quota_guard/011_policy_dispatch_contract.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/011_policy_dispatch_contract.md rename to devlog/_fin/260905_main_quota_guard/011_policy_dispatch_contract.md diff --git a/devlog/_plan/260905_main_quota_guard/012_implementation_review.md b/devlog/_fin/260905_main_quota_guard/012_implementation_review.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/012_implementation_review.md rename to devlog/_fin/260905_main_quota_guard/012_implementation_review.md diff --git a/devlog/_plan/260905_main_quota_guard/013_window_priority_steering.md b/devlog/_fin/260905_main_quota_guard/013_window_priority_steering.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/013_window_priority_steering.md rename to devlog/_fin/260905_main_quota_guard/013_window_priority_steering.md diff --git a/devlog/_plan/260905_main_quota_guard/014_runtime_evidence.md b/devlog/_fin/260905_main_quota_guard/014_runtime_evidence.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/014_runtime_evidence.md rename to devlog/_fin/260905_main_quota_guard/014_runtime_evidence.md diff --git a/devlog/_plan/260905_main_quota_guard/015_recovery_review.md b/devlog/_fin/260905_main_quota_guard/015_recovery_review.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/015_recovery_review.md rename to devlog/_fin/260905_main_quota_guard/015_recovery_review.md diff --git a/devlog/_plan/260905_main_quota_guard/016_policy_input_review.md b/devlog/_fin/260905_main_quota_guard/016_policy_input_review.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/016_policy_input_review.md rename to devlog/_fin/260905_main_quota_guard/016_policy_input_review.md diff --git a/devlog/_plan/260905_main_quota_guard/017_persisted_policy_validation.md b/devlog/_fin/260905_main_quota_guard/017_persisted_policy_validation.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/017_persisted_policy_validation.md rename to devlog/_fin/260905_main_quota_guard/017_persisted_policy_validation.md diff --git a/devlog/_plan/260905_main_quota_guard/018_dev_integration.md b/devlog/_fin/260905_main_quota_guard/018_dev_integration.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/018_dev_integration.md rename to devlog/_fin/260905_main_quota_guard/018_dev_integration.md diff --git a/devlog/_plan/260905_main_quota_guard/019_quota_provenance_integration.md b/devlog/_fin/260905_main_quota_guard/019_quota_provenance_integration.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/019_quota_provenance_integration.md rename to devlog/_fin/260905_main_quota_guard/019_quota_provenance_integration.md diff --git a/devlog/_plan/260905_main_quota_guard/020_settings.md b/devlog/_fin/260905_main_quota_guard/020_settings.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/020_settings.md rename to devlog/_fin/260905_main_quota_guard/020_settings.md diff --git a/devlog/_plan/260905_main_quota_guard/021_settings_dispatch.md b/devlog/_fin/260905_main_quota_guard/021_settings_dispatch.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/021_settings_dispatch.md rename to devlog/_fin/260905_main_quota_guard/021_settings_dispatch.md diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/en-confirm-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/en-confirm-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/en-confirm-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/en-confirm-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/en-confirm-mobile.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/en-confirm-mobile.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/en-confirm-mobile.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/en-confirm-mobile.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-blocked-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-blocked-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-blocked-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-blocked-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-mobile.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-mobile.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-mobile.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-mobile.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-tablet.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-tablet.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-confirm-tablet.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-confirm-tablet.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-mobile.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-mobile.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-mobile.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-main-card-integrated-mobile.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-setting-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-setting-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-setting-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-setting-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-setting-integrated-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-setting-integrated-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-setting-integrated-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-setting-integrated-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-zero-unlocked-desktop.jpg b/devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-zero-unlocked-desktop.jpg similarity index 100% rename from devlog/_plan/260905_main_quota_guard/022_ui_evidence/ko-zero-unlocked-desktop.jpg rename to devlog/_fin/260905_main_quota_guard/022_ui_evidence/ko-zero-unlocked-desktop.jpg diff --git a/devlog/_plan/260905_main_quota_guard/023_ui_review.md b/devlog/_fin/260905_main_quota_guard/023_ui_review.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/023_ui_review.md rename to devlog/_fin/260905_main_quota_guard/023_ui_review.md diff --git a/devlog/_plan/260905_main_quota_guard/024_ui_verification.md b/devlog/_fin/260905_main_quota_guard/024_ui_verification.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/024_ui_verification.md rename to devlog/_fin/260905_main_quota_guard/024_ui_verification.md diff --git a/devlog/_plan/260905_main_quota_guard/025_focus_review.md b/devlog/_fin/260905_main_quota_guard/025_focus_review.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/025_focus_review.md rename to devlog/_fin/260905_main_quota_guard/025_focus_review.md diff --git a/devlog/_plan/260905_main_quota_guard/026_ui_dev_integration.md b/devlog/_fin/260905_main_quota_guard/026_ui_dev_integration.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/026_ui_dev_integration.md rename to devlog/_fin/260905_main_quota_guard/026_ui_dev_integration.md diff --git a/devlog/_plan/260905_main_quota_guard/030_reserve_compatibility.md b/devlog/_fin/260905_main_quota_guard/030_reserve_compatibility.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/030_reserve_compatibility.md rename to devlog/_fin/260905_main_quota_guard/030_reserve_compatibility.md diff --git a/devlog/_plan/260905_main_quota_guard/031_reserve_dispatch_contract.md b/devlog/_fin/260905_main_quota_guard/031_reserve_dispatch_contract.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/031_reserve_dispatch_contract.md rename to devlog/_fin/260905_main_quota_guard/031_reserve_dispatch_contract.md diff --git a/devlog/_plan/260905_main_quota_guard/032_reserve_audit.md b/devlog/_fin/260905_main_quota_guard/032_reserve_audit.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/032_reserve_audit.md rename to devlog/_fin/260905_main_quota_guard/032_reserve_audit.md diff --git a/devlog/_plan/260905_main_quota_guard/033_parent_review_amendment.md b/devlog/_fin/260905_main_quota_guard/033_parent_review_amendment.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/033_parent_review_amendment.md rename to devlog/_fin/260905_main_quota_guard/033_parent_review_amendment.md diff --git a/devlog/_plan/260905_main_quota_guard/034_recovery_evidence_validation.md b/devlog/_fin/260905_main_quota_guard/034_recovery_evidence_validation.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/034_recovery_evidence_validation.md rename to devlog/_fin/260905_main_quota_guard/034_recovery_evidence_validation.md diff --git a/devlog/_plan/260905_main_quota_guard/039_reserve_verification.md b/devlog/_fin/260905_main_quota_guard/039_reserve_verification.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/039_reserve_verification.md rename to devlog/_fin/260905_main_quota_guard/039_reserve_verification.md diff --git a/devlog/_plan/260905_main_quota_guard/040_delivery.md b/devlog/_fin/260905_main_quota_guard/040_delivery.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/040_delivery.md rename to devlog/_fin/260905_main_quota_guard/040_delivery.md diff --git a/devlog/_plan/260905_main_quota_guard/041_stack_ci_repairs.md b/devlog/_fin/260905_main_quota_guard/041_stack_ci_repairs.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/041_stack_ci_repairs.md rename to devlog/_fin/260905_main_quota_guard/041_stack_ci_repairs.md diff --git a/devlog/_plan/260905_main_quota_guard/044_ingress_verification.md b/devlog/_fin/260905_main_quota_guard/044_ingress_verification.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/044_ingress_verification.md rename to devlog/_fin/260905_main_quota_guard/044_ingress_verification.md diff --git a/devlog/_plan/260905_main_quota_guard/047_claude_policy_verification.md b/devlog/_fin/260905_main_quota_guard/047_claude_policy_verification.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/047_claude_policy_verification.md rename to devlog/_fin/260905_main_quota_guard/047_claude_policy_verification.md diff --git a/devlog/_plan/260905_main_quota_guard/049_delivery_dispatch.md b/devlog/_fin/260905_main_quota_guard/049_delivery_dispatch.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/049_delivery_dispatch.md rename to devlog/_fin/260905_main_quota_guard/049_delivery_dispatch.md diff --git a/devlog/_plan/260905_main_quota_guard/050_ci_contract_repairs.md b/devlog/_fin/260905_main_quota_guard/050_ci_contract_repairs.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/050_ci_contract_repairs.md rename to devlog/_fin/260905_main_quota_guard/050_ci_contract_repairs.md diff --git a/devlog/_plan/260905_main_quota_guard/052_loopback_target_parity.md b/devlog/_fin/260905_main_quota_guard/052_loopback_target_parity.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/052_loopback_target_parity.md rename to devlog/_fin/260905_main_quota_guard/052_loopback_target_parity.md diff --git a/devlog/_plan/260905_main_quota_guard/059_runtime_landing.md b/devlog/_fin/260905_main_quota_guard/059_runtime_landing.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/059_runtime_landing.md rename to devlog/_fin/260905_main_quota_guard/059_runtime_landing.md diff --git a/devlog/_plan/260905_main_quota_guard/063_ui_landing.md b/devlog/_fin/260905_main_quota_guard/063_ui_landing.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/063_ui_landing.md rename to devlog/_fin/260905_main_quota_guard/063_ui_landing.md diff --git a/devlog/_plan/260905_main_quota_guard/064_final_rebase.md b/devlog/_fin/260905_main_quota_guard/064_final_rebase.md similarity index 100% rename from devlog/_plan/260905_main_quota_guard/064_final_rebase.md rename to devlog/_fin/260905_main_quota_guard/064_final_rebase.md diff --git a/devlog/_plan/260905_open_work_closeout/000_plan.md b/devlog/_fin/260905_open_work_closeout/000_plan.md similarity index 98% rename from devlog/_plan/260905_open_work_closeout/000_plan.md rename to devlog/_fin/260905_open_work_closeout/000_plan.md index 74de7e7384d..82444e9e93f 100644 --- a/devlog/_plan/260905_open_work_closeout/000_plan.md +++ b/devlog/_fin/260905_open_work_closeout/000_plan.md @@ -1,6 +1,6 @@ # 000 — Plan and live manifest -Unit: `devlog/_plan/260905_open_work_closeout`. Session `01a06e47-8897-70a0-b669-cf6c5b77d4c3`. +Unit: `devlog/_fin/260905_open_work_closeout`. Session `01a06e47-8897-70a0-b669-cf6c5b77d4c3`. Snapshot: 2026-09-04T21:19:34Z (fetch), `origin/dev` = `0f27bbeb3` (`test(hygiene): fail on duplicate test basenames, and close out the 429 unit (#3527)`). Research worktree: `/private/tmp/ocx-closeout.xomWAA/wt` (detached). diff --git a/devlog/_plan/260905_open_work_closeout/001_lane_bug_prs_a.md b/devlog/_fin/260905_open_work_closeout/001_lane_bug_prs_a.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/001_lane_bug_prs_a.md rename to devlog/_fin/260905_open_work_closeout/001_lane_bug_prs_a.md index 3d440e58d0f..a1cf2d3d14b 100644 --- a/devlog/_plan/260905_open_work_closeout/001_lane_bug_prs_a.md +++ b/devlog/_fin/260905_open_work_closeout/001_lane_bug_prs_a.md @@ -388,7 +388,7 @@ halves so the security-reviewed surface is isolated. - Every `bun test` invocation named a specific file; no repository-wide suite was run. - Patches were applied to the worktree only to establish red/green evidence and were reverted; - final `git status --porcelain` shows only `?? devlog/_plan/260905_open_work_closeout/`. + final `git status --porcelain` shows only `?? devlog/_fin/260905_open_work_closeout/`. - `git fetch origin pull/3502/head:tmp-pr-3502` was fetch-only; no checkout of `dev` occurred. - `git merge-tree` could not run (sandbox denies its temp-file creation), so 3502's conflict set was established with per-file `git apply --check` plus `git log origin/dev ^tmp-pr-3502`. diff --git a/devlog/_plan/260905_open_work_closeout/002_lane_bug_prs_b.md b/devlog/_fin/260905_open_work_closeout/002_lane_bug_prs_b.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/002_lane_bug_prs_b.md rename to devlog/_fin/260905_open_work_closeout/002_lane_bug_prs_b.md diff --git a/devlog/_plan/260905_open_work_closeout/003_lane_v2_and_quota.md b/devlog/_fin/260905_open_work_closeout/003_lane_v2_and_quota.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/003_lane_v2_and_quota.md rename to devlog/_fin/260905_open_work_closeout/003_lane_v2_and_quota.md diff --git a/devlog/_plan/260905_open_work_closeout/004_lane_else_prs.md b/devlog/_fin/260905_open_work_closeout/004_lane_else_prs.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/004_lane_else_prs.md rename to devlog/_fin/260905_open_work_closeout/004_lane_else_prs.md index 6ce37202c51..579faf47a8f 100644 --- a/devlog/_plan/260905_open_work_closeout/004_lane_else_prs.md +++ b/devlog/_fin/260905_open_work_closeout/004_lane_else_prs.md @@ -5,7 +5,7 @@ READ-ONLY adversarial triage. Worktree `/private/tmp/ocx-closeout.xomWAA/wt`, de untouched during the review: `src/oauth/index.ts`, `src/providers/model-rename-startup.ts`, `tests/oauth/oauth-provider-reconcile.test.ts`, `tests/providers/model-rename-migration.test.ts`). At the final index re-read these had been reverted by the parent; the only remaining working-tree -entry is this untracked `devlog/_plan/260905_open_work_closeout/` directory. No verdict depends on +entry is this untracked `devlog/_fin/260905_open_work_closeout/` directory. No verdict depends on those files. All PR-head verification ran against `git archive` exports under diff --git a/devlog/_plan/260905_open_work_closeout/005_lane_bug_issues.md b/devlog/_fin/260905_open_work_closeout/005_lane_bug_issues.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/005_lane_bug_issues.md rename to devlog/_fin/260905_open_work_closeout/005_lane_bug_issues.md diff --git a/devlog/_plan/260905_open_work_closeout/006_dispositions.md b/devlog/_fin/260905_open_work_closeout/006_dispositions.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/006_dispositions.md rename to devlog/_fin/260905_open_work_closeout/006_dispositions.md diff --git a/devlog/_plan/260905_open_work_closeout/007_audit_wp0.md b/devlog/_fin/260905_open_work_closeout/007_audit_wp0.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/007_audit_wp0.md rename to devlog/_fin/260905_open_work_closeout/007_audit_wp0.md index fc727b87d39..954de845133 100644 --- a/devlog/_plan/260905_open_work_closeout/007_audit_wp0.md +++ b/devlog/_fin/260905_open_work_closeout/007_audit_wp0.md @@ -13,7 +13,7 @@ all evidence is repository- and `gh`-local, which is Tier-2-equivalent primary s | Worktree `HEAD` | `0f27bbeb3ce6a92077652695e161d49b88eedc7a` (detached, unchanged; no checkout performed) | | `origin/dev` at audit start | `79e03643d7cfa2b6c3c4eb8afd6179a140b197a3` | | `origin/dev` at pre-verdict re-read | `79e03643d7cfa2b6c3c4eb8afd6179a140b197a3` (unchanged) | -| Index at pre-verdict re-read | nothing staged; only `?? devlog/_plan/260905_open_work_closeout/` untracked | +| Index at pre-verdict re-read | nothing staged; only `?? devlog/_fin/260905_open_work_closeout/` untracked | | Audit target | `000`, `006`, `010`, `020`, `030`, `040`, `050`, `060` (all read in full); `001`-`005` as supporting evidence | `git merge-base --is-ancestor HEAD origin/dev` -> exit 0. The worktree is **3 commits behind** diff --git a/devlog/_plan/260905_open_work_closeout/008_audit_synthesis.md b/devlog/_fin/260905_open_work_closeout/008_audit_synthesis.md similarity index 96% rename from devlog/_plan/260905_open_work_closeout/008_audit_synthesis.md rename to devlog/_fin/260905_open_work_closeout/008_audit_synthesis.md index dccbbfde7b2..631fd9171af 100644 --- a/devlog/_plan/260905_open_work_closeout/008_audit_synthesis.md +++ b/devlog/_fin/260905_open_work_closeout/008_audit_synthesis.md @@ -101,4 +101,4 @@ closeout commit; then the unit moves to `devlog/_fin/`. Main-agent judgment: **near-pass** → exit A>B for wp0 (docs-only). Residuals: none blocking. -DOCEOF; rg -n 'Author \| Head merged' /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md | head -2; tail -3 /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/060_ledger.md \ No newline at end of file +DOCEOF; rg -n 'Author \| Head merged' /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md | head -2; tail -3 /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/060_ledger.md \ No newline at end of file diff --git a/devlog/_plan/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md b/devlog/_fin/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md rename to devlog/_fin/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md index 5fdcfc31a10..49fc5e3bd06 100644 --- a/devlog/_plan/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md +++ b/devlog/_fin/260905_open_work_closeout/010_wp1_stack_a_land_as_is.md @@ -2,7 +2,7 @@ # 010 — wp1 / Stack A: the LAND_AS_IS merge train -Work-phase: **wp1**. Unit `devlog/_plan/260905_open_work_closeout`. +Work-phase: **wp1**. Unit `devlog/_fin/260905_open_work_closeout`. Scope: **#3515, #3529, #3525, #3490, #3484, #3480, #3323** — seven independent open pull requests whose code is correct as written. This is a **merge-train recipe**, not a rebase or reimplementation plan: no `src/`, `tests/`, or `gui/` file is authored in this diff --git a/devlog/_plan/260905_open_work_closeout/011_wp1_execution.md b/devlog/_fin/260905_open_work_closeout/011_wp1_execution.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/011_wp1_execution.md rename to devlog/_fin/260905_open_work_closeout/011_wp1_execution.md diff --git a/devlog/_plan/260905_open_work_closeout/012_wp1_delivery_record.md b/devlog/_fin/260905_open_work_closeout/012_wp1_delivery_record.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/012_wp1_delivery_record.md rename to devlog/_fin/260905_open_work_closeout/012_wp1_delivery_record.md diff --git a/devlog/_plan/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md b/devlog/_fin/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md rename to devlog/_fin/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md index cf8636a211d..c9aaa7a754f 100644 --- a/devlog/_plan/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md +++ b/devlog/_fin/260905_open_work_closeout/020_wp2_stack_b_bug_carry.md @@ -2,7 +2,7 @@ # 020 — wp2 / Stack B: bug PRs needing carry or reimplementation -Unit: `devlog/_plan/260905_open_work_closeout`. Work-phase: **wp2**. +Unit: `devlog/_fin/260905_open_work_closeout`. Work-phase: **wp2**. Sources: `001_lane_bug_prs_a.md` (#3502, #3519, #3524) and `002_lane_bug_prs_b.md` (#3489, #3469, #3407, #3348, #3388), both read in full. diff --git a/devlog/_plan/260905_open_work_closeout/021_wp2_scope_amendment.md b/devlog/_fin/260905_open_work_closeout/021_wp2_scope_amendment.md similarity index 95% rename from devlog/_plan/260905_open_work_closeout/021_wp2_scope_amendment.md rename to devlog/_fin/260905_open_work_closeout/021_wp2_scope_amendment.md index d016d5413d7..db17bff50a5 100644 --- a/devlog/_plan/260905_open_work_closeout/021_wp2_scope_amendment.md +++ b/devlog/_fin/260905_open_work_closeout/021_wp2_scope_amendment.md @@ -68,7 +68,7 @@ originals closed at wp6. Trailers use the id-prefixed noreply form (008 Blocker B6's new 400→502 test must assert a status that `errors.ts:452` does not already map (use a non-`server_error` category) so it cannot pass vacuously. -DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/021_wp2_scope_amendment.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/022_audit_wp2.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/ +DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/021_wp2_scope_amendment.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/022_audit_wp2.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/ ## B note — carry-3489 gated on #3551 `git merge-tree --write-tree refs/tmp/pr-3551 refs/tmp/pr-3489` → CONFLICT (`src/lib/provider-outbound.ts`, @@ -115,7 +115,7 @@ touches only `src/cli/claude.ts`, `src/cli/registry.ts`, docs, and its own test; B3's head and on `origin/dev` locally (3× repeat). Classified as a timing flake pending the exact-head rerun; not asserted as flake until the rerun reports. -DOCEOF; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/023_impl_review_wp2.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/ +DOCEOF; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/023_impl_review_wp2.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/ ### Merges and cascade (DEV-STACK-02) B1 #3561 → `71cfc8de6`, B2 #3562 → `24cc558d5` (admin squash, bypass comments, ancestry exit 0). diff --git a/devlog/_plan/260905_open_work_closeout/024_wp2_delivery_record.md b/devlog/_fin/260905_open_work_closeout/024_wp2_delivery_record.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/024_wp2_delivery_record.md rename to devlog/_fin/260905_open_work_closeout/024_wp2_delivery_record.md diff --git a/devlog/_plan/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md b/devlog/_fin/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md rename to devlog/_fin/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md index 2559eb94e58..8660a4a6875 100644 --- a/devlog/_plan/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md +++ b/devlog/_fin/260905_open_work_closeout/030_wp3_stack_c_v2_passthrough.md @@ -1,6 +1,6 @@ # 030 — wp3 / Stack C: #3444 direct encrypted V2 task passthrough -Unit: `devlog/_plan/260905_open_work_closeout`. Work-phase: **wp3**. Lane source: +Unit: `devlog/_fin/260905_open_work_closeout`. Work-phase: **wp3**. Lane source: [`003_lane_v2_and_quota.md`](./003_lane_v2_and_quota.md) (#3444 section). Re-verified against `origin/dev` = `6580694c7911cfbf78da63b6258ec1c70bd8a0e3` diff --git a/devlog/_plan/260905_open_work_closeout/031_wp3_reverify.md b/devlog/_fin/260905_open_work_closeout/031_wp3_reverify.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/031_wp3_reverify.md rename to devlog/_fin/260905_open_work_closeout/031_wp3_reverify.md diff --git a/devlog/_plan/260905_open_work_closeout/032_wp3_delivery_record.md b/devlog/_fin/260905_open_work_closeout/032_wp3_delivery_record.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/032_wp3_delivery_record.md rename to devlog/_fin/260905_open_work_closeout/032_wp3_delivery_record.md diff --git a/devlog/_plan/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md b/devlog/_fin/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md rename to devlog/_fin/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md index 3037164dc47..d7b9432af7f 100644 --- a/devlog/_plan/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md +++ b/devlog/_fin/260905_open_work_closeout/040_wp4_stack_d_usage_quota.md @@ -4,7 +4,7 @@ Diff-level implementation plan for one PABCD work-phase. Written to be executabl implementer with no other context: every change site is quoted from the tree, every conflict has a mechanical-or-semantic verdict, and every verifier was run before this doc was written. -Unit: `devlog/_plan/260905_open_work_closeout`. Lane research: `003_lane_v2_and_quota.md`. +Unit: `devlog/_fin/260905_open_work_closeout`. Lane research: `003_lane_v2_and_quota.md`. ## Base state (re-read immediately before writing) diff --git a/devlog/_plan/260905_open_work_closeout/041_wp4_reverify.md b/devlog/_fin/260905_open_work_closeout/041_wp4_reverify.md similarity index 92% rename from devlog/_plan/260905_open_work_closeout/041_wp4_reverify.md rename to devlog/_fin/260905_open_work_closeout/041_wp4_reverify.md index 05eb41d1b09..da82f7ab058 100644 --- a/devlog/_plan/260905_open_work_closeout/041_wp4_reverify.md +++ b/devlog/_fin/260905_open_work_closeout/041_wp4_reverify.md @@ -23,7 +23,7 @@ Trailers: layer 1 `hualiny <82697947+hualiny@users.noreply.github.com>`, layer 3 Stack: layer 1 → dev; layer 2 → layer 1; layer 3 → dev (independent). Layer 1 and 3 PRs open now; layer 2 PR opens when its lane finishes. -DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/041_wp4_reverify.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/ +DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/041_wp4_reverify.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/ ## Audit fold (wp4 A round 1 — claude-opus-5, GO-WITH-FIXES blockers=5; report 042) 1. **Layer 2 test layout (High):** seven of #2783's test basenames resolve to `null` (incl. @@ -48,4 +48,4 @@ the Antigravity row. Fixed in `4a721e459` by injecting the pinned-transport seam `fetchAvailableModels` fallback is what the test exercises, as it did before. Layer 1 final: 156 pass / 0 fail unsandboxed, typecheck 0. -DOCEOF; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/042_audit_wp4.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/ +DOCEOF; cp /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/042_audit_wp4.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/ diff --git a/devlog/_plan/260905_open_work_closeout/044_wp4_delivery_record.md b/devlog/_fin/260905_open_work_closeout/044_wp4_delivery_record.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/044_wp4_delivery_record.md rename to devlog/_fin/260905_open_work_closeout/044_wp4_delivery_record.md diff --git a/devlog/_plan/260905_open_work_closeout/050_wp5_stack_e_else.md b/devlog/_fin/260905_open_work_closeout/050_wp5_stack_e_else.md similarity index 99% rename from devlog/_plan/260905_open_work_closeout/050_wp5_stack_e_else.md rename to devlog/_fin/260905_open_work_closeout/050_wp5_stack_e_else.md index 3a8929d2862..589648d87ef 100644 --- a/devlog/_plan/260905_open_work_closeout/050_wp5_stack_e_else.md +++ b/devlog/_fin/260905_open_work_closeout/050_wp5_stack_e_else.md @@ -2,7 +2,7 @@ # 050 — wp5 / Stack E: remaining ready PRs and implementable bug issues -Unit: `devlog/_plan/260905_open_work_closeout`. Work-phase **wp5**, one PABCD cycle. +Unit: `devlog/_fin/260905_open_work_closeout`. Work-phase **wp5**, one PABCD cycle. Worktree: `/private/tmp/ocx-closeout.xomWAA/wt` (detached). Sources: `004_lane_else_prs.md` (#3530 #3487 #3508 #3383 #3329 #3421 #2716 #2432 #3531 #3528), `005_lane_bug_issues.md` (#3464, #3425). diff --git a/devlog/_plan/260905_open_work_closeout/051_wp5_reverify.md b/devlog/_fin/260905_open_work_closeout/051_wp5_reverify.md similarity index 89% rename from devlog/_plan/260905_open_work_closeout/051_wp5_reverify.md rename to devlog/_fin/260905_open_work_closeout/051_wp5_reverify.md index 189d60ce88c..8ed7f33a297 100644 --- a/devlog/_plan/260905_open_work_closeout/051_wp5_reverify.md +++ b/devlog/_fin/260905_open_work_closeout/051_wp5_reverify.md @@ -25,4 +25,4 @@ benedictusrey888 192305729 (per 007 round 2, #3531's author identity), Veritas-7 Stack shape: E0-E7 share no source file (050 measurement) → seven independent PRs against `dev`, merged in E-order. Verifiers: typecheck + each layer's named files + layout guard. -DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/051_wp5_reverify.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_plan/260905_open_work_closeout/044_wp4_delivery_record.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_plan/260905_open_work_closeout/ 2>/dev/null \ No newline at end of file +DOCEOF; cp /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/051_wp5_reverify.md /Users/jun/Developer/new/700_projects/opencodex/devlog/_fin/260905_open_work_closeout/044_wp4_delivery_record.md /private/tmp/ocx-closeout.xomWAA/wt/devlog/_fin/260905_open_work_closeout/ 2>/dev/null \ No newline at end of file diff --git a/devlog/_plan/260905_open_work_closeout/052_wp5_delivery.md b/devlog/_fin/260905_open_work_closeout/052_wp5_delivery.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/052_wp5_delivery.md rename to devlog/_fin/260905_open_work_closeout/052_wp5_delivery.md diff --git a/devlog/_plan/260905_open_work_closeout/053_residual_integration.md b/devlog/_fin/260905_open_work_closeout/053_residual_integration.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/053_residual_integration.md rename to devlog/_fin/260905_open_work_closeout/053_residual_integration.md diff --git a/devlog/_plan/260905_open_work_closeout/054_final_ci_pin.md b/devlog/_fin/260905_open_work_closeout/054_final_ci_pin.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/054_final_ci_pin.md rename to devlog/_fin/260905_open_work_closeout/054_final_ci_pin.md diff --git a/devlog/_plan/260905_open_work_closeout/055_linux_ci_repair.md b/devlog/_fin/260905_open_work_closeout/055_linux_ci_repair.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/055_linux_ci_repair.md rename to devlog/_fin/260905_open_work_closeout/055_linux_ci_repair.md diff --git a/devlog/_plan/260905_open_work_closeout/056_second_ci_head.md b/devlog/_fin/260905_open_work_closeout/056_second_ci_head.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/056_second_ci_head.md rename to devlog/_fin/260905_open_work_closeout/056_second_ci_head.md diff --git a/devlog/_plan/260905_open_work_closeout/057_coordinated_final_ci.md b/devlog/_fin/260905_open_work_closeout/057_coordinated_final_ci.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/057_coordinated_final_ci.md rename to devlog/_fin/260905_open_work_closeout/057_coordinated_final_ci.md diff --git a/devlog/_plan/260905_open_work_closeout/058_final_execution_result.md b/devlog/_fin/260905_open_work_closeout/058_final_execution_result.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/058_final_execution_result.md rename to devlog/_fin/260905_open_work_closeout/058_final_execution_result.md diff --git a/devlog/_plan/260905_open_work_closeout/059_owner_directed_stop.md b/devlog/_fin/260905_open_work_closeout/059_owner_directed_stop.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/059_owner_directed_stop.md rename to devlog/_fin/260905_open_work_closeout/059_owner_directed_stop.md diff --git a/devlog/_plan/260905_open_work_closeout/060_ledger.md b/devlog/_fin/260905_open_work_closeout/060_ledger.md similarity index 100% rename from devlog/_plan/260905_open_work_closeout/060_ledger.md rename to devlog/_fin/260905_open_work_closeout/060_ledger.md diff --git a/devlog/_plan/260905_provider_registration_selection/000_plan.md b/devlog/_fin/260905_provider_registration_selection/000_plan.md similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/000_plan.md rename to devlog/_fin/260905_provider_registration_selection/000_plan.md diff --git a/devlog/_plan/260905_provider_registration_selection/001_roadmap_audit.md b/devlog/_fin/260905_provider_registration_selection/001_roadmap_audit.md similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/001_roadmap_audit.md rename to devlog/_fin/260905_provider_registration_selection/001_roadmap_audit.md diff --git a/devlog/_plan/260905_provider_registration_selection/010_initial_selection.md b/devlog/_fin/260905_provider_registration_selection/010_initial_selection.md similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/010_initial_selection.md rename to devlog/_fin/260905_provider_registration_selection/010_initial_selection.md diff --git a/devlog/_plan/260905_provider_registration_selection/020_registration_guidance.md b/devlog/_fin/260905_provider_registration_selection/020_registration_guidance.md similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/020_registration_guidance.md rename to devlog/_fin/260905_provider_registration_selection/020_registration_guidance.md diff --git a/devlog/_plan/260905_provider_registration_selection/021_registration_notice.png b/devlog/_fin/260905_provider_registration_selection/021_registration_notice.png similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/021_registration_notice.png rename to devlog/_fin/260905_provider_registration_selection/021_registration_notice.png diff --git a/devlog/_plan/260905_provider_registration_selection/022_models_all_off.png b/devlog/_fin/260905_provider_registration_selection/022_models_all_off.png similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/022_models_all_off.png rename to devlog/_fin/260905_provider_registration_selection/022_models_all_off.png diff --git a/devlog/_plan/260905_provider_registration_selection/023_onboarding_verification.md b/devlog/_fin/260905_provider_registration_selection/023_onboarding_verification.md similarity index 100% rename from devlog/_plan/260905_provider_registration_selection/023_onboarding_verification.md rename to devlog/_fin/260905_provider_registration_selection/023_onboarding_verification.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/000_plan.md b/devlog/_fin/260905_provider_usage_quota_parity/000_plan.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/000_plan.md rename to devlog/_fin/260905_provider_usage_quota_parity/000_plan.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/001_attribution_evidence.md b/devlog/_fin/260905_provider_usage_quota_parity/001_attribution_evidence.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/001_attribution_evidence.md rename to devlog/_fin/260905_provider_usage_quota_parity/001_attribution_evidence.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/002_audit_synthesis.md b/devlog/_fin/260905_provider_usage_quota_parity/002_audit_synthesis.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/002_audit_synthesis.md rename to devlog/_fin/260905_provider_usage_quota_parity/002_audit_synthesis.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/010_attribution.md b/devlog/_fin/260905_provider_usage_quota_parity/010_attribution.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/010_attribution.md rename to devlog/_fin/260905_provider_usage_quota_parity/010_attribution.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/011_attribution_build.md b/devlog/_fin/260905_provider_usage_quota_parity/011_attribution_build.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/011_attribution_build.md rename to devlog/_fin/260905_provider_usage_quota_parity/011_attribution_build.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/012_premerge_review.md b/devlog/_fin/260905_provider_usage_quota_parity/012_premerge_review.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/012_premerge_review.md rename to devlog/_fin/260905_provider_usage_quota_parity/012_premerge_review.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/013_ci_test_boundaries.md b/devlog/_fin/260905_provider_usage_quota_parity/013_ci_test_boundaries.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/013_ci_test_boundaries.md rename to devlog/_fin/260905_provider_usage_quota_parity/013_ci_test_boundaries.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/014_recovery_fixture_isolation.md b/devlog/_fin/260905_provider_usage_quota_parity/014_recovery_fixture_isolation.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/014_recovery_fixture_isolation.md rename to devlog/_fin/260905_provider_usage_quota_parity/014_recovery_fixture_isolation.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/020_account_quota_api.md b/devlog/_fin/260905_provider_usage_quota_parity/020_account_quota_api.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/020_account_quota_api.md rename to devlog/_fin/260905_provider_usage_quota_parity/020_account_quota_api.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/021_api_build.md b/devlog/_fin/260905_provider_usage_quota_parity/021_api_build.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/021_api_build.md rename to devlog/_fin/260905_provider_usage_quota_parity/021_api_build.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/030_quota_views.md b/devlog/_fin/260905_provider_usage_quota_parity/030_quota_views.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/030_quota_views.md rename to devlog/_fin/260905_provider_usage_quota_parity/030_quota_views.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/031_ui_build.md b/devlog/_fin/260905_provider_usage_quota_parity/031_ui_build.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/031_ui_build.md rename to devlog/_fin/260905_provider_usage_quota_parity/031_ui_build.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/040_stack_landing.md b/devlog/_fin/260905_provider_usage_quota_parity/040_stack_landing.md similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/040_stack_landing.md rename to devlog/_fin/260905_provider_usage_quota_parity/040_stack_landing.md diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/011_usage_attribution.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/011_usage_attribution.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/011_usage_attribution.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/011_usage_attribution.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/031_current_overview.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/031_current_overview.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/031_current_overview.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/031_current_overview.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/032_current_usage.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/032_current_usage.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/032_current_usage.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/032_current_usage.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/033_oauth_accounts.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/033_oauth_accounts.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/033_oauth_accounts.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/033_oauth_accounts.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/034_api_key_balances.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/034_api_key_balances.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/034_api_key_balances.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/034_api_key_balances.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/035_passive_current_unobserved.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/035_passive_current_unobserved.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/035_passive_current_unobserved.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/035_passive_current_unobserved.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/036_pool_current.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/036_pool_current.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/036_pool_current.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/036_pool_current.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/037_tablet_usage.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/037_tablet_usage.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/037_tablet_usage.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/037_tablet_usage.png diff --git a/devlog/_plan/260905_provider_usage_quota_parity/assets/039_mobile_current.png b/devlog/_fin/260905_provider_usage_quota_parity/assets/039_mobile_current.png similarity index 100% rename from devlog/_plan/260905_provider_usage_quota_parity/assets/039_mobile_current.png rename to devlog/_fin/260905_provider_usage_quota_parity/assets/039_mobile_current.png diff --git a/devlog/_plan/260906_aside_profiles/000_research.md b/devlog/_fin/260906_aside_profiles/000_research.md similarity index 100% rename from devlog/_plan/260906_aside_profiles/000_research.md rename to devlog/_fin/260906_aside_profiles/000_research.md diff --git a/devlog/_plan/260906_aside_profiles/010_profiles_backend_cli.md b/devlog/_fin/260906_aside_profiles/010_profiles_backend_cli.md similarity index 100% rename from devlog/_plan/260906_aside_profiles/010_profiles_backend_cli.md rename to devlog/_fin/260906_aside_profiles/010_profiles_backend_cli.md diff --git a/devlog/_plan/260906_aside_profiles/020_profiles_gui.md b/devlog/_fin/260906_aside_profiles/020_profiles_gui.md similarity index 100% rename from devlog/_plan/260906_aside_profiles/020_profiles_gui.md rename to devlog/_fin/260906_aside_profiles/020_profiles_gui.md diff --git a/devlog/_plan/260906_grok_catalog_and_patch/000_research.md b/devlog/_fin/260906_grok_catalog_and_patch/000_research.md similarity index 100% rename from devlog/_plan/260906_grok_catalog_and_patch/000_research.md rename to devlog/_fin/260906_grok_catalog_and_patch/000_research.md diff --git a/devlog/_plan/260906_grok_catalog_and_patch/010_export_selection.md b/devlog/_fin/260906_grok_catalog_and_patch/010_export_selection.md similarity index 100% rename from devlog/_plan/260906_grok_catalog_and_patch/010_export_selection.md rename to devlog/_fin/260906_grok_catalog_and_patch/010_export_selection.md diff --git a/devlog/_plan/260906_grok_catalog_and_patch/020_owned_refresh.md b/devlog/_fin/260906_grok_catalog_and_patch/020_owned_refresh.md similarity index 100% rename from devlog/_plan/260906_grok_catalog_and_patch/020_owned_refresh.md rename to devlog/_fin/260906_grok_catalog_and_patch/020_owned_refresh.md diff --git a/devlog/_plan/260906_grok_catalog_and_patch/030_responses_patch.md b/devlog/_fin/260906_grok_catalog_and_patch/030_responses_patch.md similarity index 100% rename from devlog/_plan/260906_grok_catalog_and_patch/030_responses_patch.md rename to devlog/_fin/260906_grok_catalog_and_patch/030_responses_patch.md diff --git a/devlog/_plan/260906_grok_catalog_and_patch/040_native_tool_parity.md b/devlog/_fin/260906_grok_catalog_and_patch/040_native_tool_parity.md similarity index 100% rename from devlog/_plan/260906_grok_catalog_and_patch/040_native_tool_parity.md rename to devlog/_fin/260906_grok_catalog_and_patch/040_native_tool_parity.md diff --git a/devlog/_plan/260906_key_login_ci_timeout/000_plan.md b/devlog/_fin/260906_key_login_ci_timeout/000_plan.md similarity index 100% rename from devlog/_plan/260906_key_login_ci_timeout/000_plan.md rename to devlog/_fin/260906_key_login_ci_timeout/000_plan.md diff --git a/devlog/_plan/260906_release_244_followups/000_plan.md b/devlog/_fin/260906_release_244_followups/000_plan.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/000_plan.md rename to devlog/_fin/260906_release_244_followups/000_plan.md diff --git a/devlog/_plan/260906_release_244_followups/001_roadmap_lock.md b/devlog/_fin/260906_release_244_followups/001_roadmap_lock.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/001_roadmap_lock.md rename to devlog/_fin/260906_release_244_followups/001_roadmap_lock.md diff --git a/devlog/_plan/260906_release_244_followups/010_policy.md b/devlog/_fin/260906_release_244_followups/010_policy.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/010_policy.md rename to devlog/_fin/260906_release_244_followups/010_policy.md diff --git a/devlog/_plan/260906_release_244_followups/011_policy_implementation.md b/devlog/_fin/260906_release_244_followups/011_policy_implementation.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/011_policy_implementation.md rename to devlog/_fin/260906_release_244_followups/011_policy_implementation.md diff --git a/devlog/_plan/260906_release_244_followups/020_task_input.md b/devlog/_fin/260906_release_244_followups/020_task_input.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/020_task_input.md rename to devlog/_fin/260906_release_244_followups/020_task_input.md diff --git a/devlog/_plan/260906_release_244_followups/021_task_input_implementation.md b/devlog/_fin/260906_release_244_followups/021_task_input_implementation.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/021_task_input_implementation.md rename to devlog/_fin/260906_release_244_followups/021_task_input_implementation.md diff --git a/devlog/_plan/260906_release_244_followups/022_management_auth_port_fixture.md b/devlog/_fin/260906_release_244_followups/022_management_auth_port_fixture.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/022_management_auth_port_fixture.md rename to devlog/_fin/260906_release_244_followups/022_management_auth_port_fixture.md diff --git a/devlog/_plan/260906_release_244_followups/030_kiro_results.md b/devlog/_fin/260906_release_244_followups/030_kiro_results.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/030_kiro_results.md rename to devlog/_fin/260906_release_244_followups/030_kiro_results.md diff --git a/devlog/_plan/260906_release_244_followups/031_kiro_result_implementation.md b/devlog/_fin/260906_release_244_followups/031_kiro_result_implementation.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/031_kiro_result_implementation.md rename to devlog/_fin/260906_release_244_followups/031_kiro_result_implementation.md diff --git a/devlog/_plan/260906_release_244_followups/032_review_doc_format.md b/devlog/_fin/260906_release_244_followups/032_review_doc_format.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/032_review_doc_format.md rename to devlog/_fin/260906_release_244_followups/032_review_doc_format.md diff --git a/devlog/_plan/260906_release_244_followups/033_web_search_deadline_fixture.md b/devlog/_fin/260906_release_244_followups/033_web_search_deadline_fixture.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/033_web_search_deadline_fixture.md rename to devlog/_fin/260906_release_244_followups/033_web_search_deadline_fixture.md diff --git a/devlog/_plan/260906_release_244_followups/040_opaque_recovery.md b/devlog/_fin/260906_release_244_followups/040_opaque_recovery.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/040_opaque_recovery.md rename to devlog/_fin/260906_release_244_followups/040_opaque_recovery.md diff --git a/devlog/_plan/260906_release_244_followups/041_opaque_recovery_implementation.md b/devlog/_fin/260906_release_244_followups/041_opaque_recovery_implementation.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/041_opaque_recovery_implementation.md rename to devlog/_fin/260906_release_244_followups/041_opaque_recovery_implementation.md diff --git a/devlog/_plan/260906_release_244_followups/050_combo_recovery.md b/devlog/_fin/260906_release_244_followups/050_combo_recovery.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/050_combo_recovery.md rename to devlog/_fin/260906_release_244_followups/050_combo_recovery.md diff --git a/devlog/_plan/260906_release_244_followups/051_combo_recovery_implementation.md b/devlog/_fin/260906_release_244_followups/051_combo_recovery_implementation.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/051_combo_recovery_implementation.md rename to devlog/_fin/260906_release_244_followups/051_combo_recovery_implementation.md diff --git a/devlog/_plan/260906_release_244_followups/052_shutdown_fixture.md b/devlog/_fin/260906_release_244_followups/052_shutdown_fixture.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/052_shutdown_fixture.md rename to devlog/_fin/260906_release_244_followups/052_shutdown_fixture.md diff --git a/devlog/_plan/260906_release_244_followups/060_grok_terminal.md b/devlog/_fin/260906_release_244_followups/060_grok_terminal.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/060_grok_terminal.md rename to devlog/_fin/260906_release_244_followups/060_grok_terminal.md diff --git a/devlog/_plan/260906_release_244_followups/070_quota_proxy.md b/devlog/_fin/260906_release_244_followups/070_quota_proxy.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/070_quota_proxy.md rename to devlog/_fin/260906_release_244_followups/070_quota_proxy.md diff --git a/devlog/_plan/260906_release_244_followups/071_quota_proxy_outcome.md b/devlog/_fin/260906_release_244_followups/071_quota_proxy_outcome.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/071_quota_proxy_outcome.md rename to devlog/_fin/260906_release_244_followups/071_quota_proxy_outcome.md diff --git a/devlog/_plan/260906_release_244_followups/080_usage_source.md b/devlog/_fin/260906_release_244_followups/080_usage_source.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/080_usage_source.md rename to devlog/_fin/260906_release_244_followups/080_usage_source.md diff --git a/devlog/_plan/260906_release_244_followups/082_recovery_doc_alignment.md b/devlog/_fin/260906_release_244_followups/082_recovery_doc_alignment.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/082_recovery_doc_alignment.md rename to devlog/_fin/260906_release_244_followups/082_recovery_doc_alignment.md diff --git a/devlog/_plan/260906_release_244_followups/090_dashboard.md b/devlog/_fin/260906_release_244_followups/090_dashboard.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/090_dashboard.md rename to devlog/_fin/260906_release_244_followups/090_dashboard.md diff --git a/devlog/_plan/260906_release_244_followups/091_dashboard_verification.md b/devlog/_fin/260906_release_244_followups/091_dashboard_verification.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/091_dashboard_verification.md rename to devlog/_fin/260906_release_244_followups/091_dashboard_verification.md diff --git a/devlog/_plan/260906_release_244_followups/100_release.md b/devlog/_fin/260906_release_244_followups/100_release.md similarity index 100% rename from devlog/_plan/260906_release_244_followups/100_release.md rename to devlog/_fin/260906_release_244_followups/100_release.md diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-1024.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-1024.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-1024.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-1024.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-dark.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-dark.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-dark.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-dark.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-lower.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-lower.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-lower.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-lower.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-zoom2.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-zoom2.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440-zoom2.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440-zoom2.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-1440.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-1440.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-empty-repeat.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-empty-repeat.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-empty-repeat.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-empty-repeat.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-interaction.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-interaction.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-interaction.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-interaction.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-keyboard-open.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-keyboard-open.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-keyboard-open.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-keyboard-open.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-lower.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-lower.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-320-lower.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-320-lower.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-320.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-320.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-320.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-320.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-390.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-390.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-390.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-390.png diff --git a/devlog/_plan/260906_release_244_followups/screenshots/dashboard-768.png b/devlog/_fin/260906_release_244_followups/screenshots/dashboard-768.png similarity index 100% rename from devlog/_plan/260906_release_244_followups/screenshots/dashboard-768.png rename to devlog/_fin/260906_release_244_followups/screenshots/dashboard-768.png diff --git a/devlog/_plan/260906_stateful_task_guidance/000_plan.md b/devlog/_fin/260906_stateful_task_guidance/000_plan.md similarity index 100% rename from devlog/_plan/260906_stateful_task_guidance/000_plan.md rename to devlog/_fin/260906_stateful_task_guidance/000_plan.md diff --git a/devlog/_plan/260906_stateful_task_guidance/010_raw_boundary.md b/devlog/_fin/260906_stateful_task_guidance/010_raw_boundary.md similarity index 100% rename from devlog/_plan/260906_stateful_task_guidance/010_raw_boundary.md rename to devlog/_fin/260906_stateful_task_guidance/010_raw_boundary.md diff --git a/devlog/_plan/260906_stateful_task_guidance/011_implementation.md b/devlog/_fin/260906_stateful_task_guidance/011_implementation.md similarity index 100% rename from devlog/_plan/260906_stateful_task_guidance/011_implementation.md rename to devlog/_fin/260906_stateful_task_guidance/011_implementation.md diff --git a/devlog/_plan/260906_unix_shim_ci_restore/000_plan.md b/devlog/_fin/260906_unix_shim_ci_restore/000_plan.md similarity index 100% rename from devlog/_plan/260906_unix_shim_ci_restore/000_plan.md rename to devlog/_fin/260906_unix_shim_ci_restore/000_plan.md diff --git a/devlog/_plan/260906_unix_shim_ci_restore/010_repair.md b/devlog/_fin/260906_unix_shim_ci_restore/010_repair.md similarity index 100% rename from devlog/_plan/260906_unix_shim_ci_restore/010_repair.md rename to devlog/_fin/260906_unix_shim_ci_restore/010_repair.md diff --git a/devlog/_plan/260907_lane_c/000_plan.md b/devlog/_fin/260907_lane_c/000_plan.md similarity index 100% rename from devlog/_plan/260907_lane_c/000_plan.md rename to devlog/_fin/260907_lane_c/000_plan.md diff --git a/devlog/_plan/260907_lane_c/010_web_search.md b/devlog/_fin/260907_lane_c/010_web_search.md similarity index 100% rename from devlog/_plan/260907_lane_c/010_web_search.md rename to devlog/_fin/260907_lane_c/010_web_search.md diff --git a/devlog/_plan/260907_lane_c/020_vision.md b/devlog/_fin/260907_lane_c/020_vision.md similarity index 100% rename from devlog/_plan/260907_lane_c/020_vision.md rename to devlog/_fin/260907_lane_c/020_vision.md diff --git a/devlog/_plan/260907_lane_c/030_health.md b/devlog/_fin/260907_lane_c/030_health.md similarity index 100% rename from devlog/_plan/260907_lane_c/030_health.md rename to devlog/_fin/260907_lane_c/030_health.md diff --git a/devlog/_plan/260907_lane_c/040_desktop.md b/devlog/_fin/260907_lane_c/040_desktop.md similarity index 100% rename from devlog/_plan/260907_lane_c/040_desktop.md rename to devlog/_fin/260907_lane_c/040_desktop.md diff --git a/devlog/_plan/260907_lane_c/050_fallback.md b/devlog/_fin/260907_lane_c/050_fallback.md similarity index 100% rename from devlog/_plan/260907_lane_c/050_fallback.md rename to devlog/_fin/260907_lane_c/050_fallback.md diff --git a/devlog/_plan/260907_lane_d/000_plan.md b/devlog/_fin/260907_lane_d/000_plan.md similarity index 100% rename from devlog/_plan/260907_lane_d/000_plan.md rename to devlog/_fin/260907_lane_d/000_plan.md diff --git a/devlog/_plan/260907_lane_d/001_roadmap_audit.md b/devlog/_fin/260907_lane_d/001_roadmap_audit.md similarity index 100% rename from devlog/_plan/260907_lane_d/001_roadmap_audit.md rename to devlog/_fin/260907_lane_d/001_roadmap_audit.md diff --git a/devlog/_plan/260907_lane_d/010_thinking.md b/devlog/_fin/260907_lane_d/010_thinking.md similarity index 100% rename from devlog/_plan/260907_lane_d/010_thinking.md rename to devlog/_fin/260907_lane_d/010_thinking.md diff --git a/devlog/_plan/260907_lane_d/020_receipt.md b/devlog/_fin/260907_lane_d/020_receipt.md similarity index 100% rename from devlog/_plan/260907_lane_d/020_receipt.md rename to devlog/_fin/260907_lane_d/020_receipt.md diff --git a/devlog/_plan/260907_lane_d/030_account_prices.md b/devlog/_fin/260907_lane_d/030_account_prices.md similarity index 100% rename from devlog/_plan/260907_lane_d/030_account_prices.md rename to devlog/_fin/260907_lane_d/030_account_prices.md diff --git a/devlog/_plan/260907_lane_d/040_price_editor.md b/devlog/_fin/260907_lane_d/040_price_editor.md similarity index 100% rename from devlog/_plan/260907_lane_d/040_price_editor.md rename to devlog/_fin/260907_lane_d/040_price_editor.md diff --git a/devlog/_plan/260907_lane_d/050_usage_ranges.md b/devlog/_fin/260907_lane_d/050_usage_ranges.md similarity index 100% rename from devlog/_plan/260907_lane_d/050_usage_ranges.md rename to devlog/_fin/260907_lane_d/050_usage_ranges.md diff --git a/devlog/_plan/260907_lane_d/060_delivery.md b/devlog/_fin/260907_lane_d/060_delivery.md similarity index 100% rename from devlog/_plan/260907_lane_d/060_delivery.md rename to devlog/_fin/260907_lane_d/060_delivery.md diff --git a/devlog/_plan/260907_next_release_recommendations/000_plan.md b/devlog/_fin/260907_next_release_recommendations/000_plan.md similarity index 98% rename from devlog/_plan/260907_next_release_recommendations/000_plan.md rename to devlog/_fin/260907_next_release_recommendations/000_plan.md index 3febda57eaf..fddd8d8f03a 100644 --- a/devlog/_plan/260907_next_release_recommendations/000_plan.md +++ b/devlog/_fin/260907_next_release_recommendations/000_plan.md @@ -1,6 +1,6 @@ # 000 — Plan: next-release recommendation report (wp1) -Unit: devlog/_plan/260907_next_release_recommendations +Unit: devlog/_fin/260907_next_release_recommendations Class: C2 (docs-only deliverable; research via read-only explorer lanes) Goal: rank 10–30 items to land on `dev` before the release after v2.46.0 (dev open at 2.47.0). diff --git a/devlog/_plan/260907_next_release_recommendations/010_recommendations.md b/devlog/_fin/260907_next_release_recommendations/010_recommendations.md similarity index 100% rename from devlog/_plan/260907_next_release_recommendations/010_recommendations.md rename to devlog/_fin/260907_next_release_recommendations/010_recommendations.md diff --git a/devlog/_plan/260907_platform_validation/000_plan.md b/devlog/_fin/260907_platform_validation/000_plan.md similarity index 100% rename from devlog/_plan/260907_platform_validation/000_plan.md rename to devlog/_fin/260907_platform_validation/000_plan.md diff --git a/devlog/_plan/260907_platform_validation/001_plan_audit.md b/devlog/_fin/260907_platform_validation/001_plan_audit.md similarity index 100% rename from devlog/_plan/260907_platform_validation/001_plan_audit.md rename to devlog/_fin/260907_platform_validation/001_plan_audit.md diff --git a/devlog/_plan/260907_platform_validation/010_oauth_teardown.md b/devlog/_fin/260907_platform_validation/010_oauth_teardown.md similarity index 100% rename from devlog/_plan/260907_platform_validation/010_oauth_teardown.md rename to devlog/_fin/260907_platform_validation/010_oauth_teardown.md diff --git a/devlog/_plan/260907_platform_validation/020_container_smoke.md b/devlog/_fin/260907_platform_validation/020_container_smoke.md similarity index 100% rename from devlog/_plan/260907_platform_validation/020_container_smoke.md rename to devlog/_fin/260907_platform_validation/020_container_smoke.md diff --git a/devlog/_plan/260907_platform_validation/025_container_lifecycle_mode.md b/devlog/_fin/260907_platform_validation/025_container_lifecycle_mode.md similarity index 100% rename from devlog/_plan/260907_platform_validation/025_container_lifecycle_mode.md rename to devlog/_fin/260907_platform_validation/025_container_lifecycle_mode.md diff --git a/devlog/_plan/260907_platform_validation/030_container_ci.md b/devlog/_fin/260907_platform_validation/030_container_ci.md similarity index 100% rename from devlog/_plan/260907_platform_validation/030_container_ci.md rename to devlog/_fin/260907_platform_validation/030_container_ci.md diff --git a/devlog/_plan/260907_platform_validation/035_body_diagnostics.md b/devlog/_fin/260907_platform_validation/035_body_diagnostics.md similarity index 100% rename from devlog/_plan/260907_platform_validation/035_body_diagnostics.md rename to devlog/_fin/260907_platform_validation/035_body_diagnostics.md diff --git a/devlog/_plan/260907_platform_validation/040_residual_evidence.md b/devlog/_fin/260907_platform_validation/040_residual_evidence.md similarity index 100% rename from devlog/_plan/260907_platform_validation/040_residual_evidence.md rename to devlog/_fin/260907_platform_validation/040_residual_evidence.md diff --git a/devlog/_plan/260907_release_note_prefix/010_implementation.md b/devlog/_fin/260907_release_note_prefix/010_implementation.md similarity index 100% rename from devlog/_plan/260907_release_note_prefix/010_implementation.md rename to devlog/_fin/260907_release_note_prefix/010_implementation.md diff --git a/devlog/_plan/260907_release_train/000_plan.md b/devlog/_fin/260907_release_train/000_plan.md similarity index 98% rename from devlog/_plan/260907_release_train/000_plan.md rename to devlog/_fin/260907_release_train/000_plan.md index fc5510ad37d..fb18a3d2612 100644 --- a/devlog/_plan/260907_release_train/000_plan.md +++ b/devlog/_fin/260907_release_train/000_plan.md @@ -1,6 +1,6 @@ # 000 — Release train 260907: land ranked recommendations on dev (loop-in-loop) -Source of items: `devlog/_plan/260907_next_release_recommendations/010_recommendations.md` (27 ranked items). +Source of items: `devlog/_fin/260907_next_release_recommendations/010_recommendations.md` (27 ranked items). Base: `origin/dev@ece556a6e` (2.47.0). Goalplan: `release-train-260907-land-ranked-recommendations`. Class: C4 (release train; admin merges; contributor credit). Full PABCD per work-phase; delegated threads run their own cxc-loop. diff --git a/devlog/_plan/260907_release_train/010_wp1_execution.md b/devlog/_fin/260907_release_train/010_wp1_execution.md similarity index 100% rename from devlog/_plan/260907_release_train/010_wp1_execution.md rename to devlog/_fin/260907_release_train/010_wp1_execution.md diff --git a/devlog/_plan/260907_release_train/090_readiness.md b/devlog/_fin/260907_release_train/090_readiness.md similarity index 100% rename from devlog/_plan/260907_release_train/090_readiness.md rename to devlog/_fin/260907_release_train/090_readiness.md diff --git a/devlog/_plan/260907_release_train_b/000_plan.md b/devlog/_fin/260907_release_train_b/000_plan.md similarity index 100% rename from devlog/_plan/260907_release_train_b/000_plan.md rename to devlog/_fin/260907_release_train_b/000_plan.md diff --git a/devlog/_plan/260907_release_train_b/010_carry.md b/devlog/_fin/260907_release_train_b/010_carry.md similarity index 100% rename from devlog/_plan/260907_release_train_b/010_carry.md rename to devlog/_fin/260907_release_train_b/010_carry.md diff --git a/devlog/_plan/260907_release_train_b/020_carry.md b/devlog/_fin/260907_release_train_b/020_carry.md similarity index 100% rename from devlog/_plan/260907_release_train_b/020_carry.md rename to devlog/_fin/260907_release_train_b/020_carry.md diff --git a/devlog/_plan/260907_router_selection_capture/010_implementation.md b/devlog/_fin/260907_router_selection_capture/010_implementation.md similarity index 100% rename from devlog/_plan/260907_router_selection_capture/010_implementation.md rename to devlog/_fin/260907_router_selection_capture/010_implementation.md diff --git a/devlog/_plan/260907_sponsor_branches/000_plan.md b/devlog/_fin/260907_sponsor_branches/000_plan.md similarity index 100% rename from devlog/_plan/260907_sponsor_branches/000_plan.md rename to devlog/_fin/260907_sponsor_branches/000_plan.md diff --git a/devlog/_plan/260907_sponsor_branches/010_phase1.md b/devlog/_fin/260907_sponsor_branches/010_phase1.md similarity index 100% rename from devlog/_plan/260907_sponsor_branches/010_phase1.md rename to devlog/_fin/260907_sponsor_branches/010_phase1.md diff --git a/devlog/_plan/260907_sponsor_branches/020_phase2.md b/devlog/_fin/260907_sponsor_branches/020_phase2.md similarity index 100% rename from devlog/_plan/260907_sponsor_branches/020_phase2.md rename to devlog/_fin/260907_sponsor_branches/020_phase2.md diff --git a/devlog/_plan/260907_sponsor_branches/030_phase3.md b/devlog/_fin/260907_sponsor_branches/030_phase3.md similarity index 100% rename from devlog/_plan/260907_sponsor_branches/030_phase3.md rename to devlog/_fin/260907_sponsor_branches/030_phase3.md diff --git a/devlog/_plan/260907_track2_protocol/000_plan.md b/devlog/_fin/260907_track2_protocol/000_plan.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/000_plan.md rename to devlog/_fin/260907_track2_protocol/000_plan.md diff --git a/devlog/_plan/260907_track2_protocol/010_chat_json_sse.md b/devlog/_fin/260907_track2_protocol/010_chat_json_sse.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/010_chat_json_sse.md rename to devlog/_fin/260907_track2_protocol/010_chat_json_sse.md diff --git a/devlog/_plan/260907_track2_protocol/011_chat_audit_amendment.md b/devlog/_fin/260907_track2_protocol/011_chat_audit_amendment.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/011_chat_audit_amendment.md rename to devlog/_fin/260907_track2_protocol/011_chat_audit_amendment.md diff --git a/devlog/_plan/260907_track2_protocol/020_refusal.md b/devlog/_fin/260907_track2_protocol/020_refusal.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/020_refusal.md rename to devlog/_fin/260907_track2_protocol/020_refusal.md diff --git a/devlog/_plan/260907_track2_protocol/030_custom_efforts.md b/devlog/_fin/260907_track2_protocol/030_custom_efforts.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/030_custom_efforts.md rename to devlog/_fin/260907_track2_protocol/030_custom_efforts.md diff --git a/devlog/_plan/260907_track2_protocol/040_hosted_search_disposition.md b/devlog/_fin/260907_track2_protocol/040_hosted_search_disposition.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/040_hosted_search_disposition.md rename to devlog/_fin/260907_track2_protocol/040_hosted_search_disposition.md diff --git a/devlog/_plan/260907_track2_protocol/050_claude_compatibility.md b/devlog/_fin/260907_track2_protocol/050_claude_compatibility.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/050_claude_compatibility.md rename to devlog/_fin/260907_track2_protocol/050_claude_compatibility.md diff --git a/devlog/_plan/260907_track2_protocol/060_remote_delivery.md b/devlog/_fin/260907_track2_protocol/060_remote_delivery.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/060_remote_delivery.md rename to devlog/_fin/260907_track2_protocol/060_remote_delivery.md diff --git a/devlog/_plan/260907_track2_protocol/070_windows_fixture_cache.md b/devlog/_fin/260907_track2_protocol/070_windows_fixture_cache.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/070_windows_fixture_cache.md rename to devlog/_fin/260907_track2_protocol/070_windows_fixture_cache.md diff --git a/devlog/_plan/260907_track2_protocol/080_windows_sync_preparation.md b/devlog/_fin/260907_track2_protocol/080_windows_sync_preparation.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/080_windows_sync_preparation.md rename to devlog/_fin/260907_track2_protocol/080_windows_sync_preparation.md diff --git a/devlog/_plan/260907_track2_protocol/090_windows_shim_budget.md b/devlog/_fin/260907_track2_protocol/090_windows_shim_budget.md similarity index 100% rename from devlog/_plan/260907_track2_protocol/090_windows_shim_budget.md rename to devlog/_fin/260907_track2_protocol/090_windows_shim_budget.md diff --git a/devlog/_fin/260908_provider_runtime_stack/000_plan.md b/devlog/_fin/260908_provider_runtime_stack/000_plan.md index c8da992329c..2942397ae96 100644 --- a/devlog/_fin/260908_provider_runtime_stack/000_plan.md +++ b/devlog/_fin/260908_provider_runtime_stack/000_plan.md @@ -1,6 +1,6 @@ # 000 — Plan and live manifest -Unit: `devlog/_plan/260908_provider_runtime_stack`. Session `01a080e2-1dfc-7082-bff8-5043215bdd35`. +Unit: `devlog/_fin/260908_provider_runtime_stack`. Session `01a080e2-1dfc-7082-bff8-5043215bdd35`. Snapshot: 2026-09-08T12:00Z (fetch), `origin/dev` = `29bb221c3` (`Merge pull request #4021 from lidge-jun/codex/release-248-record`). Carry worktree: `/private/tmp/ocx-prs-stack-01a080e2` (linked worktree of the main checkout; diff --git a/devlog/_plan/260908_sponsor_overview/010_overview.md b/devlog/_fin/260908_sponsor_overview/010_overview.md similarity index 100% rename from devlog/_plan/260908_sponsor_overview/010_overview.md rename to devlog/_fin/260908_sponsor_overview/010_overview.md diff --git a/devlog/_plan/260908_voice_relay/000_plan.md b/devlog/_fin/260908_voice_relay/000_plan.md similarity index 100% rename from devlog/_plan/260908_voice_relay/000_plan.md rename to devlog/_fin/260908_voice_relay/000_plan.md diff --git a/devlog/_plan/260908_voice_relay/001_sources.md b/devlog/_fin/260908_voice_relay/001_sources.md similarity index 100% rename from devlog/_plan/260908_voice_relay/001_sources.md rename to devlog/_fin/260908_voice_relay/001_sources.md diff --git a/devlog/_plan/260909_codex_credential_health_chain/000_plan.md b/devlog/_fin/260909_codex_credential_health_chain/000_plan.md similarity index 100% rename from devlog/_plan/260909_codex_credential_health_chain/000_plan.md rename to devlog/_fin/260909_codex_credential_health_chain/000_plan.md diff --git a/devlog/_plan/260909_codex_credential_health_chain/010_wp1_terminal_verdict.md b/devlog/_fin/260909_codex_credential_health_chain/010_wp1_terminal_verdict.md similarity index 100% rename from devlog/_plan/260909_codex_credential_health_chain/010_wp1_terminal_verdict.md rename to devlog/_fin/260909_codex_credential_health_chain/010_wp1_terminal_verdict.md diff --git a/devlog/_plan/260909_codex_credential_health_chain/020_wp2_quota_registration.md b/devlog/_fin/260909_codex_credential_health_chain/020_wp2_quota_registration.md similarity index 100% rename from devlog/_plan/260909_codex_credential_health_chain/020_wp2_quota_registration.md rename to devlog/_fin/260909_codex_credential_health_chain/020_wp2_quota_registration.md diff --git a/devlog/_plan/260909_codex_credential_health_chain/030_wp3_anthropic_plan.md b/devlog/_fin/260909_codex_credential_health_chain/030_wp3_anthropic_plan.md similarity index 100% rename from devlog/_plan/260909_codex_credential_health_chain/030_wp3_anthropic_plan.md rename to devlog/_fin/260909_codex_credential_health_chain/030_wp3_anthropic_plan.md diff --git a/devlog/_plan/260909_config_mutation_lock_windows/000_plan.md b/devlog/_fin/260909_config_mutation_lock_windows/000_plan.md similarity index 100% rename from devlog/_plan/260909_config_mutation_lock_windows/000_plan.md rename to devlog/_fin/260909_config_mutation_lock_windows/000_plan.md diff --git a/devlog/_plan/260909_mid_thread_agent_task_recovery/000_plan.md b/devlog/_fin/260909_mid_thread_agent_task_recovery/000_plan.md similarity index 100% rename from devlog/_plan/260909_mid_thread_agent_task_recovery/000_plan.md rename to devlog/_fin/260909_mid_thread_agent_task_recovery/000_plan.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/000_plan.md b/devlog/_fin/260909_post249_scope_cleanup/000_plan.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/000_plan.md rename to devlog/_fin/260909_post249_scope_cleanup/000_plan.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/010_reconciliation.md b/devlog/_fin/260909_post249_scope_cleanup/010_reconciliation.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/010_reconciliation.md rename to devlog/_fin/260909_post249_scope_cleanup/010_reconciliation.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/020_branch_worktree_cleanup.md b/devlog/_fin/260909_post249_scope_cleanup/020_branch_worktree_cleanup.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/020_branch_worktree_cleanup.md rename to devlog/_fin/260909_post249_scope_cleanup/020_branch_worktree_cleanup.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/030_issue_disposition.md b/devlog/_fin/260909_post249_scope_cleanup/030_issue_disposition.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/030_issue_disposition.md rename to devlog/_fin/260909_post249_scope_cleanup/030_issue_disposition.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/040_dispatch_roadmap.md b/devlog/_fin/260909_post249_scope_cleanup/040_dispatch_roadmap.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/040_dispatch_roadmap.md rename to devlog/_fin/260909_post249_scope_cleanup/040_dispatch_roadmap.md diff --git a/devlog/_plan/260909_post249_scope_cleanup/050_delivery_record.md b/devlog/_fin/260909_post249_scope_cleanup/050_delivery_record.md similarity index 100% rename from devlog/_plan/260909_post249_scope_cleanup/050_delivery_record.md rename to devlog/_fin/260909_post249_scope_cleanup/050_delivery_record.md diff --git a/devlog/_plan/260909_usage_custom_range_disclosure/000_plan.md b/devlog/_fin/260909_usage_custom_range_disclosure/000_plan.md similarity index 100% rename from devlog/_plan/260909_usage_custom_range_disclosure/000_plan.md rename to devlog/_fin/260909_usage_custom_range_disclosure/000_plan.md diff --git a/devlog/_plan/260909_usage_custom_range_disclosure/010_audit.md b/devlog/_fin/260909_usage_custom_range_disclosure/010_audit.md similarity index 100% rename from devlog/_plan/260909_usage_custom_range_disclosure/010_audit.md rename to devlog/_fin/260909_usage_custom_range_disclosure/010_audit.md diff --git a/devlog/_plan/260909_usage_custom_range_disclosure/assets/010_before.png b/devlog/_fin/260909_usage_custom_range_disclosure/assets/010_before.png similarity index 100% rename from devlog/_plan/260909_usage_custom_range_disclosure/assets/010_before.png rename to devlog/_fin/260909_usage_custom_range_disclosure/assets/010_before.png diff --git a/devlog/_plan/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png b/devlog/_fin/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png similarity index 100% rename from devlog/_plan/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png rename to devlog/_fin/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png diff --git a/devlog/_plan/260909_usage_custom_range_disclosure/assets/030_after_open.png b/devlog/_fin/260909_usage_custom_range_disclosure/assets/030_after_open.png similarity index 100% rename from devlog/_plan/260909_usage_custom_range_disclosure/assets/030_after_open.png rename to devlog/_fin/260909_usage_custom_range_disclosure/assets/030_after_open.png diff --git a/devlog/_plan/260909_xai_oauth_retry_hardening/000_plan.md b/devlog/_fin/260909_xai_oauth_retry_hardening/000_plan.md similarity index 98% rename from devlog/_plan/260909_xai_oauth_retry_hardening/000_plan.md rename to devlog/_fin/260909_xai_oauth_retry_hardening/000_plan.md index 785622752e2..6a4728d9e68 100644 --- a/devlog/_plan/260909_xai_oauth_retry_hardening/000_plan.md +++ b/devlog/_fin/260909_xai_oauth_retry_hardening/000_plan.md @@ -60,7 +60,7 @@ trusting unbounded subdomains. - Tool/credential scope: `gh` as the repository owner for reads and PR creation on `lidge-jun/opencodex`; no merge, release, or settings writes. - Write scope: `src/oauth/xai.ts`, `tests/providers/xai/xai-oauth-retry.test.ts`, - `devlog/_plan/260909_xai_oauth_retry_hardening/`, `.tmp/` scratch. Git + `devlog/_fin/260909_xai_oauth_retry_hardening/`, `.tmp/` scratch. Git mutations use `-c core.hooksPath=/dev/null`; pushes use `--no-verify`. - Token/cost and wall-clock budgets: none set by the user; unbounded within the session, reported at handoff. diff --git a/devlog/_plan/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md b/devlog/_fin/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md similarity index 100% rename from devlog/_plan/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md rename to devlog/_fin/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md diff --git a/devlog/_plan/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md b/devlog/_fin/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md similarity index 100% rename from devlog/_plan/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md rename to devlog/_fin/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md diff --git a/devlog/_plan/260910_250_regression_audit_release/000_plan.md b/devlog/_fin/260910_250_regression_audit_release/000_plan.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/000_plan.md rename to devlog/_fin/260910_250_regression_audit_release/000_plan.md diff --git a/devlog/_plan/260910_250_regression_audit_release/010_audit_lanes.md b/devlog/_fin/260910_250_regression_audit_release/010_audit_lanes.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/010_audit_lanes.md rename to devlog/_fin/260910_250_regression_audit_release/010_audit_lanes.md diff --git a/devlog/_plan/260910_250_regression_audit_release/020_release_plan.md b/devlog/_fin/260910_250_regression_audit_release/020_release_plan.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/020_release_plan.md rename to devlog/_fin/260910_250_regression_audit_release/020_release_plan.md diff --git a/devlog/_plan/260910_250_regression_audit_release/030_evidence.md b/devlog/_fin/260910_250_regression_audit_release/030_evidence.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/030_evidence.md rename to devlog/_fin/260910_250_regression_audit_release/030_evidence.md diff --git a/devlog/_plan/260910_250_regression_audit_release/040_triage_protocol.md b/devlog/_fin/260910_250_regression_audit_release/040_triage_protocol.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/040_triage_protocol.md rename to devlog/_fin/260910_250_regression_audit_release/040_triage_protocol.md diff --git a/devlog/_plan/260910_250_regression_audit_release/050_lane_packets.md b/devlog/_fin/260910_250_regression_audit_release/050_lane_packets.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/050_lane_packets.md rename to devlog/_fin/260910_250_regression_audit_release/050_lane_packets.md diff --git a/devlog/_plan/260910_250_regression_audit_release/060_release_readiness.md b/devlog/_fin/260910_250_regression_audit_release/060_release_readiness.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/060_release_readiness.md rename to devlog/_fin/260910_250_regression_audit_release/060_release_readiness.md diff --git a/devlog/_plan/260910_250_regression_audit_release/070_release_execution.md b/devlog/_fin/260910_250_regression_audit_release/070_release_execution.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/070_release_execution.md rename to devlog/_fin/260910_250_regression_audit_release/070_release_execution.md diff --git a/devlog/_plan/260910_250_regression_audit_release/080_delivery_record.md b/devlog/_fin/260910_250_regression_audit_release/080_delivery_record.md similarity index 100% rename from devlog/_plan/260910_250_regression_audit_release/080_delivery_record.md rename to devlog/_fin/260910_250_regression_audit_release/080_delivery_record.md diff --git a/devlog/_plan/260910_cursor_acp_bridge/000_plan.md b/devlog/_fin/260910_cursor_acp_bridge/000_plan.md similarity index 97% rename from devlog/_plan/260910_cursor_acp_bridge/000_plan.md rename to devlog/_fin/260910_cursor_acp_bridge/000_plan.md index 47480b5e671..07bbe21b4cf 100644 --- a/devlog/_plan/260910_cursor_acp_bridge/000_plan.md +++ b/devlog/_fin/260910_cursor_acp_bridge/000_plan.md @@ -70,7 +70,7 @@ Each phase consumes the verified output of the previous one. | `050_audit.md` | independent reviewer verdict and main disposition | A phase | | `060_done.md` | cycle summary, what did not improve, falsification hooks | D phase | -No file outside `devlog/_plan/260910_cursor_acp_bridge/` is touched. +No file outside `devlog/_fin/260910_cursor_acp_bridge/` is touched. ## Accept criteria @@ -101,7 +101,7 @@ Run before being written here. | Command | Exit | Reads this unit's target? | |---|---|---| -| `bun run privacy:scan` | `0` ("Privacy scan passed", re-run 2026-09-10 after staging) | **Yes, but only once the files are tracked.** `scripts/privacy-scan.ts:60` takes its inputs from `git ls-files`. The first run of this gate passed while reading **none** of this unit's files, because they were untracked. The files were then `git add`-ed and the gate re-run; `git ls-files -- devlog/_plan/260910_cursor_acp_bridge` now lists all six, including `050_audit.md`, which was itself missed on the first staging pass. | +| `bun run privacy:scan` | `0` ("Privacy scan passed", re-run 2026-09-10 after staging) | **Yes, but only once the files are tracked.** `scripts/privacy-scan.ts:60` takes its inputs from `git ls-files`. The first run of this gate passed while reading **none** of this unit's files, because they were untracked. The files were then `git add`-ed and the gate re-run; `git ls-files -- devlog/_fin/260910_cursor_acp_bridge` now lists all six, including `050_audit.md`, which was itself missed on the first staging pass. | | `bun test tests/ci-workflows/repo-hygiene.test.ts` | `0` (14 pass / 0 fail, 2026-09-10) | **Yes, partially, and also only when tracked.** It asserts no `160000` gitlink and no excised material is in the index, and includes an unresolved-security-verdict tripwire over open devlog plans. It checks hygiene, not correctness. | **This table is itself an instance of the trap PLAN-VERIFIER-REAL-01 warns about** diff --git a/devlog/_plan/260910_cursor_acp_bridge/010_protocol_identity.md b/devlog/_fin/260910_cursor_acp_bridge/010_protocol_identity.md similarity index 100% rename from devlog/_plan/260910_cursor_acp_bridge/010_protocol_identity.md rename to devlog/_fin/260910_cursor_acp_bridge/010_protocol_identity.md diff --git a/devlog/_plan/260910_cursor_acp_bridge/020_cli_jaw_inventory.md b/devlog/_fin/260910_cursor_acp_bridge/020_cli_jaw_inventory.md similarity index 100% rename from devlog/_plan/260910_cursor_acp_bridge/020_cli_jaw_inventory.md rename to devlog/_fin/260910_cursor_acp_bridge/020_cli_jaw_inventory.md diff --git a/devlog/_plan/260910_cursor_acp_bridge/030_opencodex_seams.md b/devlog/_fin/260910_cursor_acp_bridge/030_opencodex_seams.md similarity index 100% rename from devlog/_plan/260910_cursor_acp_bridge/030_opencodex_seams.md rename to devlog/_fin/260910_cursor_acp_bridge/030_opencodex_seams.md diff --git a/devlog/_plan/260910_cursor_acp_bridge/040_feasibility_verdict.md b/devlog/_fin/260910_cursor_acp_bridge/040_feasibility_verdict.md similarity index 100% rename from devlog/_plan/260910_cursor_acp_bridge/040_feasibility_verdict.md rename to devlog/_fin/260910_cursor_acp_bridge/040_feasibility_verdict.md diff --git a/devlog/_plan/260910_cursor_acp_bridge/050_audit.md b/devlog/_fin/260910_cursor_acp_bridge/050_audit.md similarity index 99% rename from devlog/_plan/260910_cursor_acp_bridge/050_audit.md rename to devlog/_fin/260910_cursor_acp_bridge/050_audit.md index c8247785639..877b0ac167f 100644 --- a/devlog/_plan/260910_cursor_acp_bridge/050_audit.md +++ b/devlog/_fin/260910_cursor_acp_bridge/050_audit.md @@ -83,7 +83,7 @@ of them, and the plan's claim that it "observes every file this unit adds" was false as written. Fixed properly rather than reworded: the unit was `git add`-ed, -`git ls-files -- devlog/_plan/260910_cursor_acp_bridge` now returns all five +`git ls-files -- devlog/_fin/260910_cursor_acp_bridge` now returns all five files, and both gates were re-run against the tracked state (`privacy:scan` exit 0; `repo-hygiene` 14 pass / 0 fail). 000 now records the original failure as a worked example of the PLAN-VERIFIER-REAL-01 trap. diff --git a/devlog/_plan/260910_cursor_acp_bridge/060_done.md b/devlog/_fin/260910_cursor_acp_bridge/060_done.md similarity index 99% rename from devlog/_plan/260910_cursor_acp_bridge/060_done.md rename to devlog/_fin/260910_cursor_acp_bridge/060_done.md index 10bcf0385de..115259c7031 100644 --- a/devlog/_plan/260910_cursor_acp_bridge/060_done.md +++ b/devlog/_fin/260910_cursor_acp_bridge/060_done.md @@ -105,7 +105,7 @@ Over the tracked six-file unit: - `bun run privacy:scan` -> exit 0, "Privacy scan passed" - `bun test tests/ci-workflows/repo-hygiene.test.ts` -> 14 pass / 0 fail -- `git ls-files -- devlog/_plan/260910_cursor_acp_bridge` -> 6 files +- `git ls-files -- devlog/_fin/260910_cursor_acp_bridge` -> 6 files No `src/`, `gui/` or `docs-site/` file was touched, so no typecheck or product suite applies. **No machine gate checks whether any claim in these documents is diff --git a/devlog/_plan/260910_cursor_acp_bridge/070_live_trace.md b/devlog/_fin/260910_cursor_acp_bridge/070_live_trace.md similarity index 100% rename from devlog/_plan/260910_cursor_acp_bridge/070_live_trace.md rename to devlog/_fin/260910_cursor_acp_bridge/070_live_trace.md diff --git a/devlog/_plan/260910_live_service_manager_guard/000_plan.md b/devlog/_fin/260910_live_service_manager_guard/000_plan.md similarity index 97% rename from devlog/_plan/260910_live_service_manager_guard/000_plan.md rename to devlog/_fin/260910_live_service_manager_guard/000_plan.md index 817da13a7d9..39b5fce6c6c 100644 --- a/devlog/_plan/260910_live_service_manager_guard/000_plan.md +++ b/devlog/_fin/260910_live_service_manager_guard/000_plan.md @@ -53,4 +53,4 @@ machine this was written on is running opencodex. CI on the pushed head is the e The incident that started this was an agent executing README text through a shell. This guard would not have stopped it. That belongs to how agents write files, and it is recorded in -`devlog/_plan/260910_readme_i18n_parity/020_phase2_locale_resync.md`. +`devlog/_fin/260910_readme_i18n_parity/020_phase2_locale_resync.md`. diff --git a/devlog/_plan/260910_post249_round2/000_plan.md b/devlog/_fin/260910_post249_round2/000_plan.md similarity index 98% rename from devlog/_plan/260910_post249_round2/000_plan.md rename to devlog/_fin/260910_post249_round2/000_plan.md index 46ca0bc9c26..a2fa3b69741 100644 --- a/devlog/_plan/260910_post249_round2/000_plan.md +++ b/devlog/_fin/260910_post249_round2/000_plan.md @@ -2,7 +2,7 @@ ## Context -Round 1 (`devlog/_plan/260909_post249_scope_cleanup/`) landed 17 PRs and closed +Round 1 (`devlog/_fin/260909_post249_scope_cleanup/`) landed 17 PRs and closed 16 issues; `origin/dev` closed at `cd813d3d9`. Three issues were left open by decision: #3978 (deferred until the compaction status contract settles), #3506 (direction comment only — translation fidelity, not a proxy-side progress diff --git a/devlog/_plan/260910_post249_round2/010_lane_split.md b/devlog/_fin/260910_post249_round2/010_lane_split.md similarity index 100% rename from devlog/_plan/260910_post249_round2/010_lane_split.md rename to devlog/_fin/260910_post249_round2/010_lane_split.md diff --git a/devlog/_plan/260910_post249_round2/020_4129_shadow_combo_failover.md b/devlog/_fin/260910_post249_round2/020_4129_shadow_combo_failover.md similarity index 100% rename from devlog/_plan/260910_post249_round2/020_4129_shadow_combo_failover.md rename to devlog/_fin/260910_post249_round2/020_4129_shadow_combo_failover.md diff --git a/devlog/_plan/260910_post249_round2/030_4148_claude_system_hoist.md b/devlog/_fin/260910_post249_round2/030_4148_claude_system_hoist.md similarity index 100% rename from devlog/_plan/260910_post249_round2/030_4148_claude_system_hoist.md rename to devlog/_fin/260910_post249_round2/030_4148_claude_system_hoist.md diff --git a/devlog/_plan/260910_post249_round2/040_4141_launchctl_bootout.md b/devlog/_fin/260910_post249_round2/040_4141_launchctl_bootout.md similarity index 100% rename from devlog/_plan/260910_post249_round2/040_4141_launchctl_bootout.md rename to devlog/_fin/260910_post249_round2/040_4141_launchctl_bootout.md diff --git a/devlog/_plan/260910_post249_round2/050_3666_free_model_filter.md b/devlog/_fin/260910_post249_round2/050_3666_free_model_filter.md similarity index 100% rename from devlog/_plan/260910_post249_round2/050_3666_free_model_filter.md rename to devlog/_fin/260910_post249_round2/050_3666_free_model_filter.md diff --git a/devlog/_plan/260910_post249_round2/060_4075_gemini_setup_ux.md b/devlog/_fin/260910_post249_round2/060_4075_gemini_setup_ux.md similarity index 100% rename from devlog/_plan/260910_post249_round2/060_4075_gemini_setup_ux.md rename to devlog/_fin/260910_post249_round2/060_4075_gemini_setup_ux.md diff --git a/devlog/_plan/260910_post249_round2/070_3859_email_mask_toggle.md b/devlog/_fin/260910_post249_round2/070_3859_email_mask_toggle.md similarity index 100% rename from devlog/_plan/260910_post249_round2/070_3859_email_mask_toggle.md rename to devlog/_fin/260910_post249_round2/070_3859_email_mask_toggle.md diff --git a/devlog/_plan/260910_post249_round2/080_1711_zero_credit_catalog.md b/devlog/_fin/260910_post249_round2/080_1711_zero_credit_catalog.md similarity index 100% rename from devlog/_plan/260910_post249_round2/080_1711_zero_credit_catalog.md rename to devlog/_fin/260910_post249_round2/080_1711_zero_credit_catalog.md diff --git a/devlog/_plan/260910_post249_round2/090_4038_decode_rate.md b/devlog/_fin/260910_post249_round2/090_4038_decode_rate.md similarity index 100% rename from devlog/_plan/260910_post249_round2/090_4038_decode_rate.md rename to devlog/_fin/260910_post249_round2/090_4038_decode_rate.md diff --git a/devlog/_plan/260910_post249_round2/100_4147_zcode_reasoning_landing.md b/devlog/_fin/260910_post249_round2/100_4147_zcode_reasoning_landing.md similarity index 100% rename from devlog/_plan/260910_post249_round2/100_4147_zcode_reasoning_landing.md rename to devlog/_fin/260910_post249_round2/100_4147_zcode_reasoning_landing.md diff --git a/devlog/_plan/260910_post249_round2/110_delivery_record.md b/devlog/_fin/260910_post249_round2/110_delivery_record.md similarity index 100% rename from devlog/_plan/260910_post249_round2/110_delivery_record.md rename to devlog/_fin/260910_post249_round2/110_delivery_record.md diff --git a/devlog/_plan/260910_post249_round2/120_landing_gate_decision.md b/devlog/_fin/260910_post249_round2/120_landing_gate_decision.md similarity index 100% rename from devlog/_plan/260910_post249_round2/120_landing_gate_decision.md rename to devlog/_fin/260910_post249_round2/120_landing_gate_decision.md diff --git a/devlog/_plan/260910_post249_round2/_research/1711.md b/devlog/_fin/260910_post249_round2/_research/1711.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/1711.md rename to devlog/_fin/260910_post249_round2/_research/1711.md diff --git a/devlog/_plan/260910_post249_round2/_research/3666.md b/devlog/_fin/260910_post249_round2/_research/3666.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/3666.md rename to devlog/_fin/260910_post249_round2/_research/3666.md diff --git a/devlog/_plan/260910_post249_round2/_research/3859.md b/devlog/_fin/260910_post249_round2/_research/3859.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/3859.md rename to devlog/_fin/260910_post249_round2/_research/3859.md diff --git a/devlog/_plan/260910_post249_round2/_research/4038.md b/devlog/_fin/260910_post249_round2/_research/4038.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/4038.md rename to devlog/_fin/260910_post249_round2/_research/4038.md diff --git a/devlog/_plan/260910_post249_round2/_research/4075.md b/devlog/_fin/260910_post249_round2/_research/4075.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/4075.md rename to devlog/_fin/260910_post249_round2/_research/4075.md diff --git a/devlog/_plan/260910_post249_round2/_research/4129.md b/devlog/_fin/260910_post249_round2/_research/4129.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/4129.md rename to devlog/_fin/260910_post249_round2/_research/4129.md diff --git a/devlog/_plan/260910_post249_round2/_research/4141.md b/devlog/_fin/260910_post249_round2/_research/4141.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/4141.md rename to devlog/_fin/260910_post249_round2/_research/4141.md diff --git a/devlog/_plan/260910_post249_round2/_research/4148.md b/devlog/_fin/260910_post249_round2/_research/4148.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/4148.md rename to devlog/_fin/260910_post249_round2/_research/4148.md diff --git a/devlog/_fin/260910_post249_round2/_research/_audit.md b/devlog/_fin/260910_post249_round2/_research/_audit.md new file mode 100644 index 00000000000..e42e788f62e --- /dev/null +++ b/devlog/_fin/260910_post249_round2/_research/_audit.md @@ -0,0 +1,30 @@ +1. **BLOCKER** [000_plan.md:17](devlog/_fin/260910_post249_round2/000_plan.md) vs the decade docs: the round claims “Eight issues, all selected because the fix is mechanical and needs no maintainer policy judgment.” Three lane docs contradict that on their face: [040_a3_1711_zero_credit_catalog.md:3](devlog/_fin/260910_post249_round2/040_a3_1711_zero_credit_catalog.md) “Scope is pending a user decision”; [060_b1_4038_decode_rate.md:3](devlog/_fin/260910_post249_round2/060_b1_4038_decode_rate.md) “This one is pending a user decision”; [080_b3_3859_email_mask_toggle.md:3](devlog/_fin/260910_post249_round2/080_b3_3859_email_mask_toggle.md) “Surface choice is pending a user decision.” Their `_research` files mark the same forks as `POLICY (not mechanical)` ([_research/1711.md:39](devlog/_fin/260910_post249_round2/_research/1711.md), [_research/4038.md:46](devlog/_fin/260910_post249_round2/_research/4038.md), [_research/3859.md:32](devlog/_fin/260910_post249_round2/_research/3859.md)). + +2. **BLOCKER** [030_a2_4148_claude_system_hoist.md:17](devlog/_fin/260910_post249_round2/030_a2_4148_claude_system_hoist.md): `src/responses/parser.ts:204-206` is cited as `systemPrompt.push(data.instructions)`. Those lines are the `context_compaction` encrypted-content path. Instructions are consumed at `parser.ts:144-145`. The same wrong span is in [_research/4148.md:23](devlog/_fin/260910_post249_round2/_research/4148.md). `parser.ts:246-250` and `:253-258` are correct. + +3. **SHOULD-FIX** [020_a1_4129_shadow_combo_failover.md:14](devlog/_fin/260910_post249_round2/020_a1_4129_shadow_combo_failover.md): `core.ts:2600` is cited as the `while (pick)` / `advanceComboAfterFailure` loop. Line 2600 is `export async function handleComboResponses`. The loop is at `:2798`; `advanceComboAfterFailure` is at `:3056`. Other 4129 anchors (`request.ts:20`, `core.ts:3306`, `:3480-3512`, `router.ts:674`, `resolve.ts:418`, `shadow-call.ts:70`/`:88`, `failover.ts:468`) match. + +4. **SHOULD-FIX** [040_a3_1711_zero_credit_catalog.md:55](devlog/_fin/260910_post249_round2/040_a3_1711_zero_credit_catalog.md): `comboQuotaState` is cited at `gui/src/combo-workspace-data.ts:369-411`. Those lines are `quotaStateFromReport` (the `remaining <= 0` without `percent >= 100` check is `:407`). `comboQuotaState` is at `:437-456`. Research splits this correctly in [_research/1711.md:27](devlog/_fin/260910_post249_round2/_research/1711.md) (`433-456`) vs [:45](devlog/_fin/260910_post249_round2/_research/1711.md) (`369-411`). The rest of the 1711 source anchors (`sync.ts:315`/`347`/`414`/`641`/`961`/`1181-1184`, `parsing.ts:96-149`, `resolve.ts:64-70`/`78-92`, `provider-fetch.ts:2067-2106`, `index.ts:1574-1598`) match. + +5. Remaining spot-checks that **do** point at the claimed code (no finding): 4141 `service.ts:2296-2324`/`3129-3131`/`919-921`, `service.test.ts:3141-3145`; 4038 `cost.ts:655-661`, `shared.ts:99-113`, `Logs.tsx:273-279`; 3666 `provider-fetch.ts:1404`/`1468`, `Models.tsx:1411` (search inside `renderGroup` at `:1386`); 3859 `privacy.ts:1-11`, `auth-api.ts:367`/`380`/`2011`/`3045`, `oauth/index.ts:1808`/`1815`/`1835`, `layout.json:958`; 4075 `Models.tsx:1410`/`1450-1458`/`1650-1651`, `registry.ts:1978`, `initial-model-selection.test.ts:278-285`. + +6. **BLOCKER** [050_a4_4141_launchctl_bootout.md:25](devlog/_fin/260910_post249_round2/050_a4_4141_launchctl_bootout.md): auto-`bootout` is presented as the chosen mechanical fix. [_research/4141.md:26-28](devlog/_fin/260910_post249_round2/_research/4141.md) labels “Auto-bootout vs today’s hint-only throw” as `POLICY (not mechanical)` because it kills the live gui job. The decade doc lists other policy deferrals (`stopLaunchd`, `startLaunchd`, `statusLaunchd`) but not this one. + +7. **SHOULD-FIX** [030_a2_4148_claude_system_hoist.md:40](devlog/_fin/260910_post249_round2/030_a2_4148_claude_system_hoist.md): “all in-messages system messages become developer items” is a `Scope decision`, which is honest locally, but [_research/4148.md:40-42](devlog/_fin/260910_post249_round2/_research/4148.md) marked that exact fork as POLICY. Combined with finding 1, the round still treats #4148 as mechanical. 4075 correctly keeps registry `liveModels` and pending-finalize out of the PR ([090_b4_4075_gemini_setup_ux.md:41](devlog/_fin/260910_post249_round2/090_b4_4075_gemini_setup_ux.md)). 3666’s fail-closed defaults are labeled “Decided defaults” ([070_b2_3666_free_model_filter.md:42](devlog/_fin/260910_post249_round2/070_b2_3666_free_model_filter.md)), matching [_research/3666.md:39-45](devlog/_fin/260910_post249_round2/_research/3666.md). + +8. **BLOCKER** [010_lane_split.md:10](devlog/_fin/260910_post249_round2/010_lane_split.md) / [:24-26](devlog/_fin/260910_post249_round2/010_lane_split.md): write sets are not disjoint, and #3666 is not a GUI-only reader. + + Shared files both lanes would edit: + + - `src/codex/catalog/parsing.ts` (`CatalogModel`): #1711 needs a served-row field; #3666 adds `pricingStatus` ([070_b2_3666_free_model_filter.md:30](devlog/_fin/260910_post249_round2/070_b2_3666_free_model_filter.md)). + - `src/codex/catalog/provider-fetch.ts`: #3666 writes `catalogHintsFromModelsApiItem`; #1711’s stamp/filter constraints live in the same file (`filterCatalogVisibleModels` at `:2067`). + - `gui/` if #1711 follows its own recommendation to “ship the field plus the Dashboard” ([040_a3_1711_zero_credit_catalog.md:37](devlog/_fin/260910_post249_round2/040_a3_1711_zero_credit_catalog.md)), colliding with #3666/`Models.tsx` and #4075. + - `scripts/test-layout/layout.json` and `tests/fixtures/test-layout-expected.json`: new tests from #1711 (`catalog-zero-credit-picker.test.ts`) and Lane B (`catalog-free-pricing-status.test.ts` and/or `models-discovery-failed-hint.test.ts`). + + 010 also misnames Lane A test dirs (`tests/claude/`, `tests/catalog/`); the actual homes are `tests/claude-integration/` and `tests/codex-integration/`, and #4129’s test is `tests/responses/`. + +9. **NOTE** test-layout mapping is otherwise right. `catalog-*` seeds to `codex-integration` ([scripts/test-layout/layout.json:36](scripts/test-layout/layout.json)); `models-*` seeds to `gui` (`:83`); `responses-shadow-intercept.test.ts` is already explicit (`:1070`); `privacy-mask-account.test.ts` is already explicit (`:958`). 020/030/050/060/080 correctly say “no new layout entry” when extending an existing file. 040/070/090 correctly require both `layout.json` `explicit` and `tests/fixtures/test-layout-expected.json` for new files. 070’s optional GUI file `tests/gui/models-free-filter.test.ts` (from research) would need the same pair if created. + +10. **NOTE** privacy: no non-`example.com` / `example.test` / `test.com` / `*.test` emails, no token-shaped secrets. `/Users/jun/...` links appear throughout `_research/*.md`; `privacy-scan` allows maintainer username `jun` under `devlog/` ([scripts/privacy-scan.ts:27](scripts/privacy-scan.ts), `:150`). + +**FAIL** diff --git a/devlog/_plan/260910_post249_round2/_research/_audit_pr4153.md b/devlog/_fin/260910_post249_round2/_research/_audit_pr4153.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/_audit_pr4153.md rename to devlog/_fin/260910_post249_round2/_research/_audit_pr4153.md diff --git a/devlog/_plan/260910_post249_round2/_research/_audit_wp2.md b/devlog/_fin/260910_post249_round2/_research/_audit_wp2.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/_audit_wp2.md rename to devlog/_fin/260910_post249_round2/_research/_audit_wp2.md diff --git a/devlog/_plan/260910_post249_round2/_research/_audit_wp3.md b/devlog/_fin/260910_post249_round2/_research/_audit_wp3.md similarity index 97% rename from devlog/_plan/260910_post249_round2/_research/_audit_wp3.md rename to devlog/_fin/260910_post249_round2/_research/_audit_wp3.md index 8217a9f9543..7b8a64bf179 100644 --- a/devlog/_plan/260910_post249_round2/_research/_audit_wp3.md +++ b/devlog/_fin/260910_post249_round2/_research/_audit_wp3.md @@ -1,4 +1,4 @@ -Read-only audit of #4156, #4158, and #4160 against `devlog/_plan/260910_post249_round2/`. Local product tests were not run. +Read-only audit of #4156, #4158, and #4160 against `devlog/_fin/260910_post249_round2/`. Local product tests were not run. ## #4156 — #3666 free-only filter diff --git a/devlog/_plan/260910_post249_round2/_research/_audit_wp3b.md b/devlog/_fin/260910_post249_round2/_research/_audit_wp3b.md similarity index 100% rename from devlog/_plan/260910_post249_round2/_research/_audit_wp3b.md rename to devlog/_fin/260910_post249_round2/_research/_audit_wp3b.md diff --git a/devlog/_plan/260910_readme_i18n_parity/000_plan.md b/devlog/_fin/260910_readme_i18n_parity/000_plan.md similarity index 100% rename from devlog/_plan/260910_readme_i18n_parity/000_plan.md rename to devlog/_fin/260910_readme_i18n_parity/000_plan.md diff --git a/devlog/_plan/260910_readme_i18n_parity/010_phase1_parity_guard.md b/devlog/_fin/260910_readme_i18n_parity/010_phase1_parity_guard.md similarity index 100% rename from devlog/_plan/260910_readme_i18n_parity/010_phase1_parity_guard.md rename to devlog/_fin/260910_readme_i18n_parity/010_phase1_parity_guard.md diff --git a/devlog/_plan/260910_readme_i18n_parity/020_phase2_locale_resync.md b/devlog/_fin/260910_readme_i18n_parity/020_phase2_locale_resync.md similarity index 100% rename from devlog/_plan/260910_readme_i18n_parity/020_phase2_locale_resync.md rename to devlog/_fin/260910_readme_i18n_parity/020_phase2_locale_resync.md diff --git a/devlog/_plan/260910_readme_i18n_parity/030_phase3_delivery.md b/devlog/_fin/260910_readme_i18n_parity/030_phase3_delivery.md similarity index 100% rename from devlog/_plan/260910_readme_i18n_parity/030_phase3_delivery.md rename to devlog/_fin/260910_readme_i18n_parity/030_phase3_delivery.md diff --git a/devlog/_plan/260911_account_pool_unification/000_plan.md b/devlog/_fin/260911_account_pool_unification/000_plan.md similarity index 99% rename from devlog/_plan/260911_account_pool_unification/000_plan.md rename to devlog/_fin/260911_account_pool_unification/000_plan.md index 203c540c424..2498dfe2528 100644 --- a/devlog/_plan/260911_account_pool_unification/000_plan.md +++ b/devlog/_fin/260911_account_pool_unification/000_plan.md @@ -70,7 +70,7 @@ Recorded during the 2026-09-11 interview (session tracker rounds 1-5): - `privacy:scan` must stay green. - Existing Codex and Anthropic pool behavior must not regress; they migrate onto the shared layer rather than being rewritten in place. -- **Lane ownership.** `devlog/_plan/260911_lane_dispatch_round/010_lane_partition.md` +- **Lane ownership.** `devlog/_fin/260911_lane_dispatch_round/010_lane_partition.md` is the authoritative ownership list for the multi-lane round in flight on `dev`, and lane L3 owns `src/codex/auth-api.ts`, `src/codex/routing.ts` and `src/types/config.ts`. Work-phases 1 and 2 need those files, so no implementation diff --git a/devlog/_plan/260911_account_pool_unification/010_phase1_manual_selection.md b/devlog/_fin/260911_account_pool_unification/010_phase1_manual_selection.md similarity index 100% rename from devlog/_plan/260911_account_pool_unification/010_phase1_manual_selection.md rename to devlog/_fin/260911_account_pool_unification/010_phase1_manual_selection.md diff --git a/devlog/_plan/260911_account_pool_unification/020_phase2_shared_kernel.md b/devlog/_fin/260911_account_pool_unification/020_phase2_shared_kernel.md similarity index 100% rename from devlog/_plan/260911_account_pool_unification/020_phase2_shared_kernel.md rename to devlog/_fin/260911_account_pool_unification/020_phase2_shared_kernel.md diff --git a/devlog/_plan/260911_account_pool_unification/030_phase3_cache_affinity.md b/devlog/_fin/260911_account_pool_unification/030_phase3_cache_affinity.md similarity index 100% rename from devlog/_plan/260911_account_pool_unification/030_phase3_cache_affinity.md rename to devlog/_fin/260911_account_pool_unification/030_phase3_cache_affinity.md diff --git a/devlog/_plan/260911_account_pool_unification/040_phase4_key_pool_strategy.md b/devlog/_fin/260911_account_pool_unification/040_phase4_key_pool_strategy.md similarity index 100% rename from devlog/_plan/260911_account_pool_unification/040_phase4_key_pool_strategy.md rename to devlog/_fin/260911_account_pool_unification/040_phase4_key_pool_strategy.md diff --git a/devlog/_plan/260911_account_pool_unification/050_phase5_surface_consolidation.md b/devlog/_fin/260911_account_pool_unification/050_phase5_surface_consolidation.md similarity index 100% rename from devlog/_plan/260911_account_pool_unification/050_phase5_surface_consolidation.md rename to devlog/_fin/260911_account_pool_unification/050_phase5_surface_consolidation.md diff --git a/devlog/_plan/260911_account_pool_unification/assets/wp5b-pool-settings.png b/devlog/_fin/260911_account_pool_unification/assets/wp5b-pool-settings.png similarity index 100% rename from devlog/_plan/260911_account_pool_unification/assets/wp5b-pool-settings.png rename to devlog/_fin/260911_account_pool_unification/assets/wp5b-pool-settings.png diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/000_plan.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/000_plan.md similarity index 99% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/000_plan.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/000_plan.md index 179bdb55d45..5deb2e392d5 100644 --- a/devlog/_plan/260911_catalog_presentation_and_effort_projection/000_plan.md +++ b/devlog/_fin/260911_catalog_presentation_and_effort_projection/000_plan.md @@ -33,7 +33,7 @@ Evidence: `010_evidence.md`. Upstream issues: #4204 (efforts), #4213 (cards). | Non-goals | Proxying `wham/workspace-messages`. Changing image generation. Authoring card copy that upstream does not ship. Pushing to any remote. Clamping rungs other than `max`/`ultra` — the rest of the ladder keeps its current observed-runtime behaviour. | | Verifier | `bun test tests/codex-integration/codex-runtime.test.ts tests/codex-integration/catalog-go-exact-efforts.test.ts` — RUN, exit 0, 42 pass, and it reads `src/codex/runtime.ts` (`codex-runtime.test.ts:37` imports it; `:612` calls `effortClampAppliesToRuntime`). **That pair is sufficient for Phase 1 and NOT sufficient for Phase 2** — `catalog-go-exact-efforts.test.ts` pins construction, never the clamp. The gate that observes Phase 2 is `bun test tests/codex-integration/codex-catalog.test.ts tests/codex-integration/reserve-catalog.test.ts tests/clients/client-catalog-compatibility.test.ts` (see `030_test_impact.md` for the exact test names that must invert). NOT RUN at plan time — inverting them is B's work, so a pass today would prove nothing. Phase 3 has no gate until its test exists; that acceptance row is human review. | | Stop condition | ~~Plan-only~~ Superseded 2026-09-11 (second session): the user authorised the full PABCD cycle. This cycle ends at D with Phases 1, 2 and 4 built and verified. Phase 3 stays withdrawn (GAP-2). | -| Memory artifact | This unit directory: `devlog/_plan/260911_catalog_presentation_and_effort_projection/`. | +| Memory artifact | This unit directory: `devlog/_fin/260911_catalog_presentation_and_effort_projection/`. | | Expected terminal outcomes | Success: Phases 1, 2 and 4 land on `codex/260911-clamp-expiry` with their gates green. Resolved: GAP-1 (CLAMP-04 ships — see `050_revalidation.md`). Unresolved: GAP-2/GAP-3 in `040_open_gaps.md` are not closed by this cycle. Blocked: Phase 3 stays blocked on a live account-roster probe that only the user can authorise. | | Escalation condition | The account-roster probe needs a real ChatGPT token; main does not take it. CLAMP-04 changes the meaning of an active clamp and inverts diagnostic tests the plan currently promises to keep green — that contradiction goes to the user, not to B. Reserve deletion is no longer an escalation: CLAMP-05 decided it. | diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/010_evidence.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/010_evidence.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/010_evidence.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/010_evidence.md diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/020_architecture_dispositions.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/020_architecture_dispositions.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/020_architecture_dispositions.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/020_architecture_dispositions.md diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/030_test_impact.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/030_test_impact.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/030_test_impact.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/030_test_impact.md diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/040_open_gaps.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/040_open_gaps.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/040_open_gaps.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/040_open_gaps.md diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/050_revalidation.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/050_revalidation.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/050_revalidation.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/050_revalidation.md diff --git a/devlog/_plan/260911_catalog_presentation_and_effort_projection/060_done.md b/devlog/_fin/260911_catalog_presentation_and_effort_projection/060_done.md similarity index 100% rename from devlog/_plan/260911_catalog_presentation_and_effort_projection/060_done.md rename to devlog/_fin/260911_catalog_presentation_and_effort_projection/060_done.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/000_plan.md b/devlog/_fin/260911_deepseek_v41_transition/000_plan.md similarity index 98% rename from devlog/_plan/260911_deepseek_v41_transition/000_plan.md rename to devlog/_fin/260911_deepseek_v41_transition/000_plan.md index 9c2493b74aa..48f3d6b8b1a 100644 --- a/devlog/_plan/260911_deepseek_v41_transition/000_plan.md +++ b/devlog/_fin/260911_deepseek_v41_transition/000_plan.md @@ -14,7 +14,7 @@ DeepSeek가 2026-09-10에 V4.1-Flash를 내면서 V4 계열의 이름이 한 번 | Non-goals | 새 사용자 config 필드, 어댑터 와이어 동작 변경, main/preview 승격, 릴리스, 생성 메타데이터 수작업 편집 | | Verifier | `bun test` 영향 도메인, `bun run typecheck`, `bun run privacy:scan`, 머지 전 exact-head CI | | Stop condition | 두 PR과 이번 변경이 dev에 머지된 시점 | -| Memory artifact | `devlog/_plan/260911_deepseek_v41_transition/` | +| Memory artifact | `devlog/_fin/260911_deepseek_v41_transition/` | | Expected terminal outcomes | DONE = 머지 완료. BLOCKED = CI가 이 변경과 무관한 이유로 반복 실패하거나 머지 권한이 거부될 때 | | Escalation condition | 사용자가 머지를 명시 승인했다. main/preview 승격과 릴리스는 별도 승인 필요 | | Resource bounds | 쓰기 범위: `src/`, `tests/`, `docs-site/`, 이 플랜 유닛. 전체 스위트는 사용자 지시로 로컬에서 돌리지 않고 CI에 위임한다 | diff --git a/devlog/_plan/260911_deepseek_v41_transition/001_evidence.md b/devlog/_fin/260911_deepseek_v41_transition/001_evidence.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/001_evidence.md rename to devlog/_fin/260911_deepseek_v41_transition/001_evidence.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/002_inventory.md b/devlog/_fin/260911_deepseek_v41_transition/002_inventory.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/002_inventory.md rename to devlog/_fin/260911_deepseek_v41_transition/002_inventory.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/010_phase1_pr4258.md b/devlog/_fin/260911_deepseek_v41_transition/010_phase1_pr4258.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/010_phase1_pr4258.md rename to devlog/_fin/260911_deepseek_v41_transition/010_phase1_pr4258.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/020_phase2_v41_rollout.md b/devlog/_fin/260911_deepseek_v41_transition/020_phase2_v41_rollout.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/020_phase2_v41_rollout.md rename to devlog/_fin/260911_deepseek_v41_transition/020_phase2_v41_rollout.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/030_phase3_v4pro_removal.md b/devlog/_fin/260911_deepseek_v41_transition/030_phase3_v4pro_removal.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/030_phase3_v4pro_removal.md rename to devlog/_fin/260911_deepseek_v41_transition/030_phase3_v4pro_removal.md diff --git a/devlog/_plan/260911_deepseek_v41_transition/040_phase4_merge.md b/devlog/_fin/260911_deepseek_v41_transition/040_phase4_merge.md similarity index 100% rename from devlog/_plan/260911_deepseek_v41_transition/040_phase4_merge.md rename to devlog/_fin/260911_deepseek_v41_transition/040_phase4_merge.md diff --git a/devlog/_plan/260911_devin_two_providers/001_plan.md b/devlog/_fin/260911_devin_two_providers/001_plan.md similarity index 100% rename from devlog/_plan/260911_devin_two_providers/001_plan.md rename to devlog/_fin/260911_devin_two_providers/001_plan.md diff --git a/devlog/_plan/260911_devin_two_providers/002_audit.md b/devlog/_fin/260911_devin_two_providers/002_audit.md similarity index 100% rename from devlog/_plan/260911_devin_two_providers/002_audit.md rename to devlog/_fin/260911_devin_two_providers/002_audit.md diff --git a/devlog/_plan/260911_devin_two_providers/003_live_evidence.md b/devlog/_fin/260911_devin_two_providers/003_live_evidence.md similarity index 100% rename from devlog/_plan/260911_devin_two_providers/003_live_evidence.md rename to devlog/_fin/260911_devin_two_providers/003_live_evidence.md diff --git a/devlog/_plan/260911_devin_two_providers/004_devin_cli_split.md b/devlog/_fin/260911_devin_two_providers/004_devin_cli_split.md similarity index 100% rename from devlog/_plan/260911_devin_two_providers/004_devin_cli_split.md rename to devlog/_fin/260911_devin_two_providers/004_devin_cli_split.md diff --git a/devlog/_plan/260911_hub_single_port/010_launchd_repair.md b/devlog/_fin/260911_hub_single_port/010_launchd_repair.md similarity index 100% rename from devlog/_plan/260911_hub_single_port/010_launchd_repair.md rename to devlog/_fin/260911_hub_single_port/010_launchd_repair.md diff --git a/devlog/_plan/260911_hub_single_port/020_loopback_companion.md b/devlog/_fin/260911_hub_single_port/020_loopback_companion.md similarity index 99% rename from devlog/_plan/260911_hub_single_port/020_loopback_companion.md rename to devlog/_fin/260911_hub_single_port/020_loopback_companion.md index 8ee9d64bf21..ab1b8190259 100644 --- a/devlog/_plan/260911_hub_single_port/020_loopback_companion.md +++ b/devlog/_fin/260911_hub_single_port/020_loopback_companion.md @@ -1,6 +1,6 @@ # 020 — PR2: same-port loopback companion, honest hub-gate messages -Unit: `devlog/_plan/260911_hub_single_port`. Stack position 2 of 4 (PR1 = launchd repair, +Unit: `devlog/_fin/260911_hub_single_port`. Stack position 2 of 4 (PR1 = launchd repair, PR3 = hub token UX, PR4 = docs/skill). Branch `codex/260911-l4-hub-loopback-companion`, based on `dev` = `babb76449` (`Merge pull request #4240 … codex/260911-l4-client-catalog`); it will be rebased onto PR1's branch. Issue: lidge-jun/opencodex#4236 (follow-ups 1 and 2, diff --git a/devlog/_plan/260911_hub_single_port/030_hub_local_clients.md b/devlog/_fin/260911_hub_single_port/030_hub_local_clients.md similarity index 99% rename from devlog/_plan/260911_hub_single_port/030_hub_local_clients.md rename to devlog/_fin/260911_hub_single_port/030_hub_local_clients.md index a797a24b044..c1200c4672a 100644 --- a/devlog/_plan/260911_hub_single_port/030_hub_local_clients.md +++ b/devlog/_fin/260911_hub_single_port/030_hub_local_clients.md @@ -1,6 +1,6 @@ # 030 — PR3: the hub's own local clients, two destination contracts -Unit: `devlog/_plan/260911_hub_single_port`. Stack position 3 of 4. Branch +Unit: `devlog/_fin/260911_hub_single_port`. Stack position 3 of 4. Branch `codex/260911-l4-hub-local-clients`, based on `codex/260911-l4-hub-loopback-companion` (= `dev` + PR1 launchd repair + PR2 loopback companion). That base gained a review fix (`0aca6afe4`, hub-gate conjunction + every all-zero hostname spelling) while this unit was being diff --git a/devlog/_plan/260911_hub_single_port/040_hub_token_ux.md b/devlog/_fin/260911_hub_single_port/040_hub_token_ux.md similarity index 99% rename from devlog/_plan/260911_hub_single_port/040_hub_token_ux.md rename to devlog/_fin/260911_hub_single_port/040_hub_token_ux.md index 59d04ab9fa3..5ed04581657 100644 --- a/devlog/_plan/260911_hub_single_port/040_hub_token_ux.md +++ b/devlog/_fin/260911_hub_single_port/040_hub_token_ux.md @@ -1,6 +1,6 @@ # 040 — PR4: data-plane token provisioning, `ocx hub invite`, the status hub block -Unit: `devlog/_plan/260911_hub_single_port`. Stack position 4 of 5 as actually built (PR1 launchd +Unit: `devlog/_fin/260911_hub_single_port`. Stack position 4 of 5 as actually built (PR1 launchd repair, PR2 same-port loopback companion, PR3 Claude/local-client destinations — written concurrently by another agent — this one, then the docs/skill PR). Branch `codex/260911-l4-hub-token-ux`, rebased onto `codex/260911-l4-hub-loopback-companion` = @@ -11,7 +11,7 @@ rebased tree, and the rebase was clean (no shared files). Issue: lidge-jun/openc **Base discrepancy, recorded because it affects review.** The assignment described the base as "dev + PR1 launchd fix + PR2 loopback companion". `git log babb76449..HEAD` on that branch shows only the six PR2 commits; `src/service.ts` is untouched by it, and no -`devlog/_plan/260911_hub_single_port/010_launchd_repair.md` exists. So PR1 is **not** in this +`devlog/_fin/260911_hub_single_port/010_launchd_repair.md` exists. So PR1 is **not** in this branch's ancestry, and everything below was written and verified against dev + PR2 only. The `src/service.ts` hunks here are all inside `assertNotAdminToken` / `assertServiceAuthEnvironment` / `writeServiceApiTokenFile`, which the PR1 description (macOS diff --git a/devlog/_plan/260911_hub_single_port/050_docs_skill.md b/devlog/_fin/260911_hub_single_port/050_docs_skill.md similarity index 99% rename from devlog/_plan/260911_hub_single_port/050_docs_skill.md rename to devlog/_fin/260911_hub_single_port/050_docs_skill.md index bfbce5e7925..55bb138c35d 100644 --- a/devlog/_plan/260911_hub_single_port/050_docs_skill.md +++ b/devlog/_fin/260911_hub_single_port/050_docs_skill.md @@ -1,6 +1,6 @@ # 050 — PR5: docs (en + ko), the `ocx` skill, and the help copy -Unit: `devlog/_plan/260911_hub_single_port`. Stack position 5 of 5. Branch +Unit: `devlog/_fin/260911_hub_single_port`. Stack position 5 of 5. Branch `codex/260911-l7-hub-docs-skill`, on `codex/260911-l4-hub-token-ux` = `b26eee311` (`docs(devlog): record the PR4 review round`), which carries PR1 (launchd repair), PR2 (loopback companion), PR3 (hub local clients) and PR4 (hub token UX). Issue: lidge-jun/opencodex#4236. The diff --git a/devlog/_plan/260911_hub_single_port/060_client_hub_state.md b/devlog/_fin/260911_hub_single_port/060_client_hub_state.md similarity index 99% rename from devlog/_plan/260911_hub_single_port/060_client_hub_state.md rename to devlog/_fin/260911_hub_single_port/060_client_hub_state.md index 6c4bf435535..ba2d2a6a953 100644 --- a/devlog/_plan/260911_hub_single_port/060_client_hub_state.md +++ b/devlog/_fin/260911_hub_single_port/060_client_hub_state.md @@ -1,6 +1,6 @@ # 060 — PR6: a connected client reports the hub's state, not its own -Unit: `devlog/_plan/260911_hub_single_port`. Stack position 6, branch +Unit: `devlog/_fin/260911_hub_single_port`. Stack position 6, branch `codex/260911-l4-client-hub-state`, based on `codex/260911-l4-hub-token-ux` = `8c277294c` (`test(service): drop the installLaunchd import the restack left unused`), so PR1 launchd repair, PR2 loopback companion, PR3 hub local clients and PR4 hub token UX are all in ancestry. Sibling of diff --git a/devlog/_plan/260911_l1_responses_core/000_packet.md b/devlog/_fin/260911_l1_responses_core/000_packet.md similarity index 98% rename from devlog/_plan/260911_l1_responses_core/000_packet.md rename to devlog/_fin/260911_l1_responses_core/000_packet.md index fec95cdedb1..8c1db50512e 100644 --- a/devlog/_plan/260911_l1_responses_core/000_packet.md +++ b/devlog/_fin/260911_l1_responses_core/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L1 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l2_catalog_provider/000_packet.md b/devlog/_fin/260911_l2_catalog_provider/000_packet.md similarity index 97% rename from devlog/_plan/260911_l2_catalog_provider/000_packet.md rename to devlog/_fin/260911_l2_catalog_provider/000_packet.md index 529a5f5e33c..bb0b181d192 100644 --- a/devlog/_plan/260911_l2_catalog_provider/000_packet.md +++ b/devlog/_fin/260911_l2_catalog_provider/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L2 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l2_catalog_provider/010_4201_quota_admission.md b/devlog/_fin/260911_l2_catalog_provider/010_4201_quota_admission.md similarity index 100% rename from devlog/_plan/260911_l2_catalog_provider/010_4201_quota_admission.md rename to devlog/_fin/260911_l2_catalog_provider/010_4201_quota_admission.md diff --git a/devlog/_plan/260911_l2_catalog_provider/020_flash_upstream_evidence.md b/devlog/_fin/260911_l2_catalog_provider/020_flash_upstream_evidence.md similarity index 100% rename from devlog/_plan/260911_l2_catalog_provider/020_flash_upstream_evidence.md rename to devlog/_fin/260911_l2_catalog_provider/020_flash_upstream_evidence.md diff --git a/devlog/_plan/260911_l3_account_pool/000_packet.md b/devlog/_fin/260911_l3_account_pool/000_packet.md similarity index 98% rename from devlog/_plan/260911_l3_account_pool/000_packet.md rename to devlog/_fin/260911_l3_account_pool/000_packet.md index 94123e6fe83..071aa7ae4ec 100644 --- a/devlog/_plan/260911_l3_account_pool/000_packet.md +++ b/devlog/_fin/260911_l3_account_pool/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L3 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l3_account_pool/010_wp1_4126_warmup.md b/devlog/_fin/260911_l3_account_pool/010_wp1_4126_warmup.md similarity index 100% rename from devlog/_plan/260911_l3_account_pool/010_wp1_4126_warmup.md rename to devlog/_fin/260911_l3_account_pool/010_wp1_4126_warmup.md diff --git a/devlog/_plan/260911_l3_account_pool/020_wp2_4212_attribution.md b/devlog/_fin/260911_l3_account_pool/020_wp2_4212_attribution.md similarity index 100% rename from devlog/_plan/260911_l3_account_pool/020_wp2_4212_attribution.md rename to devlog/_fin/260911_l3_account_pool/020_wp2_4212_attribution.md diff --git a/devlog/_plan/260911_l3_account_pool/030_wp3_4211_plan_exclusion.md b/devlog/_fin/260911_l3_account_pool/030_wp3_4211_plan_exclusion.md similarity index 100% rename from devlog/_plan/260911_l3_account_pool/030_wp3_4211_plan_exclusion.md rename to devlog/_fin/260911_l3_account_pool/030_wp3_4211_plan_exclusion.md diff --git a/devlog/_plan/260911_l4_service_cli/000_packet.md b/devlog/_fin/260911_l4_service_cli/000_packet.md similarity index 98% rename from devlog/_plan/260911_l4_service_cli/000_packet.md rename to devlog/_fin/260911_l4_service_cli/000_packet.md index 86dc8351a2d..26f2f5305e0 100644 --- a/devlog/_plan/260911_l4_service_cli/000_packet.md +++ b/devlog/_fin/260911_l4_service_cli/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L4 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l4_service_cli/010_wp1_pnpm_self_update.md b/devlog/_fin/260911_l4_service_cli/010_wp1_pnpm_self_update.md similarity index 100% rename from devlog/_plan/260911_l4_service_cli/010_wp1_pnpm_self_update.md rename to devlog/_fin/260911_l4_service_cli/010_wp1_pnpm_self_update.md diff --git a/devlog/_plan/260911_l4_service_cli/020_wp2_stop_refusal.md b/devlog/_fin/260911_l4_service_cli/020_wp2_stop_refusal.md similarity index 100% rename from devlog/_plan/260911_l4_service_cli/020_wp2_stop_refusal.md rename to devlog/_fin/260911_l4_service_cli/020_wp2_stop_refusal.md diff --git a/devlog/_plan/260911_l4_service_cli/030_wp3_client_catalog.md b/devlog/_fin/260911_l4_service_cli/030_wp3_client_catalog.md similarity index 100% rename from devlog/_plan/260911_l4_service_cli/030_wp3_client_catalog.md rename to devlog/_fin/260911_l4_service_cli/030_wp3_client_catalog.md diff --git a/devlog/_plan/260911_l5_integrations_io/000_packet.md b/devlog/_fin/260911_l5_integrations_io/000_packet.md similarity index 98% rename from devlog/_plan/260911_l5_integrations_io/000_packet.md rename to devlog/_fin/260911_l5_integrations_io/000_packet.md index 24f0fcd6ec4..b6adb970935 100644 --- a/devlog/_plan/260911_l5_integrations_io/000_packet.md +++ b/devlog/_fin/260911_l5_integrations_io/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L5 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l6_streaming_tools/000_packet.md b/devlog/_fin/260911_l6_streaming_tools/000_packet.md similarity index 97% rename from devlog/_plan/260911_l6_streaming_tools/000_packet.md rename to devlog/_fin/260911_l6_streaming_tools/000_packet.md index 45a0a023b49..f5133493529 100644 --- a/devlog/_plan/260911_l6_streaming_tools/000_packet.md +++ b/devlog/_fin/260911_l6_streaming_tools/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L6 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l6_streaming_tools/010_4191_ws_failure_classification.md b/devlog/_fin/260911_l6_streaming_tools/010_4191_ws_failure_classification.md similarity index 98% rename from devlog/_plan/260911_l6_streaming_tools/010_4191_ws_failure_classification.md rename to devlog/_fin/260911_l6_streaming_tools/010_4191_ws_failure_classification.md index f141f3ca56b..109352ebfbd 100644 --- a/devlog/_plan/260911_l6_streaming_tools/010_4191_ws_failure_classification.md +++ b/devlog/_fin/260911_l6_streaming_tools/010_4191_ws_failure_classification.md @@ -1,6 +1,6 @@ # 010 — #4191: classify the WebSocket failure instead of restating it -Unit: `devlog/_plan/260911_l6_streaming_tools`. Lane L6, work-phase 1. +Unit: `devlog/_fin/260911_l6_streaming_tools`. Lane L6, work-phase 1. Issue: [#4191](https://github.com/lidge-jun/opencodex/issues/4191). ## What the report actually contains diff --git a/devlog/_plan/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md b/devlog/_fin/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md similarity index 98% rename from devlog/_plan/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md rename to devlog/_fin/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md index f24b36fd9b0..572aac12c82 100644 --- a/devlog/_plan/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md +++ b/devlog/_fin/260911_l6_streaming_tools/020_4190_qoder_scaffold_guard.md @@ -1,6 +1,6 @@ # 020 — #4190: refuse vendor scaffolding on the qoder route -Unit: `devlog/_plan/260911_l6_streaming_tools`. Lane L6, work-phase 2. +Unit: `devlog/_fin/260911_l6_streaming_tools`. Lane L6, work-phase 2. Issue: [#4190](https://github.com/lidge-jun/opencodex/issues/4190). ## The contract that was being broken diff --git a/devlog/_plan/260911_l7_docs/000_packet.md b/devlog/_fin/260911_l7_docs/000_packet.md similarity index 97% rename from devlog/_plan/260911_l7_docs/000_packet.md rename to devlog/_fin/260911_l7_docs/000_packet.md index a7e38e9f18a..af9d4981396 100644 --- a/devlog/_plan/260911_l7_docs/000_packet.md +++ b/devlog/_fin/260911_l7_docs/000_packet.md @@ -1,6 +1,6 @@ # Dispatch packet — L7 (revision 5) -Round unit: `devlog/_plan/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). +Round unit: `devlog/_fin/260911_lane_dispatch_round` on `dev`. Base freeze: `origin/dev` `6d3ad12e3` (2.51.0). Five audit rounds shaped this packet. The last one was a seven-lane feasibility check that asked whether each stack is implementable inside its owned paths; three lanes came back with gaps, and the fixes are folded here. `010_lane_partition.md` is the authoritative ownership list; `130_wp4_feasibility.md` records why each path was granted. diff --git a/devlog/_plan/260911_l7_docs/010_roadmap.md b/devlog/_fin/260911_l7_docs/010_roadmap.md similarity index 100% rename from devlog/_plan/260911_l7_docs/010_roadmap.md rename to devlog/_fin/260911_l7_docs/010_roadmap.md diff --git a/devlog/_plan/260911_l7_docs/020_4215_wording.md b/devlog/_fin/260911_l7_docs/020_4215_wording.md similarity index 100% rename from devlog/_plan/260911_l7_docs/020_4215_wording.md rename to devlog/_fin/260911_l7_docs/020_4215_wording.md diff --git a/devlog/_plan/260911_l7_docs/030_4200_recipe.md b/devlog/_fin/260911_l7_docs/030_4200_recipe.md similarity index 100% rename from devlog/_plan/260911_l7_docs/030_4200_recipe.md rename to devlog/_fin/260911_l7_docs/030_4200_recipe.md diff --git a/devlog/_plan/260911_l7_docs/040_4215_delivery.md b/devlog/_fin/260911_l7_docs/040_4215_delivery.md similarity index 100% rename from devlog/_plan/260911_l7_docs/040_4215_delivery.md rename to devlog/_fin/260911_l7_docs/040_4215_delivery.md diff --git a/devlog/_plan/260911_l7_docs/050_4200_delivery.md b/devlog/_fin/260911_l7_docs/050_4200_delivery.md similarity index 100% rename from devlog/_plan/260911_l7_docs/050_4200_delivery.md rename to devlog/_fin/260911_l7_docs/050_4200_delivery.md diff --git a/devlog/_plan/260911_lane_dispatch_round/000_plan.md b/devlog/_fin/260911_lane_dispatch_round/000_plan.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/000_plan.md rename to devlog/_fin/260911_lane_dispatch_round/000_plan.md diff --git a/devlog/_plan/260911_lane_dispatch_round/010_lane_partition.md b/devlog/_fin/260911_lane_dispatch_round/010_lane_partition.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/010_lane_partition.md rename to devlog/_fin/260911_lane_dispatch_round/010_lane_partition.md diff --git a/devlog/_plan/260911_lane_dispatch_round/020_lane_packets.md b/devlog/_fin/260911_lane_dispatch_round/020_lane_packets.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/020_lane_packets.md rename to devlog/_fin/260911_lane_dispatch_round/020_lane_packets.md diff --git a/devlog/_plan/260911_lane_dispatch_round/030_audit_round1.md b/devlog/_fin/260911_lane_dispatch_round/030_audit_round1.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/030_audit_round1.md rename to devlog/_fin/260911_lane_dispatch_round/030_audit_round1.md diff --git a/devlog/_plan/260911_lane_dispatch_round/040_audit_round2.md b/devlog/_fin/260911_lane_dispatch_round/040_audit_round2.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/040_audit_round2.md rename to devlog/_fin/260911_lane_dispatch_round/040_audit_round2.md diff --git a/devlog/_plan/260911_lane_dispatch_round/050_audit_round3.md b/devlog/_fin/260911_lane_dispatch_round/050_audit_round3.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/050_audit_round3.md rename to devlog/_fin/260911_lane_dispatch_round/050_audit_round3.md diff --git a/devlog/_plan/260911_lane_dispatch_round/060_ledger.md b/devlog/_fin/260911_lane_dispatch_round/060_ledger.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/060_ledger.md rename to devlog/_fin/260911_lane_dispatch_round/060_ledger.md diff --git a/devlog/_plan/260911_lane_dispatch_round/070_dispatch_handoff.md b/devlog/_fin/260911_lane_dispatch_round/070_dispatch_handoff.md similarity index 92% rename from devlog/_plan/260911_lane_dispatch_round/070_dispatch_handoff.md rename to devlog/_fin/260911_lane_dispatch_round/070_dispatch_handoff.md index 402c4fb6ce6..cb79da61c0b 100644 --- a/devlog/_plan/260911_lane_dispatch_round/070_dispatch_handoff.md +++ b/devlog/_fin/260911_lane_dispatch_round/070_dispatch_handoff.md @@ -12,7 +12,7 @@ Paste the matching block into a new thread whose working directory is the lane w You are lane L1 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l1/opencodex, already on branch codex/260911-l1-responses-core, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l1_responses_core/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l1_responses_core/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4172 then #4176. @@ -31,7 +31,7 @@ is green, report and stop. You are lane L2 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l2/opencodex, already on branch codex/260911-l2-catalog-provider, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l2_catalog_provider/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l2_catalog_provider/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4201. @@ -50,7 +50,7 @@ is green, report and stop. You are lane L3 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l3/opencodex, already on branch codex/260911-l3-account-pool, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l3_account_pool/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l3_account_pool/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4126 then #4212 then #4211. @@ -69,7 +69,7 @@ is green, report and stop. You are lane L4 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l4/opencodex, already on branch codex/260911-l4-service-cli, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l4_service_cli/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l4_service_cli/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4202 then #4169 then #4204 then #4207. @@ -88,7 +88,7 @@ is green, report and stop. You are lane L5 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l5/opencodex, already on branch codex/260911-l5-integrations-io, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l5_integrations_io/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l5_integrations_io/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4197 then #4214. @@ -107,7 +107,7 @@ is green, report and stop. You are lane L6 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l6/opencodex, already on branch codex/260911-l6-streaming-tools, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l6_streaming_tools/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l6_streaming_tools/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4191 then #4190. @@ -126,7 +126,7 @@ is green, report and stop. You are lane L7 of the 260911 dispatch round. Your worktree is ~/.codex/worktrees/260911-l7/opencodex, already on branch codex/260911-l7-docs, cut from origin/dev 6d3ad12e3. -Read devlog/_plan/260911_l7_docs/000_packet.md first and follow it exactly. It is your contract: +Read devlog/_fin/260911_l7_docs/000_packet.md first and follow it exactly. It is your contract: owned paths, the decisions already made for you, the rules, and the report format. Run $codexclaw:cxc-loop as HOTL for your stack, in this order: #4215 then #4200. diff --git a/devlog/_plan/260911_lane_dispatch_round/080_wp2_publish_plan.md b/devlog/_fin/260911_lane_dispatch_round/080_wp2_publish_plan.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/080_wp2_publish_plan.md rename to devlog/_fin/260911_lane_dispatch_round/080_wp2_publish_plan.md diff --git a/devlog/_plan/260911_lane_dispatch_round/090_wp2_execution.md b/devlog/_fin/260911_lane_dispatch_round/090_wp2_execution.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/090_wp2_execution.md rename to devlog/_fin/260911_lane_dispatch_round/090_wp2_execution.md diff --git a/devlog/_plan/260911_lane_dispatch_round/100_wp3_plan.md b/devlog/_fin/260911_lane_dispatch_round/100_wp3_plan.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/100_wp3_plan.md rename to devlog/_fin/260911_lane_dispatch_round/100_wp3_plan.md diff --git a/devlog/_plan/260911_lane_dispatch_round/110_tracking_refresh.md b/devlog/_fin/260911_lane_dispatch_round/110_tracking_refresh.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/110_tracking_refresh.md rename to devlog/_fin/260911_lane_dispatch_round/110_tracking_refresh.md diff --git a/devlog/_plan/260911_lane_dispatch_round/120_wp4_plan.md b/devlog/_fin/260911_lane_dispatch_round/120_wp4_plan.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/120_wp4_plan.md rename to devlog/_fin/260911_lane_dispatch_round/120_wp4_plan.md diff --git a/devlog/_plan/260911_lane_dispatch_round/130_wp4_feasibility.md b/devlog/_fin/260911_lane_dispatch_round/130_wp4_feasibility.md similarity index 100% rename from devlog/_plan/260911_lane_dispatch_round/130_wp4_feasibility.md rename to devlog/_fin/260911_lane_dispatch_round/130_wp4_feasibility.md diff --git a/devlog/_plan/260911_ocx_login_codex_routing/000_plan.md b/devlog/_fin/260911_ocx_login_codex_routing/000_plan.md similarity index 100% rename from devlog/_plan/260911_ocx_login_codex_routing/000_plan.md rename to devlog/_fin/260911_ocx_login_codex_routing/000_plan.md diff --git a/devlog/_plan/260911_ocx_login_codex_routing/010_audit_round1.md b/devlog/_fin/260911_ocx_login_codex_routing/010_audit_round1.md similarity index 100% rename from devlog/_plan/260911_ocx_login_codex_routing/010_audit_round1.md rename to devlog/_fin/260911_ocx_login_codex_routing/010_audit_round1.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/000_plan.md b/devlog/_fin/260911_opencode_go_free_stabilization/000_plan.md similarity index 98% rename from devlog/_plan/260911_opencode_go_free_stabilization/000_plan.md rename to devlog/_fin/260911_opencode_go_free_stabilization/000_plan.md index 55d56096a1c..001ccd47c6d 100644 --- a/devlog/_plan/260911_opencode_go_free_stabilization/000_plan.md +++ b/devlog/_fin/260911_opencode_go_free_stabilization/000_plan.md @@ -14,7 +14,7 @@ OpenCode Zen 게이트웨이(go, zen, free)로 붙는 세 프리셋은 정적 `m | Non-goals | `src/providers/command-code-efforts.ts`(열린 PR #4258 소유), 어댑터 와이어 동작 변경, 새 사용자 config 필드, 라이브 업스트림 프로브가 필요한 주장, 무키 free 티어 정책 변경 | | Verifier | `bun test tests/providers/provider-registry-parity.test.ts`, `bun test tests/providers/opencode-go-deepseek.test.ts`, `bun test tests/adapters/openai/openai-chat-hardening.test.ts`, `bun run typecheck`. 신설 가드는 수정 전 실패를 먼저 확인한다 | | Stop condition | PR이 dev를 base로 열리고 템플릿 3개 섹션이 채워진 시점 | -| Memory artifact | `devlog/_plan/260911_opencode_go_free_stabilization/` | +| Memory artifact | `devlog/_fin/260911_opencode_go_free_stabilization/` | | Expected terminal outcomes | DONE = PR 게시 + 모든 검증 명령 green. BLOCKED = 업스트림 사실 확인이 필요해 근거 없이 시드할 수 없는 항목이 남을 때 | | Escalation condition | push 권한은 사용자가 이미 준 PR 게시로 한정한다. 머지·릴리스는 별도 승인. 라이브 프로브가 필요한 주장은 시드하지 않고 보고한다 | | Resource bounds | 도구: repo 읽기/쓰기, gh 읽기 + PR 생성, grok-4.6 서브에이전트. 쓰기 범위: `src/providers`, `src/types`, `tests/providers`, `docs-site`, 이 플랜 유닛. 벽시계: 사용자 세션 내 | diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/001_issue_triage.md b/devlog/_fin/260911_opencode_go_free_stabilization/001_issue_triage.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/001_issue_triage.md rename to devlog/_fin/260911_opencode_go_free_stabilization/001_issue_triage.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/002_cross_proxy_survey.md b/devlog/_fin/260911_opencode_go_free_stabilization/002_cross_proxy_survey.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/002_cross_proxy_survey.md rename to devlog/_fin/260911_opencode_go_free_stabilization/002_cross_proxy_survey.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/003_registry_gap_inventory.md b/devlog/_fin/260911_opencode_go_free_stabilization/003_registry_gap_inventory.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/003_registry_gap_inventory.md rename to devlog/_fin/260911_opencode_go_free_stabilization/003_registry_gap_inventory.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/004_audit_rounds.md b/devlog/_fin/260911_opencode_go_free_stabilization/004_audit_rounds.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/004_audit_rounds.md rename to devlog/_fin/260911_opencode_go_free_stabilization/004_audit_rounds.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/010_phase1_preset_structured_output.md b/devlog/_fin/260911_opencode_go_free_stabilization/010_phase1_preset_structured_output.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/010_phase1_preset_structured_output.md rename to devlog/_fin/260911_opencode_go_free_stabilization/010_phase1_preset_structured_output.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/020_phase2_preset_consistency_guard.md b/devlog/_fin/260911_opencode_go_free_stabilization/020_phase2_preset_consistency_guard.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/020_phase2_preset_consistency_guard.md rename to devlog/_fin/260911_opencode_go_free_stabilization/020_phase2_preset_consistency_guard.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/030_phase3_docs_and_pr.md b/devlog/_fin/260911_opencode_go_free_stabilization/030_phase3_docs_and_pr.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/030_phase3_docs_and_pr.md rename to devlog/_fin/260911_opencode_go_free_stabilization/030_phase3_docs_and_pr.md diff --git a/devlog/_plan/260911_opencode_go_free_stabilization/031_wp4_outcome.md b/devlog/_fin/260911_opencode_go_free_stabilization/031_wp4_outcome.md similarity index 100% rename from devlog/_plan/260911_opencode_go_free_stabilization/031_wp4_outcome.md rename to devlog/_fin/260911_opencode_go_free_stabilization/031_wp4_outcome.md diff --git a/devlog/_plan/260911_r2_merge_train/000_plan.md b/devlog/_fin/260911_r2_merge_train/000_plan.md similarity index 100% rename from devlog/_plan/260911_r2_merge_train/000_plan.md rename to devlog/_fin/260911_r2_merge_train/000_plan.md diff --git a/devlog/_plan/260911_r2_merge_train/010_phase1_pr4244.md b/devlog/_fin/260911_r2_merge_train/010_phase1_pr4244.md similarity index 100% rename from devlog/_plan/260911_r2_merge_train/010_phase1_pr4244.md rename to devlog/_fin/260911_r2_merge_train/010_phase1_pr4244.md diff --git a/devlog/_plan/260911_r2_merge_train/020_phase2_pr4248.md b/devlog/_fin/260911_r2_merge_train/020_phase2_pr4248.md similarity index 100% rename from devlog/_plan/260911_r2_merge_train/020_phase2_pr4248.md rename to devlog/_fin/260911_r2_merge_train/020_phase2_pr4248.md diff --git a/devlog/_plan/260911_r2_merge_train/030_phase3_pr4246.md b/devlog/_fin/260911_r2_merge_train/030_phase3_pr4246.md similarity index 100% rename from devlog/_plan/260911_r2_merge_train/030_phase3_pr4246.md rename to devlog/_fin/260911_r2_merge_train/030_phase3_pr4246.md diff --git a/devlog/_plan/260911_r2_merge_train/040_phase4_pr4247.md b/devlog/_fin/260911_r2_merge_train/040_phase4_pr4247.md similarity index 100% rename from devlog/_plan/260911_r2_merge_train/040_phase4_pr4247.md rename to devlog/_fin/260911_r2_merge_train/040_phase4_pr4247.md diff --git a/devlog/_plan/260911_ws_commit_boundary/000_plan.md b/devlog/_fin/260911_ws_commit_boundary/000_plan.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/000_plan.md rename to devlog/_fin/260911_ws_commit_boundary/000_plan.md diff --git a/devlog/_plan/260911_ws_commit_boundary/010_journey_evaluation.md b/devlog/_fin/260911_ws_commit_boundary/010_journey_evaluation.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/010_journey_evaluation.md rename to devlog/_fin/260911_ws_commit_boundary/010_journey_evaluation.md diff --git a/devlog/_plan/260911_ws_commit_boundary/020_design_record.md b/devlog/_fin/260911_ws_commit_boundary/020_design_record.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/020_design_record.md rename to devlog/_fin/260911_ws_commit_boundary/020_design_record.md diff --git a/devlog/_plan/260911_ws_commit_boundary/025_audit_round1.md b/devlog/_fin/260911_ws_commit_boundary/025_audit_round1.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/025_audit_round1.md rename to devlog/_fin/260911_ws_commit_boundary/025_audit_round1.md diff --git a/devlog/_plan/260911_ws_commit_boundary/030_wp2_plan.md b/devlog/_fin/260911_ws_commit_boundary/030_wp2_plan.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/030_wp2_plan.md rename to devlog/_fin/260911_ws_commit_boundary/030_wp2_plan.md diff --git a/devlog/_plan/260911_ws_commit_boundary/040_wp3_plan.md b/devlog/_fin/260911_ws_commit_boundary/040_wp3_plan.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/040_wp3_plan.md rename to devlog/_fin/260911_ws_commit_boundary/040_wp3_plan.md diff --git a/devlog/_plan/260911_ws_commit_boundary/045_wp4_plan.md b/devlog/_fin/260911_ws_commit_boundary/045_wp4_plan.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/045_wp4_plan.md rename to devlog/_fin/260911_ws_commit_boundary/045_wp4_plan.md diff --git a/devlog/_plan/260911_ws_commit_boundary/050_review.md b/devlog/_fin/260911_ws_commit_boundary/050_review.md similarity index 100% rename from devlog/_plan/260911_ws_commit_boundary/050_review.md rename to devlog/_fin/260911_ws_commit_boundary/050_review.md diff --git a/devlog/_plan/260912_audio_apis_stack/000_plan.md b/devlog/_fin/260912_audio_apis_stack/000_plan.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/000_plan.md rename to devlog/_fin/260912_audio_apis_stack/000_plan.md diff --git a/devlog/_plan/260912_audio_apis_stack/002_review_disposition.md b/devlog/_fin/260912_audio_apis_stack/002_review_disposition.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/002_review_disposition.md rename to devlog/_fin/260912_audio_apis_stack/002_review_disposition.md diff --git a/devlog/_plan/260912_audio_apis_stack/010_transcription.md b/devlog/_fin/260912_audio_apis_stack/010_transcription.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/010_transcription.md rename to devlog/_fin/260912_audio_apis_stack/010_transcription.md diff --git a/devlog/_plan/260912_audio_apis_stack/011_transcription_checks.md b/devlog/_fin/260912_audio_apis_stack/011_transcription_checks.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/011_transcription_checks.md rename to devlog/_fin/260912_audio_apis_stack/011_transcription_checks.md diff --git a/devlog/_plan/260912_audio_apis_stack/020_streaming_voice.md b/devlog/_fin/260912_audio_apis_stack/020_streaming_voice.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/020_streaming_voice.md rename to devlog/_fin/260912_audio_apis_stack/020_streaming_voice.md diff --git a/devlog/_plan/260912_audio_apis_stack/021_streaming_checks.md b/devlog/_fin/260912_audio_apis_stack/021_streaming_checks.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/021_streaming_checks.md rename to devlog/_fin/260912_audio_apis_stack/021_streaming_checks.md diff --git a/devlog/_plan/260912_audio_apis_stack/030_connections.md b/devlog/_fin/260912_audio_apis_stack/030_connections.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/030_connections.md rename to devlog/_fin/260912_audio_apis_stack/030_connections.md diff --git a/devlog/_plan/260912_audio_apis_stack/031_connections_checks.md b/devlog/_fin/260912_audio_apis_stack/031_connections_checks.md similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/031_connections_checks.md rename to devlog/_fin/260912_audio_apis_stack/031_connections_checks.md diff --git a/devlog/_plan/260912_audio_apis_stack/screenshots/audio-1440-light.png b/devlog/_fin/260912_audio_apis_stack/screenshots/audio-1440-light.png similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/screenshots/audio-1440-light.png rename to devlog/_fin/260912_audio_apis_stack/screenshots/audio-1440-light.png diff --git a/devlog/_plan/260912_audio_apis_stack/screenshots/audio-320-ko.png b/devlog/_fin/260912_audio_apis_stack/screenshots/audio-320-ko.png similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/screenshots/audio-320-ko.png rename to devlog/_fin/260912_audio_apis_stack/screenshots/audio-320-ko.png diff --git a/devlog/_plan/260912_audio_apis_stack/screenshots/audio-390-light.png b/devlog/_fin/260912_audio_apis_stack/screenshots/audio-390-light.png similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/screenshots/audio-390-light.png rename to devlog/_fin/260912_audio_apis_stack/screenshots/audio-390-light.png diff --git a/devlog/_plan/260912_audio_apis_stack/screenshots/transcription-layer-baseline.png b/devlog/_fin/260912_audio_apis_stack/screenshots/transcription-layer-baseline.png similarity index 100% rename from devlog/_plan/260912_audio_apis_stack/screenshots/transcription-layer-baseline.png rename to devlog/_fin/260912_audio_apis_stack/screenshots/transcription-layer-baseline.png diff --git a/devlog/_plan/260912_beginner_pdf/000_plan.md b/devlog/_fin/260912_beginner_pdf/000_plan.md similarity index 100% rename from devlog/_plan/260912_beginner_pdf/000_plan.md rename to devlog/_fin/260912_beginner_pdf/000_plan.md diff --git a/devlog/_plan/260912_cache_lane/000_plan.md b/devlog/_fin/260912_cache_lane/000_plan.md similarity index 100% rename from devlog/_plan/260912_cache_lane/000_plan.md rename to devlog/_fin/260912_cache_lane/000_plan.md diff --git a/devlog/_plan/260912_cache_lane/010_claim.md b/devlog/_fin/260912_cache_lane/010_claim.md similarity index 100% rename from devlog/_plan/260912_cache_lane/010_claim.md rename to devlog/_fin/260912_cache_lane/010_claim.md diff --git a/devlog/_plan/260912_cache_lane/020_affinity.md b/devlog/_fin/260912_cache_lane/020_affinity.md similarity index 100% rename from devlog/_plan/260912_cache_lane/020_affinity.md rename to devlog/_fin/260912_cache_lane/020_affinity.md diff --git a/devlog/_plan/260912_cache_lane/025_affinity_native.md b/devlog/_fin/260912_cache_lane/025_affinity_native.md similarity index 100% rename from devlog/_plan/260912_cache_lane/025_affinity_native.md rename to devlog/_fin/260912_cache_lane/025_affinity_native.md diff --git a/devlog/_plan/260912_cache_lane/026_affinity_adapt.md b/devlog/_fin/260912_cache_lane/026_affinity_adapt.md similarity index 100% rename from devlog/_plan/260912_cache_lane/026_affinity_adapt.md rename to devlog/_fin/260912_cache_lane/026_affinity_adapt.md diff --git a/devlog/_plan/260912_cache_lane/027_affinity_slot.md b/devlog/_fin/260912_cache_lane/027_affinity_slot.md similarity index 100% rename from devlog/_plan/260912_cache_lane/027_affinity_slot.md rename to devlog/_fin/260912_cache_lane/027_affinity_slot.md diff --git a/devlog/_plan/260912_cache_lane/030_prefix.md b/devlog/_fin/260912_cache_lane/030_prefix.md similarity index 100% rename from devlog/_plan/260912_cache_lane/030_prefix.md rename to devlog/_fin/260912_cache_lane/030_prefix.md diff --git a/devlog/_plan/260912_cache_lane/035_prefix_adapt.md b/devlog/_fin/260912_cache_lane/035_prefix_adapt.md similarity index 100% rename from devlog/_plan/260912_cache_lane/035_prefix_adapt.md rename to devlog/_fin/260912_cache_lane/035_prefix_adapt.md diff --git a/devlog/_plan/260912_cache_lane/036_prefix_linear.md b/devlog/_fin/260912_cache_lane/036_prefix_linear.md similarity index 100% rename from devlog/_plan/260912_cache_lane/036_prefix_linear.md rename to devlog/_fin/260912_cache_lane/036_prefix_linear.md diff --git a/devlog/_plan/260912_cache_lane/037_prefix_slot.md b/devlog/_fin/260912_cache_lane/037_prefix_slot.md similarity index 100% rename from devlog/_plan/260912_cache_lane/037_prefix_slot.md rename to devlog/_fin/260912_cache_lane/037_prefix_slot.md diff --git a/devlog/_plan/260912_cache_lane/040_hermes.md b/devlog/_fin/260912_cache_lane/040_hermes.md similarity index 100% rename from devlog/_plan/260912_cache_lane/040_hermes.md rename to devlog/_fin/260912_cache_lane/040_hermes.md diff --git a/devlog/_plan/260912_cache_lane/041_hermes_ci_refresh.md b/devlog/_fin/260912_cache_lane/041_hermes_ci_refresh.md similarity index 100% rename from devlog/_plan/260912_cache_lane/041_hermes_ci_refresh.md rename to devlog/_fin/260912_cache_lane/041_hermes_ci_refresh.md diff --git a/devlog/_plan/260912_cache_lane/050_verify.md b/devlog/_fin/260912_cache_lane/050_verify.md similarity index 100% rename from devlog/_plan/260912_cache_lane/050_verify.md rename to devlog/_fin/260912_cache_lane/050_verify.md diff --git a/devlog/_plan/260912_cache_lane/060_handoff.md b/devlog/_fin/260912_cache_lane/060_handoff.md similarity index 100% rename from devlog/_plan/260912_cache_lane/060_handoff.md rename to devlog/_fin/260912_cache_lane/060_handoff.md diff --git a/devlog/_plan/260912_campaign_ci_fixtures/000_plan.md b/devlog/_fin/260912_campaign_ci_fixtures/000_plan.md similarity index 100% rename from devlog/_plan/260912_campaign_ci_fixtures/000_plan.md rename to devlog/_fin/260912_campaign_ci_fixtures/000_plan.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/000_plan.md b/devlog/_fin/260912_catalog_lane_readiness/000_plan.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/000_plan.md rename to devlog/_fin/260912_catalog_lane_readiness/000_plan.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/010_roadmap.md b/devlog/_fin/260912_catalog_lane_readiness/010_roadmap.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/010_roadmap.md rename to devlog/_fin/260912_catalog_lane_readiness/010_roadmap.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/011_design_reflection.md b/devlog/_fin/260912_catalog_lane_readiness/011_design_reflection.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/011_design_reflection.md rename to devlog/_fin/260912_catalog_lane_readiness/011_design_reflection.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/020_review.md b/devlog/_fin/260912_catalog_lane_readiness/020_review.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/020_review.md rename to devlog/_fin/260912_catalog_lane_readiness/020_review.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/022_keyboard_repair.md b/devlog/_fin/260912_catalog_lane_readiness/022_keyboard_repair.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/022_keyboard_repair.md rename to devlog/_fin/260912_catalog_lane_readiness/022_keyboard_repair.md diff --git a/devlog/_plan/260912_catalog_lane_readiness/030_evidence.md b/devlog/_fin/260912_catalog_lane_readiness/030_evidence.md similarity index 100% rename from devlog/_plan/260912_catalog_lane_readiness/030_evidence.md rename to devlog/_fin/260912_catalog_lane_readiness/030_evidence.md diff --git a/devlog/_plan/260912_cline_client/000_plan.md b/devlog/_fin/260912_cline_client/000_plan.md similarity index 100% rename from devlog/_plan/260912_cline_client/000_plan.md rename to devlog/_fin/260912_cline_client/000_plan.md diff --git a/devlog/_plan/260912_cline_client/001_contract.md b/devlog/_fin/260912_cline_client/001_contract.md similarity index 100% rename from devlog/_plan/260912_cline_client/001_contract.md rename to devlog/_fin/260912_cline_client/001_contract.md diff --git a/devlog/_plan/260912_cline_client/009_roadmap_result.md b/devlog/_fin/260912_cline_client/009_roadmap_result.md similarity index 100% rename from devlog/_plan/260912_cline_client/009_roadmap_result.md rename to devlog/_fin/260912_cline_client/009_roadmap_result.md diff --git a/devlog/_plan/260912_cline_client/010_contract.md b/devlog/_fin/260912_cline_client/010_contract.md similarity index 100% rename from devlog/_plan/260912_cline_client/010_contract.md rename to devlog/_fin/260912_cline_client/010_contract.md diff --git a/devlog/_plan/260912_cline_client/019_contract_result.md b/devlog/_fin/260912_cline_client/019_contract_result.md similarity index 100% rename from devlog/_plan/260912_cline_client/019_contract_result.md rename to devlog/_fin/260912_cline_client/019_contract_result.md diff --git a/devlog/_plan/260912_cline_client/020_surfaces.md b/devlog/_fin/260912_cline_client/020_surfaces.md similarity index 100% rename from devlog/_plan/260912_cline_client/020_surfaces.md rename to devlog/_fin/260912_cline_client/020_surfaces.md diff --git a/devlog/_plan/260912_cline_client/029_surfaces_result.md b/devlog/_fin/260912_cline_client/029_surfaces_result.md similarity index 100% rename from devlog/_plan/260912_cline_client/029_surfaces_result.md rename to devlog/_fin/260912_cline_client/029_surfaces_result.md diff --git a/devlog/_plan/260912_cline_client/030_verification.md b/devlog/_fin/260912_cline_client/030_verification.md similarity index 100% rename from devlog/_plan/260912_cline_client/030_verification.md rename to devlog/_fin/260912_cline_client/030_verification.md diff --git a/devlog/_plan/260912_cline_client/039_gui_evidence.md b/devlog/_fin/260912_cline_client/039_gui_evidence.md similarity index 100% rename from devlog/_plan/260912_cline_client/039_gui_evidence.md rename to devlog/_fin/260912_cline_client/039_gui_evidence.md diff --git a/devlog/_plan/260912_cline_client/evidence/cline-export.png b/devlog/_fin/260912_cline_client/evidence/cline-export.png similarity index 100% rename from devlog/_plan/260912_cline_client/evidence/cline-export.png rename to devlog/_fin/260912_cline_client/evidence/cline-export.png diff --git a/devlog/_plan/260912_cline_client/evidence/cline-integration.png b/devlog/_fin/260912_cline_client/evidence/cline-integration.png similarity index 100% rename from devlog/_plan/260912_cline_client/evidence/cline-integration.png rename to devlog/_fin/260912_cline_client/evidence/cline-integration.png diff --git a/devlog/_plan/260912_codex_gpt54_retirement/000_plan.md b/devlog/_fin/260912_codex_gpt54_retirement/000_plan.md similarity index 100% rename from devlog/_plan/260912_codex_gpt54_retirement/000_plan.md rename to devlog/_fin/260912_codex_gpt54_retirement/000_plan.md diff --git a/devlog/_plan/260912_codex_gpt54_retirement/010_catalog_removal.md b/devlog/_fin/260912_codex_gpt54_retirement/010_catalog_removal.md similarity index 100% rename from devlog/_plan/260912_codex_gpt54_retirement/010_catalog_removal.md rename to devlog/_fin/260912_codex_gpt54_retirement/010_catalog_removal.md diff --git a/devlog/_plan/260912_codex_gpt54_retirement/020_defaults_repoint.md b/devlog/_fin/260912_codex_gpt54_retirement/020_defaults_repoint.md similarity index 100% rename from devlog/_plan/260912_codex_gpt54_retirement/020_defaults_repoint.md rename to devlog/_fin/260912_codex_gpt54_retirement/020_defaults_repoint.md diff --git a/devlog/_plan/260912_codex_gpt54_retirement/030_surfaces_and_gate.md b/devlog/_fin/260912_codex_gpt54_retirement/030_surfaces_and_gate.md similarity index 100% rename from devlog/_plan/260912_codex_gpt54_retirement/030_surfaces_and_gate.md rename to devlog/_fin/260912_codex_gpt54_retirement/030_surfaces_and_gate.md diff --git a/devlog/_plan/260912_codex_gpt54_retirement/040_done.md b/devlog/_fin/260912_codex_gpt54_retirement/040_done.md similarity index 100% rename from devlog/_plan/260912_codex_gpt54_retirement/040_done.md rename to devlog/_fin/260912_codex_gpt54_retirement/040_done.md diff --git a/devlog/_plan/260912_codex_spark_retirement/000_plan.md b/devlog/_fin/260912_codex_spark_retirement/000_plan.md similarity index 100% rename from devlog/_plan/260912_codex_spark_retirement/000_plan.md rename to devlog/_fin/260912_codex_spark_retirement/000_plan.md diff --git a/devlog/_plan/260912_codex_spark_retirement/001_source.md b/devlog/_fin/260912_codex_spark_retirement/001_source.md similarity index 100% rename from devlog/_plan/260912_codex_spark_retirement/001_source.md rename to devlog/_fin/260912_codex_spark_retirement/001_source.md diff --git a/devlog/_plan/260912_codex_spark_retirement/010_implementation.md b/devlog/_fin/260912_codex_spark_retirement/010_implementation.md similarity index 100% rename from devlog/_plan/260912_codex_spark_retirement/010_implementation.md rename to devlog/_fin/260912_codex_spark_retirement/010_implementation.md diff --git a/devlog/_plan/260912_codex_spark_retirement/020_review.md b/devlog/_fin/260912_codex_spark_retirement/020_review.md similarity index 100% rename from devlog/_plan/260912_codex_spark_retirement/020_review.md rename to devlog/_fin/260912_codex_spark_retirement/020_review.md diff --git a/devlog/_plan/260912_codex_spark_retirement/030_delivery.md b/devlog/_fin/260912_codex_spark_retirement/030_delivery.md similarity index 100% rename from devlog/_plan/260912_codex_spark_retirement/030_delivery.md rename to devlog/_fin/260912_codex_spark_retirement/030_delivery.md diff --git a/devlog/_plan/260912_combo_carry/000_plan.md b/devlog/_fin/260912_combo_carry/000_plan.md similarity index 100% rename from devlog/_plan/260912_combo_carry/000_plan.md rename to devlog/_fin/260912_combo_carry/000_plan.md diff --git a/devlog/_plan/260912_combo_carry/010_runtime.md b/devlog/_fin/260912_combo_carry/010_runtime.md similarity index 100% rename from devlog/_plan/260912_combo_carry/010_runtime.md rename to devlog/_fin/260912_combo_carry/010_runtime.md diff --git a/devlog/_plan/260912_combo_carry/020_editor.md b/devlog/_fin/260912_combo_carry/020_editor.md similarity index 100% rename from devlog/_plan/260912_combo_carry/020_editor.md rename to devlog/_fin/260912_combo_carry/020_editor.md diff --git a/devlog/_plan/260912_combo_carry/030_verification.md b/devlog/_fin/260912_combo_carry/030_verification.md similarity index 100% rename from devlog/_plan/260912_combo_carry/030_verification.md rename to devlog/_fin/260912_combo_carry/030_verification.md diff --git a/devlog/_plan/260912_combo_carry/031_exhausted.png b/devlog/_fin/260912_combo_carry/031_exhausted.png similarity index 100% rename from devlog/_plan/260912_combo_carry/031_exhausted.png rename to devlog/_fin/260912_combo_carry/031_exhausted.png diff --git a/devlog/_plan/260912_combo_carry/032_unknown.png b/devlog/_fin/260912_combo_carry/032_unknown.png similarity index 100% rename from devlog/_plan/260912_combo_carry/032_unknown.png rename to devlog/_fin/260912_combo_carry/032_unknown.png diff --git a/devlog/_plan/260912_combo_carry/033_expired.png b/devlog/_fin/260912_combo_carry/033_expired.png similarity index 100% rename from devlog/_plan/260912_combo_carry/033_expired.png rename to devlog/_fin/260912_combo_carry/033_expired.png diff --git a/devlog/_plan/260912_combo_carry/034_render_evidence.md b/devlog/_fin/260912_combo_carry/034_render_evidence.md similarity index 100% rename from devlog/_plan/260912_combo_carry/034_render_evidence.md rename to devlog/_fin/260912_combo_carry/034_render_evidence.md diff --git a/devlog/_plan/260912_combo_carry/040_pnpm_ci_repair.md b/devlog/_fin/260912_combo_carry/040_pnpm_ci_repair.md similarity index 100% rename from devlog/_plan/260912_combo_carry/040_pnpm_ci_repair.md rename to devlog/_fin/260912_combo_carry/040_pnpm_ci_repair.md diff --git a/devlog/_plan/260912_combo_carry/050_active_reactivation_repair.md b/devlog/_fin/260912_combo_carry/050_active_reactivation_repair.md similarity index 100% rename from devlog/_plan/260912_combo_carry/050_active_reactivation_repair.md rename to devlog/_fin/260912_combo_carry/050_active_reactivation_repair.md diff --git a/devlog/_plan/260912_devin_hardening/000_plan.md b/devlog/_fin/260912_devin_hardening/000_plan.md similarity index 100% rename from devlog/_plan/260912_devin_hardening/000_plan.md rename to devlog/_fin/260912_devin_hardening/000_plan.md diff --git a/devlog/_plan/260912_devin_hardening/010_cli_token_transition.md b/devlog/_fin/260912_devin_hardening/010_cli_token_transition.md similarity index 100% rename from devlog/_plan/260912_devin_hardening/010_cli_token_transition.md rename to devlog/_fin/260912_devin_hardening/010_cli_token_transition.md diff --git a/devlog/_plan/260912_devin_hardening/020_cloud_direct_hardening.md b/devlog/_fin/260912_devin_hardening/020_cloud_direct_hardening.md similarity index 100% rename from devlog/_plan/260912_devin_hardening/020_cloud_direct_hardening.md rename to devlog/_fin/260912_devin_hardening/020_cloud_direct_hardening.md diff --git a/devlog/_plan/260912_devin_hardening/030_cached_token_display.md b/devlog/_fin/260912_devin_hardening/030_cached_token_display.md similarity index 100% rename from devlog/_plan/260912_devin_hardening/030_cached_token_display.md rename to devlog/_fin/260912_devin_hardening/030_cached_token_display.md diff --git a/devlog/_plan/260912_devin_hardening/040_stacked_delivery.md b/devlog/_fin/260912_devin_hardening/040_stacked_delivery.md similarity index 100% rename from devlog/_plan/260912_devin_hardening/040_stacked_delivery.md rename to devlog/_fin/260912_devin_hardening/040_stacked_delivery.md diff --git a/devlog/_plan/260912_devin_hardening/logs-devin-cached-restored.jpg b/devlog/_fin/260912_devin_hardening/logs-devin-cached-restored.jpg similarity index 100% rename from devlog/_plan/260912_devin_hardening/logs-devin-cached-restored.jpg rename to devlog/_fin/260912_devin_hardening/logs-devin-cached-restored.jpg diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/000_plan.md b/devlog/_fin/260912_grok_reset_coupon_gui/000_plan.md similarity index 99% rename from devlog/_plan/260912_grok_reset_coupon_gui/000_plan.md rename to devlog/_fin/260912_grok_reset_coupon_gui/000_plan.md index e300fc35c0c..192e5dd2d7c 100644 --- a/devlog/_plan/260912_grok_reset_coupon_gui/000_plan.md +++ b/devlog/_fin/260912_grok_reset_coupon_gui/000_plan.md @@ -31,7 +31,7 @@ audit (`030`) are folded into the decisions, file map, verifiers and criteria be observes this unit's files. - **Stop condition:** merged into `dev` with exact-head CI green and `dev` ancestry proven. -- **Memory artifact:** `devlog/_plan/260912_grok_reset_coupon_gui/`, closing into +- **Memory artifact:** `devlog/_fin/260912_grok_reset_coupon_gui/`, closing into `devlog/_fin/` after the merge. - **Expected terminal outcomes:** DONE on merge; BLOCKED if review requires the server change this unit excluded; NEEDS_HUMAN if a second maintainer approval is diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/005_status.md b/devlog/_fin/260912_grok_reset_coupon_gui/005_status.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupon_gui/005_status.md rename to devlog/_fin/260912_grok_reset_coupon_gui/005_status.md diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/010_architect_dispositions.md b/devlog/_fin/260912_grok_reset_coupon_gui/010_architect_dispositions.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupon_gui/010_architect_dispositions.md rename to devlog/_fin/260912_grok_reset_coupon_gui/010_architect_dispositions.md diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/020_reflection_gaps.md b/devlog/_fin/260912_grok_reset_coupon_gui/020_reflection_gaps.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupon_gui/020_reflection_gaps.md rename to devlog/_fin/260912_grok_reset_coupon_gui/020_reflection_gaps.md diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/030_audit_round1.md b/devlog/_fin/260912_grok_reset_coupon_gui/030_audit_round1.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupon_gui/030_audit_round1.md rename to devlog/_fin/260912_grok_reset_coupon_gui/030_audit_round1.md diff --git a/devlog/_plan/260912_grok_reset_coupon_gui/evidence/architect-round1.md b/devlog/_fin/260912_grok_reset_coupon_gui/evidence/architect-round1.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupon_gui/evidence/architect-round1.md rename to devlog/_fin/260912_grok_reset_coupon_gui/evidence/architect-round1.md diff --git a/devlog/_plan/260912_grok_reset_coupons/000_plan.md b/devlog/_fin/260912_grok_reset_coupons/000_plan.md similarity index 95% rename from devlog/_plan/260912_grok_reset_coupons/000_plan.md rename to devlog/_fin/260912_grok_reset_coupons/000_plan.md index 22ba5d65b9f..001038f8a1c 100644 --- a/devlog/_plan/260912_grok_reset_coupons/000_plan.md +++ b/devlog/_fin/260912_grok_reset_coupons/000_plan.md @@ -18,7 +18,7 @@ the same safety shape they already know. - **Non-goals:** no auto-redeem in this unit (opt-in auto-redeem is a follow-up); no GUI surface; no changes to the Codex reset-credit path; no new dependency (hand-rolled gRPC-Web codec, no @bufbuild/protobuf runtime import). - **Verifier:** `bun test tests/providers/xai/grok-reset-coupons.test.ts` (targets the new test file directly), `bun run typecheck` (package.json:11 "bun x tsc --noEmit"), `bun run test` (package.json:12 "bun scripts/test.ts" — full tree, reads all domains incl. our layout registrations), `bun run privacy:scan` (package.json "bun scripts/privacy-scan.ts" — scans the tree incl. new files). Live smoke (sanitized) re-proves the read path against the real endpoint. - **Stop condition:** all criteria met (goalplan c1–c6) and the PR is merged with exact-head CI + issue closed; report DONE. Missing authority (push/merge refusal) reports BLOCKED. -- **Memory artifact:** this unit (devlog/_plan/260912_grok_reset_coupons/, moves to _fin at wp4 D); goalplan + ledger under .codexclaw/goalplans/implement-grok-reset-coupon-support-in-opencodex/; evidence under .codexclaw/evidence/. +- **Memory artifact:** this unit (devlog/_fin/260912_grok_reset_coupons/, moves to _fin at wp4 D); goalplan + ledger under .codexclaw/goalplans/implement-grok-reset-coupon-support-in-opencodex/; evidence under .codexclaw/evidence/. - **Expected terminal outcomes:** DONE (all criteria + merged), BLOCKED (missing external authority or upstream contract change), BUDGET_EXHAUSTED (host bounds), NEEDS_HUMAN (upstream schema drift on RedeemReset success shape). - **Escalation condition:** upstream rejects the documented RedeemReset request shape on a real redeem → stop, report, ask operator how to proceed (spending a coupon is operator-owned). Main reclaims a lane after two distinct agents fail its packet (DISPATCH-RETIRE-01); pushing a slice to a worker requires a P-phase amendment. diff --git a/devlog/_plan/260912_grok_reset_coupons/001_survey_seams.md b/devlog/_fin/260912_grok_reset_coupons/001_survey_seams.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupons/001_survey_seams.md rename to devlog/_fin/260912_grok_reset_coupons/001_survey_seams.md diff --git a/devlog/_plan/260912_grok_reset_coupons/005_status.md b/devlog/_fin/260912_grok_reset_coupons/005_status.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupons/005_status.md rename to devlog/_fin/260912_grok_reset_coupons/005_status.md diff --git a/devlog/_plan/260912_grok_reset_coupons/010_phase1_core_client.md b/devlog/_fin/260912_grok_reset_coupons/010_phase1_core_client.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupons/010_phase1_core_client.md rename to devlog/_fin/260912_grok_reset_coupons/010_phase1_core_client.md diff --git a/devlog/_plan/260912_grok_reset_coupons/020_phase2_surfaces.md b/devlog/_fin/260912_grok_reset_coupons/020_phase2_surfaces.md similarity index 100% rename from devlog/_plan/260912_grok_reset_coupons/020_phase2_surfaces.md rename to devlog/_fin/260912_grok_reset_coupons/020_phase2_surfaces.md diff --git a/devlog/_plan/260912_grok_reset_coupons/030_phase3_delivery.md b/devlog/_fin/260912_grok_reset_coupons/030_phase3_delivery.md similarity index 99% rename from devlog/_plan/260912_grok_reset_coupons/030_phase3_delivery.md rename to devlog/_fin/260912_grok_reset_coupons/030_phase3_delivery.md index a89db8f8ee9..2c014eaee95 100644 --- a/devlog/_plan/260912_grok_reset_coupons/030_phase3_delivery.md +++ b/devlog/_fin/260912_grok_reset_coupons/030_phase3_delivery.md @@ -72,7 +72,7 @@ The Grok reset coupons capability introduces both a new CLI command under `ocx a Upon landing all Phase 1 and Phase 2 changes on `dev`, promote the planning directory to finished status: -- **Source:** `devlog/_plan/260912_grok_reset_coupons/` +- **Source:** `devlog/_fin/260912_grok_reset_coupons/` - **Destination:** `devlog/_fin/260912_grok_reset_coupons/` - **Action:** Move the directory and add `000_fin_summary.md` documenting: 1. Live verification against `grok.com/prod_mc_billing.ConsumerUiSvc`. diff --git a/devlog/_plan/260912_history_containment/000_plan.md b/devlog/_fin/260912_history_containment/000_plan.md similarity index 100% rename from devlog/_plan/260912_history_containment/000_plan.md rename to devlog/_fin/260912_history_containment/000_plan.md diff --git a/devlog/_plan/260912_history_containment/010_containment.md b/devlog/_fin/260912_history_containment/010_containment.md similarity index 100% rename from devlog/_plan/260912_history_containment/010_containment.md rename to devlog/_fin/260912_history_containment/010_containment.md diff --git a/devlog/_plan/260912_history_containment/020_continuation.md b/devlog/_fin/260912_history_containment/020_continuation.md similarity index 100% rename from devlog/_plan/260912_history_containment/020_continuation.md rename to devlog/_fin/260912_history_containment/020_continuation.md diff --git a/devlog/_plan/260912_history_containment/030_relay.md b/devlog/_fin/260912_history_containment/030_relay.md similarity index 100% rename from devlog/_plan/260912_history_containment/030_relay.md rename to devlog/_fin/260912_history_containment/030_relay.md diff --git a/devlog/_plan/260912_history_containment/040_verification.md b/devlog/_fin/260912_history_containment/040_verification.md similarity index 100% rename from devlog/_plan/260912_history_containment/040_verification.md rename to devlog/_fin/260912_history_containment/040_verification.md diff --git a/devlog/_plan/260912_history_containment/051_resume_status.md b/devlog/_fin/260912_history_containment/051_resume_status.md similarity index 100% rename from devlog/_plan/260912_history_containment/051_resume_status.md rename to devlog/_fin/260912_history_containment/051_resume_status.md diff --git a/devlog/_plan/260912_muse_device_oauth/000_plan.md b/devlog/_fin/260912_muse_device_oauth/000_plan.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/000_plan.md rename to devlog/_fin/260912_muse_device_oauth/000_plan.md diff --git a/devlog/_plan/260912_muse_device_oauth/001_reference_measurements.md b/devlog/_fin/260912_muse_device_oauth/001_reference_measurements.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/001_reference_measurements.md rename to devlog/_fin/260912_muse_device_oauth/001_reference_measurements.md diff --git a/devlog/_plan/260912_muse_device_oauth/002_design_decisions.md b/devlog/_fin/260912_muse_device_oauth/002_design_decisions.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/002_design_decisions.md rename to devlog/_fin/260912_muse_device_oauth/002_design_decisions.md diff --git a/devlog/_plan/260912_muse_device_oauth/010_wp2_device_core.md b/devlog/_fin/260912_muse_device_oauth/010_wp2_device_core.md similarity index 99% rename from devlog/_plan/260912_muse_device_oauth/010_wp2_device_core.md rename to devlog/_fin/260912_muse_device_oauth/010_wp2_device_core.md index 5a93ec9ea8a..15f1d875919 100644 --- a/devlog/_plan/260912_muse_device_oauth/010_wp2_device_core.md +++ b/devlog/_fin/260912_muse_device_oauth/010_wp2_device_core.md @@ -25,7 +25,7 @@ Add beside `KiroOAuthMetadata`, whose role this mirrors (`002` §A): * * The Model API is authenticated by the `LLM|` key in `access`; this token authenticates * the Meta ACCOUNT and exists only to mint that key and to read subscription usage - * (devlog/_plan/260912_muse_device_oauth/002 A). Keeping it out of `access` is what lets + * (devlog/_fin/260912_muse_device_oauth/002 A). Keeping it out of `access` is what lets * every request path stay unchanged. * * It must never be added to `OAuthAccountSummary` (src/oauth/index.ts:1803) or to @@ -121,7 +121,7 @@ branches in milliseconds and paying real seconds per branch the way * resulting account token into the `LLM|` Model API key our request path sends as a * bearer. * - * Protocol source: devlog/_plan/260912_muse_device_oauth/001_reference_measurements.md. + * Protocol source: devlog/_fin/260912_muse_device_oauth/001_reference_measurements.md. * It is second-party, not vendor documentation, so every response is parsed defensively * and every failure names a kind instead of throwing a bare string. * diff --git a/devlog/_plan/260912_muse_device_oauth/020_wp3_login_integration.md b/devlog/_fin/260912_muse_device_oauth/020_wp3_login_integration.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/020_wp3_login_integration.md rename to devlog/_fin/260912_muse_device_oauth/020_wp3_login_integration.md diff --git a/devlog/_plan/260912_muse_device_oauth/030_wp4_header_and_quota.md b/devlog/_fin/260912_muse_device_oauth/030_wp4_header_and_quota.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/030_wp4_header_and_quota.md rename to devlog/_fin/260912_muse_device_oauth/030_wp4_header_and_quota.md diff --git a/devlog/_plan/260912_muse_device_oauth/040_wp5_tests_and_gate.md b/devlog/_fin/260912_muse_device_oauth/040_wp5_tests_and_gate.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/040_wp5_tests_and_gate.md rename to devlog/_fin/260912_muse_device_oauth/040_wp5_tests_and_gate.md diff --git a/devlog/_plan/260912_muse_device_oauth/050_delivery_record.md b/devlog/_fin/260912_muse_device_oauth/050_delivery_record.md similarity index 100% rename from devlog/_plan/260912_muse_device_oauth/050_delivery_record.md rename to devlog/_fin/260912_muse_device_oauth/050_delivery_record.md diff --git a/devlog/_plan/260912_muse_tool_name_alias/000_plan.md b/devlog/_fin/260912_muse_tool_name_alias/000_plan.md similarity index 100% rename from devlog/_plan/260912_muse_tool_name_alias/000_plan.md rename to devlog/_fin/260912_muse_tool_name_alias/000_plan.md diff --git a/devlog/_plan/260912_omo_client_integration/000_plan.md b/devlog/_fin/260912_omo_client_integration/000_plan.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/000_plan.md rename to devlog/_fin/260912_omo_client_integration/000_plan.md diff --git a/devlog/_plan/260912_omo_client_integration/001_omo_contract.md b/devlog/_fin/260912_omo_client_integration/001_omo_contract.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/001_omo_contract.md rename to devlog/_fin/260912_omo_client_integration/001_omo_contract.md diff --git a/devlog/_plan/260912_omo_client_integration/002_registration_checklist.md b/devlog/_fin/260912_omo_client_integration/002_registration_checklist.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/002_registration_checklist.md rename to devlog/_fin/260912_omo_client_integration/002_registration_checklist.md diff --git a/devlog/_plan/260912_omo_client_integration/003_brand_mark_provenance.md b/devlog/_fin/260912_omo_client_integration/003_brand_mark_provenance.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/003_brand_mark_provenance.md rename to devlog/_fin/260912_omo_client_integration/003_brand_mark_provenance.md diff --git a/devlog/_plan/260912_omo_client_integration/010_wp2_backend.md b/devlog/_fin/260912_omo_client_integration/010_wp2_backend.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/010_wp2_backend.md rename to devlog/_fin/260912_omo_client_integration/010_wp2_backend.md diff --git a/devlog/_plan/260912_omo_client_integration/020_wp3_gui.md b/devlog/_fin/260912_omo_client_integration/020_wp3_gui.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/020_wp3_gui.md rename to devlog/_fin/260912_omo_client_integration/020_wp3_gui.md diff --git a/devlog/_plan/260912_omo_client_integration/030_wp4_docs.md b/devlog/_fin/260912_omo_client_integration/030_wp4_docs.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/030_wp4_docs.md rename to devlog/_fin/260912_omo_client_integration/030_wp4_docs.md diff --git a/devlog/_plan/260912_omo_client_integration/040_wp5_verification.md b/devlog/_fin/260912_omo_client_integration/040_wp5_verification.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/040_wp5_verification.md rename to devlog/_fin/260912_omo_client_integration/040_wp5_verification.md diff --git a/devlog/_plan/260912_omo_client_integration/050_wp6_gjc_rename.md b/devlog/_fin/260912_omo_client_integration/050_wp6_gjc_rename.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/050_wp6_gjc_rename.md rename to devlog/_fin/260912_omo_client_integration/050_wp6_gjc_rename.md diff --git a/devlog/_plan/260912_omo_client_integration/060_wp3_rendered_proof.md b/devlog/_fin/260912_omo_client_integration/060_wp3_rendered_proof.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/060_wp3_rendered_proof.md rename to devlog/_fin/260912_omo_client_integration/060_wp3_rendered_proof.md diff --git a/devlog/_plan/260912_omo_client_integration/090_outcome.md b/devlog/_fin/260912_omo_client_integration/090_outcome.md similarity index 100% rename from devlog/_plan/260912_omo_client_integration/090_outcome.md rename to devlog/_fin/260912_omo_client_integration/090_outcome.md diff --git a/devlog/_plan/260912_omo_client_integration/evidence/integrations-omo-tab.png b/devlog/_fin/260912_omo_client_integration/evidence/integrations-omo-tab.png similarity index 100% rename from devlog/_plan/260912_omo_client_integration/evidence/integrations-omo-tab.png rename to devlog/_fin/260912_omo_client_integration/evidence/integrations-omo-tab.png diff --git a/devlog/_plan/260912_operations/000_plan.md b/devlog/_fin/260912_operations/000_plan.md similarity index 100% rename from devlog/_plan/260912_operations/000_plan.md rename to devlog/_fin/260912_operations/000_plan.md diff --git a/devlog/_plan/260912_operations/001_roadmap_audit.md b/devlog/_fin/260912_operations/001_roadmap_audit.md similarity index 100% rename from devlog/_plan/260912_operations/001_roadmap_audit.md rename to devlog/_fin/260912_operations/001_roadmap_audit.md diff --git a/devlog/_plan/260912_operations/010_update.md b/devlog/_fin/260912_operations/010_update.md similarity index 100% rename from devlog/_plan/260912_operations/010_update.md rename to devlog/_fin/260912_operations/010_update.md diff --git a/devlog/_plan/260912_operations/020_listeners.md b/devlog/_fin/260912_operations/020_listeners.md similarity index 100% rename from devlog/_plan/260912_operations/020_listeners.md rename to devlog/_fin/260912_operations/020_listeners.md diff --git a/devlog/_plan/260912_operations/030_totals.md b/devlog/_fin/260912_operations/030_totals.md similarity index 100% rename from devlog/_plan/260912_operations/030_totals.md rename to devlog/_fin/260912_operations/030_totals.md diff --git a/devlog/_plan/260912_operations/040_client_usage.md b/devlog/_fin/260912_operations/040_client_usage.md similarity index 100% rename from devlog/_plan/260912_operations/040_client_usage.md rename to devlog/_fin/260912_operations/040_client_usage.md diff --git a/devlog/_plan/260912_operations/050_pairing.md b/devlog/_fin/260912_operations/050_pairing.md similarity index 100% rename from devlog/_plan/260912_operations/050_pairing.md rename to devlog/_fin/260912_operations/050_pairing.md diff --git a/devlog/_plan/260912_operations/060_transport.md b/devlog/_fin/260912_operations/060_transport.md similarity index 100% rename from devlog/_plan/260912_operations/060_transport.md rename to devlog/_fin/260912_operations/060_transport.md diff --git a/devlog/_plan/260912_operations/070_verification.md b/devlog/_fin/260912_operations/070_verification.md similarity index 100% rename from devlog/_plan/260912_operations/070_verification.md rename to devlog/_fin/260912_operations/070_verification.md diff --git a/devlog/_plan/260912_operations/080_update_events.md b/devlog/_fin/260912_operations/080_update_events.md similarity index 100% rename from devlog/_plan/260912_operations/080_update_events.md rename to devlog/_fin/260912_operations/080_update_events.md diff --git a/devlog/_plan/260912_operations/090_listener_diagnostic.md b/devlog/_fin/260912_operations/090_listener_diagnostic.md similarity index 100% rename from devlog/_plan/260912_operations/090_listener_diagnostic.md rename to devlog/_fin/260912_operations/090_listener_diagnostic.md diff --git a/devlog/_plan/260912_operations/100_usage_transport.md b/devlog/_fin/260912_operations/100_usage_transport.md similarity index 100% rename from devlog/_plan/260912_operations/100_usage_transport.md rename to devlog/_fin/260912_operations/100_usage_transport.md diff --git a/devlog/_plan/260912_operations/110_resume_status.md b/devlog/_fin/260912_operations/110_resume_status.md similarity index 100% rename from devlog/_plan/260912_operations/110_resume_status.md rename to devlog/_fin/260912_operations/110_resume_status.md diff --git a/devlog/_plan/260912_operations/120_coordinator_probe.md b/devlog/_fin/260912_operations/120_coordinator_probe.md similarity index 100% rename from devlog/_plan/260912_operations/120_coordinator_probe.md rename to devlog/_fin/260912_operations/120_coordinator_probe.md diff --git a/devlog/_plan/260912_phantom_account_short_quota/000_plan.md b/devlog/_fin/260912_phantom_account_short_quota/000_plan.md similarity index 100% rename from devlog/_plan/260912_phantom_account_short_quota/000_plan.md rename to devlog/_fin/260912_phantom_account_short_quota/000_plan.md diff --git a/devlog/_plan/260912_phantom_account_short_quota/010_phase1_drop_elapsed_short_carry.md b/devlog/_fin/260912_phantom_account_short_quota/010_phase1_drop_elapsed_short_carry.md similarity index 100% rename from devlog/_plan/260912_phantom_account_short_quota/010_phase1_drop_elapsed_short_carry.md rename to devlog/_fin/260912_phantom_account_short_quota/010_phase1_drop_elapsed_short_carry.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/000_plan.md b/devlog/_fin/260912_provider_catalog_unified_search/000_plan.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/000_plan.md rename to devlog/_fin/260912_provider_catalog_unified_search/000_plan.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/010_context.md b/devlog/_fin/260912_provider_catalog_unified_search/010_context.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/010_context.md rename to devlog/_fin/260912_provider_catalog_unified_search/010_context.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/015_codesign_grok.md b/devlog/_fin/260912_provider_catalog_unified_search/015_codesign_grok.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/015_codesign_grok.md rename to devlog/_fin/260912_provider_catalog_unified_search/015_codesign_grok.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/016_audit_corrections.md b/devlog/_fin/260912_provider_catalog_unified_search/016_audit_corrections.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/016_audit_corrections.md rename to devlog/_fin/260912_provider_catalog_unified_search/016_audit_corrections.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/020_r3_local_tab.md b/devlog/_fin/260912_provider_catalog_unified_search/020_r3_local_tab.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/020_r3_local_tab.md rename to devlog/_fin/260912_provider_catalog_unified_search/020_r3_local_tab.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/030_r2_note_clamp.md b/devlog/_fin/260912_provider_catalog_unified_search/030_r2_note_clamp.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/030_r2_note_clamp.md rename to devlog/_fin/260912_provider_catalog_unified_search/030_r2_note_clamp.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/040_r1_unified_search.md b/devlog/_fin/260912_provider_catalog_unified_search/040_r1_unified_search.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/040_r1_unified_search.md rename to devlog/_fin/260912_provider_catalog_unified_search/040_r1_unified_search.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/050_delivery.md b/devlog/_fin/260912_provider_catalog_unified_search/050_delivery.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/050_delivery.md rename to devlog/_fin/260912_provider_catalog_unified_search/050_delivery.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/060_delivery_record.md b/devlog/_fin/260912_provider_catalog_unified_search/060_delivery_record.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/060_delivery_record.md rename to devlog/_fin/260912_provider_catalog_unified_search/060_delivery_record.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/grok-4.6-codesign.md b/devlog/_fin/260912_provider_catalog_unified_search/evidence/grok-4.6-codesign.md similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/grok-4.6-codesign.md rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/grok-4.6-codesign.md diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp2-local-tab.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp2-local-tab.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp2-local-tab.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp2-local-tab.png diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp3-note-clamp.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp3-note-clamp.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp3-note-clamp.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp3-note-clamp.png diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp3-note-popup.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp3-note-popup.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp3-note-popup.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp3-note-popup.png diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-browse-mode.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-browse-mode.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-browse-mode.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-browse-mode.png diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-search-accounts.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-search-accounts.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-search-accounts.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-search-accounts.png diff --git a/devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-search-groups.png b/devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-search-groups.png similarity index 100% rename from devlog/_plan/260912_provider_catalog_unified_search/evidence/wp4-search-groups.png rename to devlog/_fin/260912_provider_catalog_unified_search/evidence/wp4-search-groups.png diff --git a/devlog/_plan/260912_reasoning_effort_downgrade/000_decision.md b/devlog/_fin/260912_reasoning_effort_downgrade/000_decision.md similarity index 96% rename from devlog/_plan/260912_reasoning_effort_downgrade/000_decision.md rename to devlog/_fin/260912_reasoning_effort_downgrade/000_decision.md index 67499186afe..b83a14ca267 100644 --- a/devlog/_plan/260912_reasoning_effort_downgrade/000_decision.md +++ b/devlog/_fin/260912_reasoning_effort_downgrade/000_decision.md @@ -5,7 +5,7 @@ When a routed upstream answers 400/403 and names reasoning effort in the body, the pipeline records that (provider, model, effort) as refused, replays the request once at the next lower published rung, and keeps the rung out of every later ladder (see the metadata record in -devlog/_plan/260912_reasoning_metadata/). The attempt is logged with recovery kind +devlog/_fin/260912_reasoning_metadata/). The attempt is logged with recovery kind reasoning-effort-downgrade, so requestedEffort and effectiveEffort stay distinguishable in usage. ## Why the ladder is not enough diff --git a/devlog/_plan/260912_reasoning_metadata/000_decision.md b/devlog/_fin/260912_reasoning_metadata/000_decision.md similarity index 100% rename from devlog/_plan/260912_reasoning_metadata/000_decision.md rename to devlog/_fin/260912_reasoning_metadata/000_decision.md diff --git a/devlog/_plan/260912_release_regression_train/000_plan.md b/devlog/_fin/260912_release_regression_train/000_plan.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/000_plan.md rename to devlog/_fin/260912_release_regression_train/000_plan.md diff --git a/devlog/_plan/260912_release_regression_train/010_ci_repair.md b/devlog/_fin/260912_release_regression_train/010_ci_repair.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/010_ci_repair.md rename to devlog/_fin/260912_release_regression_train/010_ci_repair.md diff --git a/devlog/_plan/260912_release_regression_train/020_regression_sweep.md b/devlog/_fin/260912_release_regression_train/020_regression_sweep.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/020_regression_sweep.md rename to devlog/_fin/260912_release_regression_train/020_regression_sweep.md diff --git a/devlog/_plan/260912_release_regression_train/025_sweep_results.md b/devlog/_fin/260912_release_regression_train/025_sweep_results.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/025_sweep_results.md rename to devlog/_fin/260912_release_regression_train/025_sweep_results.md diff --git a/devlog/_plan/260912_release_regression_train/030_defect_landing.md b/devlog/_fin/260912_release_regression_train/030_defect_landing.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/030_defect_landing.md rename to devlog/_fin/260912_release_regression_train/030_defect_landing.md diff --git a/devlog/_plan/260912_release_regression_train/040_preview_release.md b/devlog/_fin/260912_release_regression_train/040_preview_release.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/040_preview_release.md rename to devlog/_fin/260912_release_regression_train/040_preview_release.md diff --git a/devlog/_plan/260912_release_regression_train/050_main_release.md b/devlog/_fin/260912_release_regression_train/050_main_release.md similarity index 100% rename from devlog/_plan/260912_release_regression_train/050_main_release.md rename to devlog/_fin/260912_release_regression_train/050_main_release.md diff --git a/devlog/_plan/260912_remote_workspace_carry/000_plan.md b/devlog/_fin/260912_remote_workspace_carry/000_plan.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/000_plan.md rename to devlog/_fin/260912_remote_workspace_carry/000_plan.md diff --git a/devlog/_plan/260912_remote_workspace_carry/010_protocol.md b/devlog/_fin/260912_remote_workspace_carry/010_protocol.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/010_protocol.md rename to devlog/_fin/260912_remote_workspace_carry/010_protocol.md diff --git a/devlog/_plan/260912_remote_workspace_carry/020_executor_runtime.md b/devlog/_fin/260912_remote_workspace_carry/020_executor_runtime.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/020_executor_runtime.md rename to devlog/_fin/260912_remote_workspace_carry/020_executor_runtime.md diff --git a/devlog/_plan/260912_remote_workspace_carry/030_integration.md b/devlog/_fin/260912_remote_workspace_carry/030_integration.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/030_integration.md rename to devlog/_fin/260912_remote_workspace_carry/030_integration.md diff --git a/devlog/_plan/260912_remote_workspace_carry/040_hosted_validation.md b/devlog/_fin/260912_remote_workspace_carry/040_hosted_validation.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/040_hosted_validation.md rename to devlog/_fin/260912_remote_workspace_carry/040_hosted_validation.md diff --git a/devlog/_plan/260912_remote_workspace_carry/041_resume_ci_repair.md b/devlog/_fin/260912_remote_workspace_carry/041_resume_ci_repair.md similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/041_resume_ci_repair.md rename to devlog/_fin/260912_remote_workspace_carry/041_resume_ci_repair.md diff --git a/devlog/_plan/260912_remote_workspace_carry/assets/041_desktop_read_only.png b/devlog/_fin/260912_remote_workspace_carry/assets/041_desktop_read_only.png similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/assets/041_desktop_read_only.png rename to devlog/_fin/260912_remote_workspace_carry/assets/041_desktop_read_only.png diff --git a/devlog/_plan/260912_remote_workspace_carry/assets/042_desktop_files_only.png b/devlog/_fin/260912_remote_workspace_carry/assets/042_desktop_files_only.png similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/assets/042_desktop_files_only.png rename to devlog/_fin/260912_remote_workspace_carry/assets/042_desktop_files_only.png diff --git a/devlog/_plan/260912_remote_workspace_carry/screenshots/remote-workspace-hub-dashboard.png b/devlog/_fin/260912_remote_workspace_carry/screenshots/remote-workspace-hub-dashboard.png similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/screenshots/remote-workspace-hub-dashboard.png rename to devlog/_fin/260912_remote_workspace_carry/screenshots/remote-workspace-hub-dashboard.png diff --git a/devlog/_plan/260912_remote_workspace_carry/screenshots/remote-workspace-pairing-code.png b/devlog/_fin/260912_remote_workspace_carry/screenshots/remote-workspace-pairing-code.png similarity index 100% rename from devlog/_plan/260912_remote_workspace_carry/screenshots/remote-workspace-pairing-code.png rename to devlog/_fin/260912_remote_workspace_carry/screenshots/remote-workspace-pairing-code.png diff --git a/devlog/_plan/260912_thinking_contract/000_plan.md b/devlog/_fin/260912_thinking_contract/000_plan.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/000_plan.md rename to devlog/_fin/260912_thinking_contract/000_plan.md diff --git a/devlog/_plan/260912_thinking_contract/001_sources.md b/devlog/_fin/260912_thinking_contract/001_sources.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/001_sources.md rename to devlog/_fin/260912_thinking_contract/001_sources.md diff --git a/devlog/_plan/260912_thinking_contract/010_presentation.md b/devlog/_fin/260912_thinking_contract/010_presentation.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/010_presentation.md rename to devlog/_fin/260912_thinking_contract/010_presentation.md diff --git a/devlog/_plan/260912_thinking_contract/020_transport_hint.md b/devlog/_fin/260912_thinking_contract/020_transport_hint.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/020_transport_hint.md rename to devlog/_fin/260912_thinking_contract/020_transport_hint.md diff --git a/devlog/_plan/260912_thinking_contract/030_spark.md b/devlog/_fin/260912_thinking_contract/030_spark.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/030_spark.md rename to devlog/_fin/260912_thinking_contract/030_spark.md diff --git a/devlog/_plan/260912_thinking_contract/040_delivery.md b/devlog/_fin/260912_thinking_contract/040_delivery.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/040_delivery.md rename to devlog/_fin/260912_thinking_contract/040_delivery.md diff --git a/devlog/_plan/260912_thinking_contract/050_refresh.md b/devlog/_fin/260912_thinking_contract/050_refresh.md similarity index 100% rename from devlog/_plan/260912_thinking_contract/050_refresh.md rename to devlog/_fin/260912_thinking_contract/050_refresh.md diff --git a/devlog/_plan/260912_v2_contracts/000_plan.md b/devlog/_fin/260912_v2_contracts/000_plan.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/000_plan.md rename to devlog/_fin/260912_v2_contracts/000_plan.md diff --git a/devlog/_plan/260912_v2_contracts/010_plaintext.md b/devlog/_fin/260912_v2_contracts/010_plaintext.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/010_plaintext.md rename to devlog/_fin/260912_v2_contracts/010_plaintext.md diff --git a/devlog/_plan/260912_v2_contracts/020_recovery.md b/devlog/_fin/260912_v2_contracts/020_recovery.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/020_recovery.md rename to devlog/_fin/260912_v2_contracts/020_recovery.md diff --git a/devlog/_plan/260912_v2_contracts/030_native_identity.md b/devlog/_fin/260912_v2_contracts/030_native_identity.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/030_native_identity.md rename to devlog/_fin/260912_v2_contracts/030_native_identity.md diff --git a/devlog/_plan/260912_v2_contracts/040_verification.md b/devlog/_fin/260912_v2_contracts/040_verification.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/040_verification.md rename to devlog/_fin/260912_v2_contracts/040_verification.md diff --git a/devlog/_plan/260912_v2_contracts/050_resume_evidence.md b/devlog/_fin/260912_v2_contracts/050_resume_evidence.md similarity index 100% rename from devlog/_plan/260912_v2_contracts/050_resume_evidence.md rename to devlog/_fin/260912_v2_contracts/050_resume_evidence.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/000_plan.md b/devlog/_fin/260912_zcode_protocol_and_catalog/000_plan.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/000_plan.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/000_plan.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/001_research_zai_model_facts.md b/devlog/_fin/260912_zcode_protocol_and_catalog/001_research_zai_model_facts.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/001_research_zai_model_facts.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/001_research_zai_model_facts.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/002_research_zcode_bundle_schema.md b/devlog/_fin/260912_zcode_protocol_and_catalog/002_research_zcode_bundle_schema.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/002_research_zcode_bundle_schema.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/002_research_zcode_bundle_schema.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/003_research_ocx_internals.md b/devlog/_fin/260912_zcode_protocol_and_catalog/003_research_ocx_internals.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/003_research_ocx_internals.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/003_research_ocx_internals.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/010_wp2_zcode_export_responses.md b/devlog/_fin/260912_zcode_protocol_and_catalog/010_wp2_zcode_export_responses.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/010_wp2_zcode_export_responses.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/010_wp2_zcode_export_responses.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/020_wp3_glm53_flash_modalities.md b/devlog/_fin/260912_zcode_protocol_and_catalog/020_wp3_glm53_flash_modalities.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/020_wp3_glm53_flash_modalities.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/020_wp3_glm53_flash_modalities.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/030_wp4_zai_responses_default.md b/devlog/_fin/260912_zcode_protocol_and_catalog/030_wp4_zai_responses_default.md similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/030_wp4_zai_responses_default.md rename to devlog/_fin/260912_zcode_protocol_and_catalog/030_wp4_zai_responses_default.md diff --git a/devlog/_plan/260912_zcode_protocol_and_catalog/evidence/zai-responses-models.json b/devlog/_fin/260912_zcode_protocol_and_catalog/evidence/zai-responses-models.json similarity index 100% rename from devlog/_plan/260912_zcode_protocol_and_catalog/evidence/zai-responses-models.json rename to devlog/_fin/260912_zcode_protocol_and_catalog/evidence/zai-responses-models.json diff --git a/devlog/_plan/260913_chat_refusal_translator/000_plan.md b/devlog/_fin/260913_chat_refusal_translator/000_plan.md similarity index 100% rename from devlog/_plan/260913_chat_refusal_translator/000_plan.md rename to devlog/_fin/260913_chat_refusal_translator/000_plan.md diff --git a/devlog/_plan/260913_chat_refusal_translator/010_rootcause_evidence.md b/devlog/_fin/260913_chat_refusal_translator/010_rootcause_evidence.md similarity index 100% rename from devlog/_plan/260913_chat_refusal_translator/010_rootcause_evidence.md rename to devlog/_fin/260913_chat_refusal_translator/010_rootcause_evidence.md diff --git a/devlog/_plan/260913_chat_refusal_translator/020_fix_refusal_scope.md b/devlog/_fin/260913_chat_refusal_translator/020_fix_refusal_scope.md similarity index 100% rename from devlog/_plan/260913_chat_refusal_translator/020_fix_refusal_scope.md rename to devlog/_fin/260913_chat_refusal_translator/020_fix_refusal_scope.md diff --git a/devlog/_fin/260913_contributor_carry_train/000_plan.md b/devlog/_fin/260913_contributor_carry_train/000_plan.md index d3b03d7fe3e..797255df8eb 100644 --- a/devlog/_fin/260913_contributor_carry_train/000_plan.md +++ b/devlog/_fin/260913_contributor_carry_train/000_plan.md @@ -10,7 +10,7 @@ request owning them. The goal also closes everything those landings actually resolve. `origin/dev` was `2df82f412` when this roadmap was written. This unit follows the 36-PR lane-stack merge in -`devlog/_plan/260913_lane_stack_merge/`, which landed the maintainer-authored +`devlog/_fin/260913_lane_stack_merge/`, which landed the maintainer-authored backlog. That batch is the precedent for the mechanism here; what changes is the authorship. Every branch in this train belongs to someone else, so attribution is a correctness requirement rather than a courtesy. diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/000_plan.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/000_plan.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/000_plan.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/000_plan.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/001_platform_topology.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/001_platform_topology.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/001_platform_topology.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/001_platform_topology.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/002_audit_findings.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/002_audit_findings.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/002_audit_findings.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/002_audit_findings.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/010_phase1_shared_restart_surface.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/010_phase1_shared_restart_surface.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/010_phase1_shared_restart_surface.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/010_phase1_shared_restart_surface.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/020_phase2_detached_self_handoff.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/020_phase2_detached_self_handoff.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/020_phase2_detached_self_handoff.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/020_phase2_detached_self_handoff.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md similarity index 99% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md index 241974a7bef..d09bae27c2e 100644 --- a/devlog/_plan/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md +++ b/devlog/_fin/260913_cross_platform_desktop_app_restart/030_phase3_contract_merge.md @@ -25,7 +25,7 @@ quit. The operator's in-flight turn is interrupted, recovered, and interrupted a So when a desktop restart is going to run, app-servers that are **members of the discovered desktop tree** are excluded from the SIGTERM pass. Quitting the app terminates them anyway. Standalone app-servers — the npm `codex app-server` pair that -`devlog/_plan/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md` +`devlog/_fin/260826_restart_codex_linux_survivor/000_repro_and_root_cause.md` documents, and SSH bootstraps — are not members and are still signalled. `afterCatalogWriteHandleAppServers` gains one option: diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/040_phase4_verification_and_delivery.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/040_phase4_verification_and_delivery.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/040_phase4_verification_and_delivery.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/040_phase4_verification_and_delivery.md diff --git a/devlog/_plan/260913_cross_platform_desktop_app_restart/041_execution_record.md b/devlog/_fin/260913_cross_platform_desktop_app_restart/041_execution_record.md similarity index 100% rename from devlog/_plan/260913_cross_platform_desktop_app_restart/041_execution_record.md rename to devlog/_fin/260913_cross_platform_desktop_app_restart/041_execution_record.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/000_plan.md b/devlog/_fin/260913_devin_landing_and_caching/000_plan.md similarity index 99% rename from devlog/_plan/260913_devin_landing_and_caching/000_plan.md rename to devlog/_fin/260913_devin_landing_and_caching/000_plan.md index 7c91cc19590..e71adec2cdb 100644 --- a/devlog/_plan/260913_devin_landing_and_caching/000_plan.md +++ b/devlog/_fin/260913_devin_landing_and_caching/000_plan.md @@ -70,7 +70,7 @@ wp0 (이 문서) ──┬── wp1 #4420 carry (독립) | wp | 문서 | 산출물 | 쓰기 범위 | |---|---|---|---| -| wp0 | 이 문서 + 010/020/030/040 | 로드맵 | `devlog/_plan/260913_devin_landing_and_caching/` | +| wp0 | 이 문서 + 010/020/030/040 | 로드맵 | `devlog/_fin/260913_devin_landing_and_caching/` | | wp1 | `010_wp1_swe2_effort_carry.md` | carry PR → merge | `src/adapters/devin.ts`, `tests/providers/devin-adapter.test.ts`, docs/structure | | wp2 | `020_wp2_devin_cli_fixture_carry.md` | carry PR → merge | `tests/providers/devin-cli-login.test.ts` | | wp3 | `030_wp3_ttfb_generation_deadline.md` | 버그픽스 PR → merge | `src/adapters/devin/cloud-direct/chat.ts`, `src/adapters/devin.ts`, 신규 테스트 | diff --git a/devlog/_plan/260913_devin_landing_and_caching/010_wp1_swe2_effort_carry.md b/devlog/_fin/260913_devin_landing_and_caching/010_wp1_swe2_effort_carry.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/010_wp1_swe2_effort_carry.md rename to devlog/_fin/260913_devin_landing_and_caching/010_wp1_swe2_effort_carry.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/020_wp2_devin_cli_fixture_carry.md b/devlog/_fin/260913_devin_landing_and_caching/020_wp2_devin_cli_fixture_carry.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/020_wp2_devin_cli_fixture_carry.md rename to devlog/_fin/260913_devin_landing_and_caching/020_wp2_devin_cli_fixture_carry.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/030_wp3_ttfb_generation_deadline.md b/devlog/_fin/260913_devin_landing_and_caching/030_wp3_ttfb_generation_deadline.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/030_wp3_ttfb_generation_deadline.md rename to devlog/_fin/260913_devin_landing_and_caching/030_wp3_ttfb_generation_deadline.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/040_wp4_devin_prompt_cache_and_identity.md b/devlog/_fin/260913_devin_landing_and_caching/040_wp4_devin_prompt_cache_and_identity.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/040_wp4_devin_prompt_cache_and_identity.md rename to devlog/_fin/260913_devin_landing_and_caching/040_wp4_devin_prompt_cache_and_identity.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/050_wp5_effort_suffix_unification.md b/devlog/_fin/260913_devin_landing_and_caching/050_wp5_effort_suffix_unification.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/050_wp5_effort_suffix_unification.md rename to devlog/_fin/260913_devin_landing_and_caching/050_wp5_effort_suffix_unification.md diff --git a/devlog/_plan/260913_devin_landing_and_caching/060_wp6_assign_model_router.md b/devlog/_fin/260913_devin_landing_and_caching/060_wp6_assign_model_router.md similarity index 100% rename from devlog/_plan/260913_devin_landing_and_caching/060_wp6_assign_model_router.md rename to devlog/_fin/260913_devin_landing_and_caching/060_wp6_assign_model_router.md diff --git a/devlog/_plan/260913_devin_provider_merge/000_plan.md b/devlog/_fin/260913_devin_provider_merge/000_plan.md similarity index 100% rename from devlog/_plan/260913_devin_provider_merge/000_plan.md rename to devlog/_fin/260913_devin_provider_merge/000_plan.md diff --git a/devlog/_plan/260913_devin_provider_merge/010_wp1_core_merge.md b/devlog/_fin/260913_devin_provider_merge/010_wp1_core_merge.md similarity index 100% rename from devlog/_plan/260913_devin_provider_merge/010_wp1_core_merge.md rename to devlog/_fin/260913_devin_provider_merge/010_wp1_core_merge.md diff --git a/devlog/_plan/260913_devin_provider_merge/020_wp2_migration.md b/devlog/_fin/260913_devin_provider_merge/020_wp2_migration.md similarity index 100% rename from devlog/_plan/260913_devin_provider_merge/020_wp2_migration.md rename to devlog/_fin/260913_devin_provider_merge/020_wp2_migration.md diff --git a/devlog/_plan/260913_devin_provider_merge/030_wp3_surface_sync.md b/devlog/_fin/260913_devin_provider_merge/030_wp3_surface_sync.md similarity index 100% rename from devlog/_plan/260913_devin_provider_merge/030_wp3_surface_sync.md rename to devlog/_fin/260913_devin_provider_merge/030_wp3_surface_sync.md diff --git a/devlog/_plan/260913_devin_provider_merge/040_wp4_pr.md b/devlog/_fin/260913_devin_provider_merge/040_wp4_pr.md similarity index 100% rename from devlog/_plan/260913_devin_provider_merge/040_wp4_pr.md rename to devlog/_fin/260913_devin_provider_merge/040_wp4_pr.md diff --git a/devlog/_plan/260913_godfile_round1/000_plan.md b/devlog/_fin/260913_godfile_round1/000_plan.md similarity index 100% rename from devlog/_plan/260913_godfile_round1/000_plan.md rename to devlog/_fin/260913_godfile_round1/000_plan.md diff --git a/devlog/_plan/260913_lane_stack_merge/000_plan.md b/devlog/_fin/260913_lane_stack_merge/000_plan.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/000_plan.md rename to devlog/_fin/260913_lane_stack_merge/000_plan.md diff --git a/devlog/_plan/260913_lane_stack_merge/001_merge_topology.md b/devlog/_fin/260913_lane_stack_merge/001_merge_topology.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/001_merge_topology.md rename to devlog/_fin/260913_lane_stack_merge/001_merge_topology.md diff --git a/devlog/_plan/260913_lane_stack_merge/002_merge_mechanics.md b/devlog/_fin/260913_lane_stack_merge/002_merge_mechanics.md similarity index 97% rename from devlog/_plan/260913_lane_stack_merge/002_merge_mechanics.md rename to devlog/_fin/260913_lane_stack_merge/002_merge_mechanics.md index 57935bee93a..861e3f6873c 100644 --- a/devlog/_plan/260913_lane_stack_merge/002_merge_mechanics.md +++ b/devlog/_fin/260913_lane_stack_merge/002_merge_mechanics.md @@ -53,7 +53,7 @@ dashboard, not running `bun run test`. Images need a hosted URL to render in a description, so the PNGs are committed into the lane's devlog unit under `screenshots/` and referenced by raw link. -`devlog/_plan/260912_audio_apis_stack/screenshots/` is the existing precedent. +`devlog/_fin/260912_audio_apis_stack/screenshots/` is the existing precedent. The screenshot commit rides along with the tip's final `origin/dev` re-merge so the lane pays for one CI run rather than one per commit. diff --git a/devlog/_plan/260913_lane_stack_merge/010_wave1.md b/devlog/_fin/260913_lane_stack_merge/010_wave1.md similarity index 98% rename from devlog/_plan/260913_lane_stack_merge/010_wave1.md rename to devlog/_fin/260913_lane_stack_merge/010_wave1.md index dc49e84c851..021aec6c19e 100644 --- a/devlog/_plan/260913_lane_stack_merge/010_wave1.md +++ b/devlog/_fin/260913_lane_stack_merge/010_wave1.md @@ -13,7 +13,7 @@ Each runs as its own worktree-backed thread owned by `xai/grok-4.6`. | 2 | #4392 | `codex/audio-streaming` | skip | | 3 | #4395 | `codex/audio-connections` | tip, full run | -Internal order is fixed by `devlog/_plan/260912_audio_apis_stack`: 010 +Internal order is fixed by `devlog/_fin/260912_audio_apis_stack`: 010 transcription, 020 streaming, 030 dashboard. #4391 and #4392 share `src/providers/openai-sidecar.ts`, `src/server/audio-upstream.ts`, and `src/server/live.ts`, so reordering them guarantees conflicts. diff --git a/devlog/_plan/260913_lane_stack_merge/020_wave2.md b/devlog/_fin/260913_lane_stack_merge/020_wave2.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/020_wave2.md rename to devlog/_fin/260913_lane_stack_merge/020_wave2.md diff --git a/devlog/_plan/260913_lane_stack_merge/030_tip_and_regression.md b/devlog/_fin/260913_lane_stack_merge/030_tip_and_regression.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/030_tip_and_regression.md rename to devlog/_fin/260913_lane_stack_merge/030_tip_and_regression.md diff --git a/devlog/_plan/260913_lane_stack_merge/040_issue_closure.md b/devlog/_fin/260913_lane_stack_merge/040_issue_closure.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/040_issue_closure.md rename to devlog/_fin/260913_lane_stack_merge/040_issue_closure.md diff --git a/devlog/_plan/260913_lane_stack_merge/050_outcome.md b/devlog/_fin/260913_lane_stack_merge/050_outcome.md similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/050_outcome.md rename to devlog/_fin/260913_lane_stack_merge/050_outcome.md diff --git a/devlog/_plan/260913_lane_stack_merge/screenshots/codex-account-pool.png b/devlog/_fin/260913_lane_stack_merge/screenshots/codex-account-pool.png similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/screenshots/codex-account-pool.png rename to devlog/_fin/260913_lane_stack_merge/screenshots/codex-account-pool.png diff --git a/devlog/_plan/260913_lane_stack_merge/screenshots/dashboard-overview.png b/devlog/_fin/260913_lane_stack_merge/screenshots/dashboard-overview.png similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/screenshots/dashboard-overview.png rename to devlog/_fin/260913_lane_stack_merge/screenshots/dashboard-overview.png diff --git a/devlog/_plan/260913_lane_stack_merge/screenshots/integrations-clients.png b/devlog/_fin/260913_lane_stack_merge/screenshots/integrations-clients.png similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/screenshots/integrations-clients.png rename to devlog/_fin/260913_lane_stack_merge/screenshots/integrations-clients.png diff --git a/devlog/_plan/260913_lane_stack_merge/screenshots/remote-workspace.png b/devlog/_fin/260913_lane_stack_merge/screenshots/remote-workspace.png similarity index 100% rename from devlog/_plan/260913_lane_stack_merge/screenshots/remote-workspace.png rename to devlog/_fin/260913_lane_stack_merge/screenshots/remote-workspace.png diff --git a/devlog/_plan/260913_missing_coauthor_credits/000_plan.md b/devlog/_fin/260913_missing_coauthor_credits/000_plan.md similarity index 98% rename from devlog/_plan/260913_missing_coauthor_credits/000_plan.md rename to devlog/_fin/260913_missing_coauthor_credits/000_plan.md index 97c78e5d348..c8725127833 100644 --- a/devlog/_plan/260913_missing_coauthor_credits/000_plan.md +++ b/devlog/_fin/260913_missing_coauthor_credits/000_plan.md @@ -31,7 +31,7 @@ on the page: **#3988 by @rrmlima**, merged through **#4031**. - **Stop condition:** #3988 is on `CREDITS.md`, the PR is merged to `dev`, or NOOP if a later origin/dev commit already repaired it. - **Memory artifact:** this unit - `devlog/_plan/260913_missing_coauthor_credits/` plus + `devlog/_fin/260913_missing_coauthor_credits/` plus `.codexclaw/evidence/4c876c16-4cd9-4a26-bcd5-743ccaa1b137/credits-scan/`. - **Expected terminal outcomes:** DONE (row + merged PR); NOOP (already repaired); BLOCKED (merge protection); UNSAFE (history rewrite / raw email in tree). diff --git a/devlog/_plan/260913_missing_coauthor_credits/001_scan_evidence.md b/devlog/_fin/260913_missing_coauthor_credits/001_scan_evidence.md similarity index 100% rename from devlog/_plan/260913_missing_coauthor_credits/001_scan_evidence.md rename to devlog/_fin/260913_missing_coauthor_credits/001_scan_evidence.md diff --git a/devlog/_plan/260913_missing_coauthor_credits/010_inventory_freeze.md b/devlog/_fin/260913_missing_coauthor_credits/010_inventory_freeze.md similarity index 100% rename from devlog/_plan/260913_missing_coauthor_credits/010_inventory_freeze.md rename to devlog/_fin/260913_missing_coauthor_credits/010_inventory_freeze.md diff --git a/devlog/_plan/260913_missing_coauthor_credits/020_credits_update.md b/devlog/_fin/260913_missing_coauthor_credits/020_credits_update.md similarity index 100% rename from devlog/_plan/260913_missing_coauthor_credits/020_credits_update.md rename to devlog/_fin/260913_missing_coauthor_credits/020_credits_update.md diff --git a/devlog/_plan/260913_missing_coauthor_credits/030_pr_merge.md b/devlog/_fin/260913_missing_coauthor_credits/030_pr_merge.md similarity index 100% rename from devlog/_plan/260913_missing_coauthor_credits/030_pr_merge.md rename to devlog/_fin/260913_missing_coauthor_credits/030_pr_merge.md diff --git a/devlog/_plan/260913_model_availability_errors/000_summary.md b/devlog/_fin/260913_model_availability_errors/000_summary.md similarity index 100% rename from devlog/_plan/260913_model_availability_errors/000_summary.md rename to devlog/_fin/260913_model_availability_errors/000_summary.md diff --git a/devlog/_plan/260913_model_picker_grouping_and_effort/000_plan.md b/devlog/_fin/260913_model_picker_grouping_and_effort/000_plan.md similarity index 100% rename from devlog/_plan/260913_model_picker_grouping_and_effort/000_plan.md rename to devlog/_fin/260913_model_picker_grouping_and_effort/000_plan.md diff --git a/devlog/_plan/260913_model_picker_grouping_and_effort/010_devin_effort_ladder.md b/devlog/_fin/260913_model_picker_grouping_and_effort/010_devin_effort_ladder.md similarity index 100% rename from devlog/_plan/260913_model_picker_grouping_and_effort/010_devin_effort_ladder.md rename to devlog/_fin/260913_model_picker_grouping_and_effort/010_devin_effort_ladder.md diff --git a/devlog/_plan/260914_carry_pr4528/000_plan.md b/devlog/_fin/260914_carry_pr4528/000_plan.md similarity index 100% rename from devlog/_plan/260914_carry_pr4528/000_plan.md rename to devlog/_fin/260914_carry_pr4528/000_plan.md diff --git a/devlog/_plan/260914_carry_pr4528/010_phase1.md b/devlog/_fin/260914_carry_pr4528/010_phase1.md similarity index 100% rename from devlog/_plan/260914_carry_pr4528/010_phase1.md rename to devlog/_fin/260914_carry_pr4528/010_phase1.md diff --git a/devlog/_plan/260914_codex_history_preflight_scope/000_plan.md b/devlog/_fin/260914_codex_history_preflight_scope/000_plan.md similarity index 100% rename from devlog/_plan/260914_codex_history_preflight_scope/000_plan.md rename to devlog/_fin/260914_codex_history_preflight_scope/000_plan.md diff --git a/devlog/_plan/260914_codex_history_preflight_scope/010_rootcause_evidence.md b/devlog/_fin/260914_codex_history_preflight_scope/010_rootcause_evidence.md similarity index 100% rename from devlog/_plan/260914_codex_history_preflight_scope/010_rootcause_evidence.md rename to devlog/_fin/260914_codex_history_preflight_scope/010_rootcause_evidence.md diff --git a/devlog/_plan/260914_codex_history_preflight_scope/020_fix_and_contract_change.md b/devlog/_fin/260914_codex_history_preflight_scope/020_fix_and_contract_change.md similarity index 100% rename from devlog/_plan/260914_codex_history_preflight_scope/020_fix_and_contract_change.md rename to devlog/_fin/260914_codex_history_preflight_scope/020_fix_and_contract_change.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/000_unit.md b/devlog/_fin/260914_cost_guard_stabilization/000_unit.md similarity index 98% rename from devlog/_plan/260914_cost_guard_stabilization/000_unit.md rename to devlog/_fin/260914_cost_guard_stabilization/000_unit.md index 87c6cffe368..a14fcce0662 100644 --- a/devlog/_plan/260914_cost_guard_stabilization/000_unit.md +++ b/devlog/_fin/260914_cost_guard_stabilization/000_unit.md @@ -65,7 +65,7 @@ routing mistake into a cost event; they ship after the incident is closed. ## Relationship to #4581 -The L2 lane unit `devlog/_plan/260914_l2_pool_routing_cache/010_cache_safe_rebind.md` +The L2 lane unit `devlog/_fin/260914_l2_pool_routing_cache/010_cache_safe_rebind.md` reached the headroom floor by a different route -- keep the threshold eviction rule, constrain the destination -- and landed on `dev` as #4581 while this unit was in flight. That analysis is correct and this work **builds on it** rather than beside diff --git a/devlog/_plan/260914_cost_guard_stabilization/010_bound_binding_policy.md b/devlog/_fin/260914_cost_guard_stabilization/010_bound_binding_policy.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/010_bound_binding_policy.md rename to devlog/_fin/260914_cost_guard_stabilization/010_bound_binding_policy.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/020_backoff_preserves_binding.md b/devlog/_fin/260914_cost_guard_stabilization/020_backoff_preserves_binding.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/020_backoff_preserves_binding.md rename to devlog/_fin/260914_cost_guard_stabilization/020_backoff_preserves_binding.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/030_move_reason_evidence.md b/devlog/_fin/260914_cost_guard_stabilization/030_move_reason_evidence.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/030_move_reason_evidence.md rename to devlog/_fin/260914_cost_guard_stabilization/030_move_reason_evidence.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/040_send_budget.md b/devlog/_fin/260914_cost_guard_stabilization/040_send_budget.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/040_send_budget.md rename to devlog/_fin/260914_cost_guard_stabilization/040_send_budget.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/050_worker_isolation.md b/devlog/_fin/260914_cost_guard_stabilization/050_worker_isolation.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/050_worker_isolation.md rename to devlog/_fin/260914_cost_guard_stabilization/050_worker_isolation.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/060_quota_cache_domains.md b/devlog/_fin/260914_cost_guard_stabilization/060_quota_cache_domains.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/060_quota_cache_domains.md rename to devlog/_fin/260914_cost_guard_stabilization/060_quota_cache_domains.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/070_delivery.md b/devlog/_fin/260914_cost_guard_stabilization/070_delivery.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/070_delivery.md rename to devlog/_fin/260914_cost_guard_stabilization/070_delivery.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/080_codex_cache_reinforcement.md b/devlog/_fin/260914_cost_guard_stabilization/080_codex_cache_reinforcement.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/080_codex_cache_reinforcement.md rename to devlog/_fin/260914_cost_guard_stabilization/080_codex_cache_reinforcement.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/090_remaining_stack.md b/devlog/_fin/260914_cost_guard_stabilization/090_remaining_stack.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/090_remaining_stack.md rename to devlog/_fin/260914_cost_guard_stabilization/090_remaining_stack.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/100_dev_tip_closure_assessment.md b/devlog/_fin/260914_cost_guard_stabilization/100_dev_tip_closure_assessment.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/100_dev_tip_closure_assessment.md rename to devlog/_fin/260914_cost_guard_stabilization/100_dev_tip_closure_assessment.md diff --git a/devlog/_plan/260914_cost_guard_stabilization/110_spend_ceiling_configuration.md b/devlog/_fin/260914_cost_guard_stabilization/110_spend_ceiling_configuration.md similarity index 100% rename from devlog/_plan/260914_cost_guard_stabilization/110_spend_ceiling_configuration.md rename to devlog/_fin/260914_cost_guard_stabilization/110_spend_ceiling_configuration.md diff --git a/devlog/_plan/260914_godfile_round2/000_plan.md b/devlog/_fin/260914_godfile_round2/000_plan.md similarity index 98% rename from devlog/_plan/260914_godfile_round2/000_plan.md rename to devlog/_fin/260914_godfile_round2/000_plan.md index ffe4ed88bf2..2c323314153 100644 --- a/devlog/_plan/260914_godfile_round2/000_plan.md +++ b/devlog/_fin/260914_godfile_round2/000_plan.md @@ -14,7 +14,7 @@ | Non-goals | 기능 정책 변경, 버그 수정 동반, `tests/` 33개 분해, i18n·생성물·devlog 분해, `core.ts`·`server/index.ts`·`auth-api.ts`·`providers/registry.ts` 본체(별도 단위) | | Verifier | hosted CI. 수동 브랜치 체인의 tip PR 실행을 레인 게이트로 쓴다(DEV-STACK-08, owner 승인) | | Stop condition | 6개 사이클의 D가 모두 닫히고 레인이 `dev`에 머지될 때 | -| Memory artifact | 이 단위(`devlog/_plan/260914_godfile_round2/`)와 각 PR 본문 | +| Memory artifact | 이 단위(`devlog/_fin/260914_godfile_round2/`)와 각 PR 본문 | | Expected outcomes | 성공 = 7파일 facade화 + 래칫 녹색 / 차단 = tip CI 적색이 반복되고 원인이 분해 외부일 때 | | Escalation | tip CI가 분해와 무관한 이유로 적색이거나, 래칫 기준선이 다른 작업과 충돌할 때 | diff --git a/devlog/_plan/260914_godfile_round2/010_phase1_file_size_ratchet.md b/devlog/_fin/260914_godfile_round2/010_phase1_file_size_ratchet.md similarity index 99% rename from devlog/_plan/260914_godfile_round2/010_phase1_file_size_ratchet.md rename to devlog/_fin/260914_godfile_round2/010_phase1_file_size_ratchet.md index c073f95f795..f48eef637dc 100644 --- a/devlog/_plan/260914_godfile_round2/010_phase1_file_size_ratchet.md +++ b/devlog/_fin/260914_godfile_round2/010_phase1_file_size_ratchet.md @@ -638,7 +638,7 @@ describe("file-size ratchet: scan filter", () => { // Prefix and exact exclusions. gui/dist without a trailing slash is listed // in the contract alongside gui/dist/ children. - expect(isScannedPath("devlog/_plan/260914_godfile_round2/010.md")).toBe(false); + expect(isScannedPath("devlog/_fin/260914_godfile_round2/010.md")).toBe(false); expect(isScannedPath("assets/banner.png")).toBe(false); expect(isScannedPath("docs-site/public/favicon.png")).toBe(false); expect(isScannedPath("docs-site/src/assets/og.png")).toBe(false); diff --git a/devlog/_plan/260914_godfile_round2/020_phase2_state_and_shim.md b/devlog/_fin/260914_godfile_round2/020_phase2_state_and_shim.md similarity index 100% rename from devlog/_plan/260914_godfile_round2/020_phase2_state_and_shim.md rename to devlog/_fin/260914_godfile_round2/020_phase2_state_and_shim.md diff --git a/devlog/_plan/260914_godfile_round2/030_phase3_inject_and_catalog_sync.md b/devlog/_fin/260914_godfile_round2/030_phase3_inject_and_catalog_sync.md similarity index 100% rename from devlog/_plan/260914_godfile_round2/030_phase3_inject_and_catalog_sync.md rename to devlog/_fin/260914_godfile_round2/030_phase3_inject_and_catalog_sync.md diff --git a/devlog/_plan/260914_godfile_round2/040_phase4_routing_and_quota.md b/devlog/_fin/260914_godfile_round2/040_phase4_routing_and_quota.md similarity index 100% rename from devlog/_plan/260914_godfile_round2/040_phase4_routing_and_quota.md rename to devlog/_fin/260914_godfile_round2/040_phase4_routing_and_quota.md diff --git a/devlog/_plan/260914_godfile_round2/050_phase5_config.md b/devlog/_fin/260914_godfile_round2/050_phase5_config.md similarity index 100% rename from devlog/_plan/260914_godfile_round2/050_phase5_config.md rename to devlog/_fin/260914_godfile_round2/050_phase5_config.md diff --git a/devlog/_plan/260914_l2_pool_routing_cache/000_unit.md b/devlog/_fin/260914_l2_pool_routing_cache/000_unit.md similarity index 100% rename from devlog/_plan/260914_l2_pool_routing_cache/000_unit.md rename to devlog/_fin/260914_l2_pool_routing_cache/000_unit.md diff --git a/devlog/_plan/260914_l2_pool_routing_cache/010_cache_safe_rebind.md b/devlog/_fin/260914_l2_pool_routing_cache/010_cache_safe_rebind.md similarity index 100% rename from devlog/_plan/260914_l2_pool_routing_cache/010_cache_safe_rebind.md rename to devlog/_fin/260914_l2_pool_routing_cache/010_cache_safe_rebind.md diff --git a/devlog/_plan/260914_l2_pool_routing_cache/020_routing_adoption.md b/devlog/_fin/260914_l2_pool_routing_cache/020_routing_adoption.md similarity index 100% rename from devlog/_plan/260914_l2_pool_routing_cache/020_routing_adoption.md rename to devlog/_fin/260914_l2_pool_routing_cache/020_routing_adoption.md diff --git a/devlog/_plan/260914_l2_pool_routing_cache/030_delivery.md b/devlog/_fin/260914_l2_pool_routing_cache/030_delivery.md similarity index 100% rename from devlog/_plan/260914_l2_pool_routing_cache/030_delivery.md rename to devlog/_fin/260914_l2_pool_routing_cache/030_delivery.md diff --git a/devlog/_plan/260914_l4_responses_media/010_roadmap.md b/devlog/_fin/260914_l4_responses_media/010_roadmap.md similarity index 100% rename from devlog/_plan/260914_l4_responses_media/010_roadmap.md rename to devlog/_fin/260914_l4_responses_media/010_roadmap.md diff --git a/devlog/_plan/260914_l5_provider_account_edges/000_plan.md b/devlog/_fin/260914_l5_provider_account_edges/000_plan.md similarity index 100% rename from devlog/_plan/260914_l5_provider_account_edges/000_plan.md rename to devlog/_fin/260914_l5_provider_account_edges/000_plan.md diff --git a/devlog/_plan/260914_l5_provider_account_edges/010_wp1_account_lifecycle_edges.md b/devlog/_fin/260914_l5_provider_account_edges/010_wp1_account_lifecycle_edges.md similarity index 100% rename from devlog/_plan/260914_l5_provider_account_edges/010_wp1_account_lifecycle_edges.md rename to devlog/_fin/260914_l5_provider_account_edges/010_wp1_account_lifecycle_edges.md diff --git a/devlog/_plan/260914_l7_web_search_bridge/000_plan.md b/devlog/_fin/260914_l7_web_search_bridge/000_plan.md similarity index 100% rename from devlog/_plan/260914_l7_web_search_bridge/000_plan.md rename to devlog/_fin/260914_l7_web_search_bridge/000_plan.md diff --git a/devlog/_plan/260914_l7_web_search_bridge/010_mixed_tool_continuation.md b/devlog/_fin/260914_l7_web_search_bridge/010_mixed_tool_continuation.md similarity index 100% rename from devlog/_plan/260914_l7_web_search_bridge/010_mixed_tool_continuation.md rename to devlog/_fin/260914_l7_web_search_bridge/010_mixed_tool_continuation.md diff --git a/devlog/_plan/260914_l7_web_search_bridge/020_alpha_search_fallback.md b/devlog/_fin/260914_l7_web_search_bridge/020_alpha_search_fallback.md similarity index 100% rename from devlog/_plan/260914_l7_web_search_bridge/020_alpha_search_fallback.md rename to devlog/_fin/260914_l7_web_search_bridge/020_alpha_search_fallback.md diff --git a/devlog/_plan/260914_provider_parity_stack/000_plan.md b/devlog/_fin/260914_provider_parity_stack/000_plan.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/000_plan.md rename to devlog/_fin/260914_provider_parity_stack/000_plan.md diff --git a/devlog/_plan/260914_provider_parity_stack/001_audit_evidence.md b/devlog/_fin/260914_provider_parity_stack/001_audit_evidence.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/001_audit_evidence.md rename to devlog/_fin/260914_provider_parity_stack/001_audit_evidence.md diff --git a/devlog/_plan/260914_provider_parity_stack/002_architect_dispositions.md b/devlog/_fin/260914_provider_parity_stack/002_architect_dispositions.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/002_architect_dispositions.md rename to devlog/_fin/260914_provider_parity_stack/002_architect_dispositions.md diff --git a/devlog/_plan/260914_provider_parity_stack/003_blocker_corrections.md b/devlog/_fin/260914_provider_parity_stack/003_blocker_corrections.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/003_blocker_corrections.md rename to devlog/_fin/260914_provider_parity_stack/003_blocker_corrections.md diff --git a/devlog/_plan/260914_provider_parity_stack/010_phase1_ingress_normalization.md b/devlog/_fin/260914_provider_parity_stack/010_phase1_ingress_normalization.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/010_phase1_ingress_normalization.md rename to devlog/_fin/260914_provider_parity_stack/010_phase1_ingress_normalization.md diff --git a/devlog/_plan/260914_provider_parity_stack/020_phase2_chat_responses_controls.md b/devlog/_fin/260914_provider_parity_stack/020_phase2_chat_responses_controls.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/020_phase2_chat_responses_controls.md rename to devlog/_fin/260914_provider_parity_stack/020_phase2_chat_responses_controls.md diff --git a/devlog/_plan/260914_provider_parity_stack/030_phase3_provider_wire_contracts.md b/devlog/_fin/260914_provider_parity_stack/030_phase3_provider_wire_contracts.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/030_phase3_provider_wire_contracts.md rename to devlog/_fin/260914_provider_parity_stack/030_phase3_provider_wire_contracts.md diff --git a/devlog/_plan/260914_provider_parity_stack/040_phase4_modality_fidelity.md b/devlog/_fin/260914_provider_parity_stack/040_phase4_modality_fidelity.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/040_phase4_modality_fidelity.md rename to devlog/_fin/260914_provider_parity_stack/040_phase4_modality_fidelity.md diff --git a/devlog/_plan/260914_provider_parity_stack/050_residuals.md b/devlog/_fin/260914_provider_parity_stack/050_residuals.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/050_residuals.md rename to devlog/_fin/260914_provider_parity_stack/050_residuals.md diff --git a/devlog/_plan/260914_provider_parity_stack/060_direct_media_guard.md b/devlog/_fin/260914_provider_parity_stack/060_direct_media_guard.md similarity index 100% rename from devlog/_plan/260914_provider_parity_stack/060_direct_media_guard.md rename to devlog/_fin/260914_provider_parity_stack/060_direct_media_guard.md diff --git a/devlog/_plan/260914_r2l8_catalog_autorefresh/010_roadmap.md b/devlog/_fin/260914_r2l8_catalog_autorefresh/010_roadmap.md similarity index 100% rename from devlog/_plan/260914_r2l8_catalog_autorefresh/010_roadmap.md rename to devlog/_fin/260914_r2l8_catalog_autorefresh/010_roadmap.md diff --git a/devlog/_plan/260914_r2l8_catalog_autorefresh/020_issue_3377_capability_audit.md b/devlog/_fin/260914_r2l8_catalog_autorefresh/020_issue_3377_capability_audit.md similarity index 100% rename from devlog/_plan/260914_r2l8_catalog_autorefresh/020_issue_3377_capability_audit.md rename to devlog/_fin/260914_r2l8_catalog_autorefresh/020_issue_3377_capability_audit.md diff --git a/devlog/_plan/260914_regression_audit_and_release/000_audit_and_release_plan.md b/devlog/_fin/260914_regression_audit_and_release/000_audit_and_release_plan.md similarity index 100% rename from devlog/_plan/260914_regression_audit_and_release/000_audit_and_release_plan.md rename to devlog/_fin/260914_regression_audit_and_release/000_audit_and_release_plan.md diff --git a/devlog/_plan/260914_regression_audit_and_release/010_audit_findings.md b/devlog/_fin/260914_regression_audit_and_release/010_audit_findings.md similarity index 100% rename from devlog/_plan/260914_regression_audit_and_release/010_audit_findings.md rename to devlog/_fin/260914_regression_audit_and_release/010_audit_findings.md diff --git a/devlog/_plan/260914_regression_audit_and_release/020_release_runbook.md b/devlog/_fin/260914_regression_audit_and_release/020_release_runbook.md similarity index 100% rename from devlog/_plan/260914_regression_audit_and_release/020_release_runbook.md rename to devlog/_fin/260914_regression_audit_and_release/020_release_runbook.md diff --git a/devlog/_plan/260915_2560_release_train/000_roadmap.md b/devlog/_fin/260915_2560_release_train/000_roadmap.md similarity index 100% rename from devlog/_plan/260915_2560_release_train/000_roadmap.md rename to devlog/_fin/260915_2560_release_train/000_roadmap.md diff --git a/devlog/_plan/260915_2560_release_train/010_land_4683.md b/devlog/_fin/260915_2560_release_train/010_land_4683.md similarity index 100% rename from devlog/_plan/260915_2560_release_train/010_land_4683.md rename to devlog/_fin/260915_2560_release_train/010_land_4683.md diff --git a/devlog/_plan/260915_2560_release_train/020_regression_audit.md b/devlog/_fin/260915_2560_release_train/020_regression_audit.md similarity index 100% rename from devlog/_plan/260915_2560_release_train/020_regression_audit.md rename to devlog/_fin/260915_2560_release_train/020_regression_audit.md diff --git a/devlog/_plan/260915_2560_release_train/030_release.md b/devlog/_fin/260915_2560_release_train/030_release.md similarity index 100% rename from devlog/_plan/260915_2560_release_train/030_release.md rename to devlog/_fin/260915_2560_release_train/030_release.md diff --git a/devlog/_plan/260915_2560_release_train/040_release_decision.md b/devlog/_fin/260915_2560_release_train/040_release_decision.md similarity index 100% rename from devlog/_plan/260915_2560_release_train/040_release_decision.md rename to devlog/_fin/260915_2560_release_train/040_release_decision.md diff --git a/devlog/_plan/260915_godfile_round3/000_plan.md b/devlog/_fin/260915_godfile_round3/000_plan.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/000_plan.md rename to devlog/_fin/260915_godfile_round3/000_plan.md diff --git a/devlog/_plan/260915_godfile_round3/010_phase1_config.md b/devlog/_fin/260915_godfile_round3/010_phase1_config.md similarity index 97% rename from devlog/_plan/260915_godfile_round3/010_phase1_config.md rename to devlog/_fin/260915_godfile_round3/010_phase1_config.md index 5690230a157..0ebaf4ae601 100644 --- a/devlog/_plan/260915_godfile_round3/010_phase1_config.md +++ b/devlog/_fin/260915_godfile_round3/010_phase1_config.md @@ -1,6 +1,6 @@ # 010 — src/config.ts 파사드 분해 (260914 050 대체 최신판) -src/config.ts 4,799줄(기준 트리 ce0ac617da)이 스키마·로드 열화·salvage·잠금·치환 쓰기·라이브 재결합을 한 파일에 들고 있어 래칫 이후에도 2,000줄을 넘긴다. 이 문서는 `devlog/_plan/260914_godfile_round2/050_phase5_config.md`를 대체하는 복붙 가능한 이동 계약이다. 그 라운드가 dev에서 이 파일에 +92줄(#4546/#4624 credentialGroups)을 더했으므로 모든 원본 행 번호를 이 트리에서 다시 잡았다. 구현자는 아래 원본 행을 새 리프로 옮기고 파사드가 기존 export 이름을 그대로 다시보내며, 소비자는 import 경로를 건드리지 않는다. create-only 경로 initializePersistedConfigIfMissing와 치환 경로 saveConfig는 공용 헬퍼로 합치지 않고 잔여 파사드에 함께 남기고, 경고 메모 세 값은 warn-memo 단일 소유 모듈로 먼저 분리하며, configSchema는 키 그룹으로 쪼개지 않는다. PR 순서는 실제 의존(salvage→schema, diagnostics→salvage/load-degrade, live-reconcile→persist)을 따라 warn-memo·독립 잎 → schema → salvage+load-degrade → mutation-lock+persist-unlocked+diagnostics → live-reconcile로 고정했다. +src/config.ts 4,799줄(기준 트리 ce0ac617da)이 스키마·로드 열화·salvage·잠금·치환 쓰기·라이브 재결합을 한 파일에 들고 있어 래칫 이후에도 2,000줄을 넘긴다. 이 문서는 `devlog/_fin/260914_godfile_round2/050_phase5_config.md`를 대체하는 복붙 가능한 이동 계약이다. 그 라운드가 dev에서 이 파일에 +92줄(#4546/#4624 credentialGroups)을 더했으므로 모든 원본 행 번호를 이 트리에서 다시 잡았다. 구현자는 아래 원본 행을 새 리프로 옮기고 파사드가 기존 export 이름을 그대로 다시보내며, 소비자는 import 경로를 건드리지 않는다. create-only 경로 initializePersistedConfigIfMissing와 치환 경로 saveConfig는 공용 헬퍼로 합치지 않고 잔여 파사드에 함께 남기고, 경고 메모 세 값은 warn-memo 단일 소유 모듈로 먼저 분리하며, configSchema는 키 그룹으로 쪼개지 않는다. PR 순서는 실제 의존(salvage→schema, diagnostics→salvage/load-degrade, live-reconcile→persist)을 따라 warn-memo·독립 잎 → schema → salvage+load-degrade → mutation-lock+persist-unlocked+diagnostics → live-reconcile로 고정했다. > 전달 형태 정정: 이 문서가 적은 브랜치 이름과 PR 개수는 실행되지 않았다. 다섯 파일이 한 워킹트리에서 동시에 작업돼 두 개의 PR로 수렴했다. 이동 계약과 함정 항목은 그대로 실행됐다. 실제 전달은 [090_outcome.md](./090_outcome.md) 를 보라. diff --git a/devlog/_plan/260915_godfile_round3/020_phase2_providers_registry.md b/devlog/_fin/260915_godfile_round3/020_phase2_providers_registry.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/020_phase2_providers_registry.md rename to devlog/_fin/260915_godfile_round3/020_phase2_providers_registry.md diff --git a/devlog/_plan/260915_godfile_round3/030_phase3_codex_auth_api.md b/devlog/_fin/260915_godfile_round3/030_phase3_codex_auth_api.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/030_phase3_codex_auth_api.md rename to devlog/_fin/260915_godfile_round3/030_phase3_codex_auth_api.md diff --git a/devlog/_plan/260915_godfile_round3/040_phase4_catalog_provider_fetch.md b/devlog/_fin/260915_godfile_round3/040_phase4_catalog_provider_fetch.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/040_phase4_catalog_provider_fetch.md rename to devlog/_fin/260915_godfile_round3/040_phase4_catalog_provider_fetch.md diff --git a/devlog/_plan/260915_godfile_round3/050_phase5_adapters_openai_chat.md b/devlog/_fin/260915_godfile_round3/050_phase5_adapters_openai_chat.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/050_phase5_adapters_openai_chat.md rename to devlog/_fin/260915_godfile_round3/050_phase5_adapters_openai_chat.md diff --git a/devlog/_plan/260915_godfile_round3/090_outcome.md b/devlog/_fin/260915_godfile_round3/090_outcome.md similarity index 100% rename from devlog/_plan/260915_godfile_round3/090_outcome.md rename to devlog/_fin/260915_godfile_round3/090_outcome.md diff --git a/devlog/_plan/260915_godfile_round5/000_plan.md b/devlog/_fin/260915_godfile_round5/000_plan.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/000_plan.md rename to devlog/_fin/260915_godfile_round5/000_plan.md diff --git a/devlog/_plan/260915_godfile_round5/010_openai_responses.md b/devlog/_fin/260915_godfile_round5/010_openai_responses.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/010_openai_responses.md rename to devlog/_fin/260915_godfile_round5/010_openai_responses.md diff --git a/devlog/_plan/260915_godfile_round5/020_bridge.md b/devlog/_fin/260915_godfile_round5/020_bridge.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/020_bridge.md rename to devlog/_fin/260915_godfile_round5/020_bridge.md diff --git a/devlog/_plan/260915_godfile_round5/030_activation_guard.md b/devlog/_fin/260915_godfile_round5/030_activation_guard.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/030_activation_guard.md rename to devlog/_fin/260915_godfile_round5/030_activation_guard.md diff --git a/devlog/_plan/260915_godfile_round5/040_server_index.md b/devlog/_fin/260915_godfile_round5/040_server_index.md similarity index 99% rename from devlog/_plan/260915_godfile_round5/040_server_index.md rename to devlog/_fin/260915_godfile_round5/040_server_index.md index 71d58bcad36..3e0e8938fd0 100644 --- a/devlog/_plan/260915_godfile_round5/040_server_index.md +++ b/devlog/_fin/260915_godfile_round5/040_server_index.md @@ -184,5 +184,5 @@ sed -n '<구간>p' src/server/index.ts # 1-91, 92-101, 199-266, 267-296, 338-3 sed -n '1481,3220p' src/server/index.ts | rg -o -w '' | sort | uniq -c # serveOptions 캡처 sed -n '2976,3219p' src/server/index.ts | rg -o -w '<동일 목록>' | sort | uniq -c # websocket 캡처 sed -n '1481,3220p' src/server/index.ts | rg -n -w 'server' # 라이브 바인딩 위치 -ls src/server/ ; ls -la devlog/_plan/260915_godfile_round5/ +ls src/server/ ; ls -la devlog/_fin/260915_godfile_round5/ ``` diff --git a/devlog/_plan/260915_godfile_round5/050_stack_and_gates.md b/devlog/_fin/260915_godfile_round5/050_stack_and_gates.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/050_stack_and_gates.md rename to devlog/_fin/260915_godfile_round5/050_stack_and_gates.md diff --git a/devlog/_plan/260915_godfile_round5/060_audit_record.md b/devlog/_fin/260915_godfile_round5/060_audit_record.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/060_audit_record.md rename to devlog/_fin/260915_godfile_round5/060_audit_record.md diff --git a/devlog/_plan/260915_godfile_round5/061_server_index_outcome.md b/devlog/_fin/260915_godfile_round5/061_server_index_outcome.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/061_server_index_outcome.md rename to devlog/_fin/260915_godfile_round5/061_server_index_outcome.md diff --git a/devlog/_plan/260915_godfile_round5/070_core_outcome.md b/devlog/_fin/260915_godfile_round5/070_core_outcome.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/070_core_outcome.md rename to devlog/_fin/260915_godfile_round5/070_core_outcome.md diff --git a/devlog/_plan/260915_godfile_round5/080_round_outcome.md b/devlog/_fin/260915_godfile_round5/080_round_outcome.md similarity index 100% rename from devlog/_plan/260915_godfile_round5/080_round_outcome.md rename to devlog/_fin/260915_godfile_round5/080_round_outcome.md diff --git a/devlog/_plan/260915_workflow_budget_window/000_unit.md b/devlog/_fin/260915_workflow_budget_window/000_unit.md similarity index 100% rename from devlog/_plan/260915_workflow_budget_window/000_unit.md rename to devlog/_fin/260915_workflow_budget_window/000_unit.md diff --git a/devlog/_plan/260915_workflow_budget_window/010_windowed_ceilings.md b/devlog/_fin/260915_workflow_budget_window/010_windowed_ceilings.md similarity index 100% rename from devlog/_plan/260915_workflow_budget_window/010_windowed_ceilings.md rename to devlog/_fin/260915_workflow_budget_window/010_windowed_ceilings.md diff --git a/devlog/_plan/260915_workflow_budget_window/020_legible_refusal.md b/devlog/_fin/260915_workflow_budget_window/020_legible_refusal.md similarity index 100% rename from devlog/_plan/260915_workflow_budget_window/020_legible_refusal.md rename to devlog/_fin/260915_workflow_budget_window/020_legible_refusal.md diff --git a/devlog/_plan/260915_workflow_budget_window/030_wfc_diff_plan.md b/devlog/_fin/260915_workflow_budget_window/030_wfc_diff_plan.md similarity index 100% rename from devlog/_plan/260915_workflow_budget_window/030_wfc_diff_plan.md rename to devlog/_fin/260915_workflow_budget_window/030_wfc_diff_plan.md diff --git a/devlog/_plan/260916_cursor_http2_toolcall/000_plan.md b/devlog/_fin/260916_cursor_http2_toolcall/000_plan.md similarity index 100% rename from devlog/_plan/260916_cursor_http2_toolcall/000_plan.md rename to devlog/_fin/260916_cursor_http2_toolcall/000_plan.md diff --git a/devlog/_plan/260916_cursor_http2_toolcall/010_phase1_text_toolcall_quarantine.md b/devlog/_fin/260916_cursor_http2_toolcall/010_phase1_text_toolcall_quarantine.md similarity index 100% rename from devlog/_plan/260916_cursor_http2_toolcall/010_phase1_text_toolcall_quarantine.md rename to devlog/_fin/260916_cursor_http2_toolcall/010_phase1_text_toolcall_quarantine.md diff --git a/devlog/_plan/260916_cursor_http2_toolcall/020_phase2_observed_max_tokens.md b/devlog/_fin/260916_cursor_http2_toolcall/020_phase2_observed_max_tokens.md similarity index 100% rename from devlog/_plan/260916_cursor_http2_toolcall/020_phase2_observed_max_tokens.md rename to devlog/_fin/260916_cursor_http2_toolcall/020_phase2_observed_max_tokens.md diff --git a/devlog/_plan/260916_release_2570_stabilization/031_openai_tiers_split.md b/devlog/_fin/260916_release_2570_stabilization/031_openai_tiers_split.md similarity index 100% rename from devlog/_plan/260916_release_2570_stabilization/031_openai_tiers_split.md rename to devlog/_fin/260916_release_2570_stabilization/031_openai_tiers_split.md diff --git a/devlog/_plan/260916_release_2570_stabilization/041_preview_fence_test_is_structural.md b/devlog/_fin/260916_release_2570_stabilization/041_preview_fence_test_is_structural.md similarity index 100% rename from devlog/_plan/260916_release_2570_stabilization/041_preview_fence_test_is_structural.md rename to devlog/_fin/260916_release_2570_stabilization/041_preview_fence_test_is_structural.md diff --git a/devlog/_plan/260917_2570_release_train/000_roadmap.md b/devlog/_fin/260917_2570_release_train/000_roadmap.md similarity index 100% rename from devlog/_plan/260917_2570_release_train/000_roadmap.md rename to devlog/_fin/260917_2570_release_train/000_roadmap.md diff --git a/devlog/_plan/260917_2570_release_train/010_dev_green.md b/devlog/_fin/260917_2570_release_train/010_dev_green.md similarity index 100% rename from devlog/_plan/260917_2570_release_train/010_dev_green.md rename to devlog/_fin/260917_2570_release_train/010_dev_green.md diff --git a/devlog/_plan/260917_2570_release_train/020_pr_triage.md b/devlog/_fin/260917_2570_release_train/020_pr_triage.md similarity index 100% rename from devlog/_plan/260917_2570_release_train/020_pr_triage.md rename to devlog/_fin/260917_2570_release_train/020_pr_triage.md diff --git a/devlog/_plan/260917_2570_release_train/030_issue_triage.md b/devlog/_fin/260917_2570_release_train/030_issue_triage.md similarity index 100% rename from devlog/_plan/260917_2570_release_train/030_issue_triage.md rename to devlog/_fin/260917_2570_release_train/030_issue_triage.md diff --git a/devlog/_plan/260917_2570_release_train/040_release.md b/devlog/_fin/260917_2570_release_train/040_release.md similarity index 100% rename from devlog/_plan/260917_2570_release_train/040_release.md rename to devlog/_fin/260917_2570_release_train/040_release.md diff --git a/devlog/_plan/260917_devin_input_ceiling/000_review.md b/devlog/_fin/260917_devin_input_ceiling/000_review.md similarity index 100% rename from devlog/_plan/260917_devin_input_ceiling/000_review.md rename to devlog/_fin/260917_devin_input_ceiling/000_review.md diff --git a/devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/000_master_plan.md b/devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/000_master_plan.md similarity index 100% rename from devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/000_master_plan.md rename to devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/000_master_plan.md diff --git a/devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/010_issue_4850_preview_pool_eligibility_fence.md b/devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/010_issue_4850_preview_pool_eligibility_fence.md similarity index 100% rename from devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/010_issue_4850_preview_pool_eligibility_fence.md rename to devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/010_issue_4850_preview_pool_eligibility_fence.md diff --git a/devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/020_pr_4873_dependency_audit_review.md b/devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/020_pr_4873_dependency_audit_review.md similarity index 100% rename from devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/020_pr_4873_dependency_audit_review.md rename to devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/020_pr_4873_dependency_audit_review.md diff --git a/devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/030_unit_c_docs_site_build_gate.md b/devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/030_unit_c_docs_site_build_gate.md similarity index 100% rename from devlog/_plan/260917_l1_preview_read_fence_and_dep_audit/030_unit_c_docs_site_build_gate.md rename to devlog/_fin/260917_l1_preview_read_fence_and_dep_audit/030_unit_c_docs_site_build_gate.md diff --git a/devlog/_plan/260917_l2_safe_teardown/000_master_plan.md b/devlog/_fin/260917_l2_safe_teardown/000_master_plan.md similarity index 98% rename from devlog/_plan/260917_l2_safe_teardown/000_master_plan.md rename to devlog/_fin/260917_l2_safe_teardown/000_master_plan.md index 1c39d9be975..76738e7b633 100644 --- a/devlog/_plan/260917_l2_safe_teardown/000_master_plan.md +++ b/devlog/_fin/260917_l2_safe_teardown/000_master_plan.md @@ -123,7 +123,7 @@ Child (#4809): ## Prior art in this repository -`devlog/_plan/260914_codex_history_preflight_scope/` narrowed the same guard +`devlog/_fin/260914_codex_history_preflight_scope/` narrowed the same guard on the apply direction and explicitly left this open: > "The uninstall deadlock on an already-paginated home remains open follow-up; diff --git a/devlog/_plan/260917_l2_safe_teardown/010_upstream_resolution_facts.md b/devlog/_fin/260917_l2_safe_teardown/010_upstream_resolution_facts.md similarity index 100% rename from devlog/_plan/260917_l2_safe_teardown/010_upstream_resolution_facts.md rename to devlog/_fin/260917_l2_safe_teardown/010_upstream_resolution_facts.md diff --git a/devlog/_plan/260917_l2_safe_teardown/020_issue_4812_contract.md b/devlog/_fin/260917_l2_safe_teardown/020_issue_4812_contract.md similarity index 100% rename from devlog/_plan/260917_l2_safe_teardown/020_issue_4812_contract.md rename to devlog/_fin/260917_l2_safe_teardown/020_issue_4812_contract.md diff --git a/devlog/_plan/260917_l2_safe_teardown/030_issue_4809_contract.md b/devlog/_fin/260917_l2_safe_teardown/030_issue_4809_contract.md similarity index 100% rename from devlog/_plan/260917_l2_safe_teardown/030_issue_4809_contract.md rename to devlog/_fin/260917_l2_safe_teardown/030_issue_4809_contract.md diff --git a/devlog/_plan/260917_l2_safe_teardown/040_verification.md b/devlog/_fin/260917_l2_safe_teardown/040_verification.md similarity index 100% rename from devlog/_plan/260917_l2_safe_teardown/040_verification.md rename to devlog/_fin/260917_l2_safe_teardown/040_verification.md diff --git a/devlog/_plan/260917_l3_retry_budget_admission/000_roadmap.md b/devlog/_fin/260917_l3_retry_budget_admission/000_roadmap.md similarity index 100% rename from devlog/_plan/260917_l3_retry_budget_admission/000_roadmap.md rename to devlog/_fin/260917_l3_retry_budget_admission/000_roadmap.md diff --git a/devlog/_plan/260917_l3_retry_budget_admission/010_admission_audit.md b/devlog/_fin/260917_l3_retry_budget_admission/010_admission_audit.md similarity index 100% rename from devlog/_plan/260917_l3_retry_budget_admission/010_admission_audit.md rename to devlog/_fin/260917_l3_retry_budget_admission/010_admission_audit.md diff --git a/devlog/_plan/260917_l3_retry_budget_admission/020_independent_review.md b/devlog/_fin/260917_l3_retry_budget_admission/020_independent_review.md similarity index 100% rename from devlog/_plan/260917_l3_retry_budget_admission/020_independent_review.md rename to devlog/_fin/260917_l3_retry_budget_admission/020_independent_review.md diff --git a/devlog/_plan/260917_l4_responses_private_fields_and_history/010_roadmap.md b/devlog/_fin/260917_l4_responses_private_fields_and_history/010_roadmap.md similarity index 100% rename from devlog/_plan/260917_l4_responses_private_fields_and_history/010_roadmap.md rename to devlog/_fin/260917_l4_responses_private_fields_and_history/010_roadmap.md diff --git a/devlog/_plan/260917_l5_cursor_stabilization/000_roadmap.md b/devlog/_fin/260917_l5_cursor_stabilization/000_roadmap.md similarity index 100% rename from devlog/_plan/260917_l5_cursor_stabilization/000_roadmap.md rename to devlog/_fin/260917_l5_cursor_stabilization/000_roadmap.md diff --git a/devlog/_plan/260917_l5_cursor_stabilization/010_u1_text_toolcall_contract.md b/devlog/_fin/260917_l5_cursor_stabilization/010_u1_text_toolcall_contract.md similarity index 100% rename from devlog/_plan/260917_l5_cursor_stabilization/010_u1_text_toolcall_contract.md rename to devlog/_fin/260917_l5_cursor_stabilization/010_u1_text_toolcall_contract.md diff --git a/devlog/_plan/260917_l5_cursor_stabilization/020_u2_observed_window_scope.md b/devlog/_fin/260917_l5_cursor_stabilization/020_u2_observed_window_scope.md similarity index 100% rename from devlog/_plan/260917_l5_cursor_stabilization/020_u2_observed_window_scope.md rename to devlog/_fin/260917_l5_cursor_stabilization/020_u2_observed_window_scope.md diff --git a/devlog/_plan/260917_l5_cursor_stabilization/030_u3_remint_isolation_and_budget.md b/devlog/_fin/260917_l5_cursor_stabilization/030_u3_remint_isolation_and_budget.md similarity index 100% rename from devlog/_plan/260917_l5_cursor_stabilization/030_u3_remint_isolation_and_budget.md rename to devlog/_fin/260917_l5_cursor_stabilization/030_u3_remint_isolation_and_budget.md diff --git a/devlog/_plan/260917_l5_cursor_stabilization/040_u4_codebuddy_bare_tool_names.md b/devlog/_fin/260917_l5_cursor_stabilization/040_u4_codebuddy_bare_tool_names.md similarity index 100% rename from devlog/_plan/260917_l5_cursor_stabilization/040_u4_codebuddy_bare_tool_names.md rename to devlog/_fin/260917_l5_cursor_stabilization/040_u4_codebuddy_bare_tool_names.md diff --git a/devlog/_plan/260917_l6_contract_quality_fixes/000_master_plan.md b/devlog/_fin/260917_l6_contract_quality_fixes/000_master_plan.md similarity index 100% rename from devlog/_plan/260917_l6_contract_quality_fixes/000_master_plan.md rename to devlog/_fin/260917_l6_contract_quality_fixes/000_master_plan.md diff --git a/devlog/_plan/260917_l6_contract_quality_fixes/010_4855_terminal_stop_classification.md b/devlog/_fin/260917_l6_contract_quality_fixes/010_4855_terminal_stop_classification.md similarity index 100% rename from devlog/_plan/260917_l6_contract_quality_fixes/010_4855_terminal_stop_classification.md rename to devlog/_fin/260917_l6_contract_quality_fixes/010_4855_terminal_stop_classification.md diff --git a/devlog/_plan/260917_l6_contract_quality_fixes/020_4822_zai_model_discovery.md b/devlog/_fin/260917_l6_contract_quality_fixes/020_4822_zai_model_discovery.md similarity index 100% rename from devlog/_plan/260917_l6_contract_quality_fixes/020_4822_zai_model_discovery.md rename to devlog/_fin/260917_l6_contract_quality_fixes/020_4822_zai_model_discovery.md diff --git a/devlog/_plan/260917_l6_contract_quality_fixes/030_carried_catalog_and_gui_prs.md b/devlog/_fin/260917_l6_contract_quality_fixes/030_carried_catalog_and_gui_prs.md similarity index 100% rename from devlog/_plan/260917_l6_contract_quality_fixes/030_carried_catalog_and_gui_prs.md rename to devlog/_fin/260917_l6_contract_quality_fixes/030_carried_catalog_and_gui_prs.md diff --git a/devlog/_plan/260917_l6_contract_quality_fixes/040_4857_first_frame_usage_contract.md b/devlog/_fin/260917_l6_contract_quality_fixes/040_4857_first_frame_usage_contract.md similarity index 100% rename from devlog/_plan/260917_l6_contract_quality_fixes/040_4857_first_frame_usage_contract.md rename to devlog/_fin/260917_l6_contract_quality_fixes/040_4857_first_frame_usage_contract.md diff --git a/devlog/_plan/260917_l7_native_control_stack_audit/000_plan.md b/devlog/_fin/260917_l7_native_control_stack_audit/000_plan.md similarity index 96% rename from devlog/_plan/260917_l7_native_control_stack_audit/000_plan.md rename to devlog/_fin/260917_l7_native_control_stack_audit/000_plan.md index 74fb88be8a1..51b66a9c527 100644 --- a/devlog/_plan/260917_l7_native_control_stack_audit/000_plan.md +++ b/devlog/_fin/260917_l7_native_control_stack_audit/000_plan.md @@ -26,7 +26,7 @@ rebased or reimplemented here. ## Write scope -`devlog/_plan/260917_l7_native_control_stack_audit/` only. No `src/`, no +`devlog/_fin/260917_l7_native_control_stack_audit/` only. No `src/`, no `tests/`, no `structure/`, no `docs-site/`. The four audited branches are read through `git show` and `git diff` against fetched `refs/pull/*/head`; nothing in this branch touches them. diff --git a/devlog/_plan/260917_l7_native_control_stack_audit/010_stage_diffs.md b/devlog/_fin/260917_l7_native_control_stack_audit/010_stage_diffs.md similarity index 100% rename from devlog/_plan/260917_l7_native_control_stack_audit/010_stage_diffs.md rename to devlog/_fin/260917_l7_native_control_stack_audit/010_stage_diffs.md diff --git a/devlog/_plan/260917_l7_native_control_stack_audit/020_integration_contract.md b/devlog/_fin/260917_l7_native_control_stack_audit/020_integration_contract.md similarity index 100% rename from devlog/_plan/260917_l7_native_control_stack_audit/020_integration_contract.md rename to devlog/_fin/260917_l7_native_control_stack_audit/020_integration_contract.md diff --git a/devlog/_plan/260917_l7_native_control_stack_audit/030_l1_precondition.md b/devlog/_fin/260917_l7_native_control_stack_audit/030_l1_precondition.md similarity index 100% rename from devlog/_plan/260917_l7_native_control_stack_audit/030_l1_precondition.md rename to devlog/_fin/260917_l7_native_control_stack_audit/030_l1_precondition.md diff --git a/devlog/_plan/260917_l7_native_control_stack_audit/040_activation_decision.md b/devlog/_fin/260917_l7_native_control_stack_audit/040_activation_decision.md similarity index 100% rename from devlog/_plan/260917_l7_native_control_stack_audit/040_activation_decision.md rename to devlog/_fin/260917_l7_native_control_stack_audit/040_activation_decision.md diff --git a/devlog/_plan/260918_2580_release_train/000_roadmap.md b/devlog/_fin/260918_2580_release_train/000_roadmap.md similarity index 100% rename from devlog/_plan/260918_2580_release_train/000_roadmap.md rename to devlog/_fin/260918_2580_release_train/000_roadmap.md diff --git a/devlog/_plan/260918_2580_release_train/040_release.md b/devlog/_fin/260918_2580_release_train/040_release.md similarity index 100% rename from devlog/_plan/260918_2580_release_train/040_release.md rename to devlog/_fin/260918_2580_release_train/040_release.md diff --git a/devlog/_plan/260918_lane_a_bug_train/010_roadmap.md b/devlog/_fin/260918_lane_a_bug_train/010_roadmap.md similarity index 100% rename from devlog/_plan/260918_lane_a_bug_train/010_roadmap.md rename to devlog/_fin/260918_lane_a_bug_train/010_roadmap.md diff --git a/devlog/_plan/260918_lane_a_bug_train/030_transient_passthrough_policy.md b/devlog/_fin/260918_lane_a_bug_train/030_transient_passthrough_policy.md similarity index 100% rename from devlog/_plan/260918_lane_a_bug_train/030_transient_passthrough_policy.md rename to devlog/_fin/260918_lane_a_bug_train/030_transient_passthrough_policy.md diff --git a/devlog/_plan/260918_lane_a_bug_train/040_combo_response_format.md b/devlog/_fin/260918_lane_a_bug_train/040_combo_response_format.md similarity index 100% rename from devlog/_plan/260918_lane_a_bug_train/040_combo_response_format.md rename to devlog/_fin/260918_lane_a_bug_train/040_combo_response_format.md diff --git a/devlog/_plan/260918_lane_a_bug_train/041_combo_response_format_second_vendor.md b/devlog/_fin/260918_lane_a_bug_train/041_combo_response_format_second_vendor.md similarity index 100% rename from devlog/_plan/260918_lane_a_bug_train/041_combo_response_format_second_vendor.md rename to devlog/_fin/260918_lane_a_bug_train/041_combo_response_format_second_vendor.md diff --git a/devlog/_plan/260918_lane_a_bug_train/050_cohort_pool_affinity.md b/devlog/_fin/260918_lane_a_bug_train/050_cohort_pool_affinity.md similarity index 100% rename from devlog/_plan/260918_lane_a_bug_train/050_cohort_pool_affinity.md rename to devlog/_fin/260918_lane_a_bug_train/050_cohort_pool_affinity.md diff --git a/devlog/_plan/260918_lane_b_provider_reliability/000_roadmap.md b/devlog/_fin/260918_lane_b_provider_reliability/000_roadmap.md similarity index 100% rename from devlog/_plan/260918_lane_b_provider_reliability/000_roadmap.md rename to devlog/_fin/260918_lane_b_provider_reliability/000_roadmap.md diff --git a/devlog/_plan/260918_ld_search_bridge_and_thinking_replay/010_roadmap.md b/devlog/_fin/260918_ld_search_bridge_and_thinking_replay/010_roadmap.md similarity index 100% rename from devlog/_plan/260918_ld_search_bridge_and_thinking_replay/010_roadmap.md rename to devlog/_fin/260918_ld_search_bridge_and_thinking_replay/010_roadmap.md diff --git a/devlog/_plan/260918_ld_search_bridge_and_thinking_replay/020_closure_evidence.md b/devlog/_fin/260918_ld_search_bridge_and_thinking_replay/020_closure_evidence.md similarity index 100% rename from devlog/_plan/260918_ld_search_bridge_and_thinking_replay/020_closure_evidence.md rename to devlog/_fin/260918_ld_search_bridge_and_thinking_replay/020_closure_evidence.md diff --git a/devlog/_plan/260919_5008_antigravity_turn_ordering/000_upstream_contract_evidence.md b/devlog/_fin/260919_5008_antigravity_turn_ordering/000_upstream_contract_evidence.md similarity index 100% rename from devlog/_plan/260919_5008_antigravity_turn_ordering/000_upstream_contract_evidence.md rename to devlog/_fin/260919_5008_antigravity_turn_ordering/000_upstream_contract_evidence.md diff --git a/devlog/_fin/260919_contract_resolution/001_status.md b/devlog/_fin/260919_contract_resolution/001_status.md index 454a1b4be0f..5c5b339860b 100644 --- a/devlog/_fin/260919_contract_resolution/001_status.md +++ b/devlog/_fin/260919_contract_resolution/001_status.md @@ -1,6 +1,6 @@ # Campaign status -Status: IMPLEMENTATION COMPLETE. The active regression and release follow-up is tracked in [its separate open unit](../../_plan/260920_regression_release/000_scope.md). All sixteen original implementation issues are now closed. Final dashboard #5197 landed as `ed44e04a933f6d4d62d2e049bf7606f08d347b06`; #5118 was closed after ancestry/tree checks and current source/fixture evidence. The owner explicitly requested immediate integration while macOS verification remained unfinished, and that timing exception is recorded on the PR. No full-platform pass is claimed for that incomplete run. Complete hosted regression, main/preview promotion, release publication and post-publication verification remain outstanding. Two non-blocking review observations are retained for follow-up. The heartbeat remains active. +Status: IMPLEMENTATION COMPLETE. The active regression and release follow-up is tracked in [its separate open unit](../../_fin/260920_regression_release/000_scope.md). All sixteen original implementation issues are now closed. Final dashboard #5197 landed as `ed44e04a933f6d4d62d2e049bf7606f08d347b06`; #5118 was closed after ancestry/tree checks and current source/fixture evidence. The owner explicitly requested immediate integration while macOS verification remained unfinished, and that timing exception is recorded on the PR. No full-platform pass is claimed for that incomplete run. Complete hosted regression, main/preview promotion, release publication and post-publication verification remain outstanding. Two non-blocking review observations are retained for follow-up. The heartbeat remains active. ## Owners diff --git a/devlog/_fin/260919_contract_resolution/042_release_followup_authorization.md b/devlog/_fin/260919_contract_resolution/042_release_followup_authorization.md index b7f1ea71313..d62ca2065e6 100644 --- a/devlog/_fin/260919_contract_resolution/042_release_followup_authorization.md +++ b/devlog/_fin/260919_contract_resolution/042_release_followup_authorization.md @@ -14,6 +14,6 @@ Request-time branch references: The immutable `main` baseline preserves the requested regression scope even if another authorized integration later advances a branch. The final target is captured after the campaign lands; no missing change may be dropped merely by choosing a newer comparison base. -At authorization time, the current work phase still needed to finish #5118 and its acceptance evidence. That implementation prerequisite is now complete; the still-open release work is tracked in [the separate plan unit](../../_plan/260920_regression_release/000_scope.md). After that cycle closes, the next Plan phase must inspect the current release authority, versions, branch ancestry and workflow inputs; write the complete regression/promotion/release plan; and register its remaining criteria before execution. Do not infer a release version or dist-tag before that inspection. Use the repository's required version ordering and promotion sequence. +At authorization time, the current work phase still needed to finish #5118 and its acceptance evidence. That implementation prerequisite is now complete; the still-open release work is tracked in [the separate plan unit](../../_fin/260920_regression_release/000_scope.md). After that cycle closes, the next Plan phase must inspect the current release authority, versions, branch ancestry and workflow inputs; write the complete regression/promotion/release plan; and register its remaining criteria before execution. Do not infer a release version or dist-tag before that inspection. Use the repository's required version ordering and promotion sequence. Completion of the expanded request requires all original issue evidence plus the full regression result, verified `main`/`preview` promotions, release publication and post-publication evidence for the actual released version and commit. Keep those claims separate. The host goal must not complete at sixteen issue closures alone. Retain the heartbeat for the handoff and stop it only once all authorized follow-up work is verified. diff --git a/devlog/_fin/260919_contract_resolution/043_implementation_handoff.md b/devlog/_fin/260919_contract_resolution/043_implementation_handoff.md index bc41cf59f51..2b938d2072a 100644 --- a/devlog/_fin/260919_contract_resolution/043_implementation_handoff.md +++ b/devlog/_fin/260919_contract_resolution/043_implementation_handoff.md @@ -19,4 +19,4 @@ Use the request-time main baseline134c92a01b120162f00c7275189cc47858720379 throu Later verification: run35483995896 attempt1 completed SUCCESS at source278513a79e, including all event-applicable jobs and both macOS shards. The earlier integration timing exception remains a historical fact; the formerly pending source-PR platform checks are now complete. Full main-through-candidate regression, promotion and release remain separate follow-up work. -The still-open follow-up lives in [the regression and release unit](../../_plan/260920_regression_release/000_scope.md); this archive contains only the completed implementation record and its handoff. +The still-open follow-up lives in [the regression and release unit](../../_fin/260920_regression_release/000_scope.md); this archive contains only the completed implementation record and its handoff. diff --git a/devlog/_plan/260920_desktop_app_stabilization/000_local_build.md b/devlog/_fin/260920_desktop_app_stabilization/000_local_build.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/000_local_build.md rename to devlog/_fin/260920_desktop_app_stabilization/000_local_build.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/010_roadmap.md b/devlog/_fin/260920_desktop_app_stabilization/010_roadmap.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/010_roadmap.md rename to devlog/_fin/260920_desktop_app_stabilization/010_roadmap.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/011_acceptance.md b/devlog/_fin/260920_desktop_app_stabilization/011_acceptance.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/011_acceptance.md rename to devlog/_fin/260920_desktop_app_stabilization/011_acceptance.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/020_build_state_guards.md b/devlog/_fin/260920_desktop_app_stabilization/020_build_state_guards.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/020_build_state_guards.md rename to devlog/_fin/260920_desktop_app_stabilization/020_build_state_guards.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/030_icons_and_widget.md b/devlog/_fin/260920_desktop_app_stabilization/030_icons_and_widget.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/030_icons_and_widget.md rename to devlog/_fin/260920_desktop_app_stabilization/030_icons_and_widget.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/040_widget_never_offered.md b/devlog/_fin/260920_desktop_app_stabilization/040_widget_never_offered.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/040_widget_never_offered.md rename to devlog/_fin/260920_desktop_app_stabilization/040_widget_never_offered.md diff --git a/devlog/_plan/260920_desktop_app_stabilization/050_landing.md b/devlog/_fin/260920_desktop_app_stabilization/050_landing.md similarity index 100% rename from devlog/_plan/260920_desktop_app_stabilization/050_landing.md rename to devlog/_fin/260920_desktop_app_stabilization/050_landing.md diff --git a/devlog/_plan/260920_regression_release/000_scope.md b/devlog/_fin/260920_regression_release/000_scope.md similarity index 100% rename from devlog/_plan/260920_regression_release/000_scope.md rename to devlog/_fin/260920_regression_release/000_scope.md diff --git a/devlog/_plan/260920_regression_release/010_execution.md b/devlog/_fin/260920_regression_release/010_execution.md similarity index 100% rename from devlog/_plan/260920_regression_release/010_execution.md rename to devlog/_fin/260920_regression_release/010_execution.md diff --git a/devlog/_plan/260920_round2_followups/000_plan.md b/devlog/_fin/260920_round2_followups/000_plan.md similarity index 100% rename from devlog/_plan/260920_round2_followups/000_plan.md rename to devlog/_fin/260920_round2_followups/000_plan.md diff --git a/devlog/_plan/260920_round2_followups/010_r1_paginated_history_guard.md b/devlog/_fin/260920_round2_followups/010_r1_paginated_history_guard.md similarity index 100% rename from devlog/_plan/260920_round2_followups/010_r1_paginated_history_guard.md rename to devlog/_fin/260920_round2_followups/010_r1_paginated_history_guard.md diff --git a/devlog/_plan/260920_round2_followups/020_r2_desktop_ci.md b/devlog/_fin/260920_round2_followups/020_r2_desktop_ci.md similarity index 100% rename from devlog/_plan/260920_round2_followups/020_r2_desktop_ci.md rename to devlog/_fin/260920_round2_followups/020_r2_desktop_ci.md diff --git a/devlog/_plan/260920_round2_followups/030_lane_r3.md b/devlog/_fin/260920_round2_followups/030_lane_r3.md similarity index 100% rename from devlog/_plan/260920_round2_followups/030_lane_r3.md rename to devlog/_fin/260920_round2_followups/030_lane_r3.md diff --git a/devlog/_plan/260920_round2_followups/040_r4_retry_rework.md b/devlog/_fin/260920_round2_followups/040_r4_retry_rework.md similarity index 100% rename from devlog/_plan/260920_round2_followups/040_r4_retry_rework.md rename to devlog/_fin/260920_round2_followups/040_r4_retry_rework.md diff --git a/devlog/_plan/260920_round2_followups/050_lane_r5.md b/devlog/_fin/260920_round2_followups/050_lane_r5.md similarity index 99% rename from devlog/_plan/260920_round2_followups/050_lane_r5.md rename to devlog/_fin/260920_round2_followups/050_lane_r5.md index 7343408d0cf..e666cf2f3e9 100644 --- a/devlog/_plan/260920_round2_followups/050_lane_r5.md +++ b/devlog/_fin/260920_round2_followups/050_lane_r5.md @@ -4,7 +4,7 @@ Status: OPEN. Branch `codex/260920-r5-telemetry-derived`, rebased onto `dev` aft advanced mid-lane. One branch, ordered commits, one pull request to `dev`. Lane C deferred #2366, #3748, #3983 and #5063 "as implemented", because each adds a parallel store -or a second emission path. [030_lane_c2.md](../260920_meaning_preservation_batch/030_lane_c2.md) +or a second emission path. [030_lane_c2.md](../../_plan/260920_meaning_preservation_batch/030_lane_c2.md) then specified the derived form for each. This lane builds those four forms. It adds no store: the durable shapes stay `PersistedUsageAttempt` and `PersistedUsageEntry`, and every projection reads them. diff --git a/devlog/_plan/260920_round2_followups/050_r4_remainders.md b/devlog/_fin/260920_round2_followups/050_r4_remainders.md similarity index 100% rename from devlog/_plan/260920_round2_followups/050_r4_remainders.md rename to devlog/_fin/260920_round2_followups/050_r4_remainders.md diff --git a/devlog/_plan/260920_round2_followups/060_r6_usage_models_table.md b/devlog/_fin/260920_round2_followups/060_r6_usage_models_table.md similarity index 100% rename from devlog/_plan/260920_round2_followups/060_r6_usage_models_table.md rename to devlog/_fin/260920_round2_followups/060_r6_usage_models_table.md diff --git a/devlog/_plan/260920_round2_followups/070_widget_signing.md b/devlog/_fin/260920_round2_followups/070_widget_signing.md similarity index 100% rename from devlog/_plan/260920_round2_followups/070_widget_signing.md rename to devlog/_fin/260920_round2_followups/070_widget_signing.md diff --git a/devlog/_plan/260920_round2_followups/090_closeout.md b/devlog/_fin/260920_round2_followups/090_closeout.md similarity index 100% rename from devlog/_plan/260920_round2_followups/090_closeout.md rename to devlog/_fin/260920_round2_followups/090_closeout.md diff --git a/devlog/_plan/260920_round2_followups/r6-usage-table/r6-01-column-order.png b/devlog/_fin/260920_round2_followups/r6-usage-table/r6-01-column-order.png similarity index 100% rename from devlog/_plan/260920_round2_followups/r6-usage-table/r6-01-column-order.png rename to devlog/_fin/260920_round2_followups/r6-usage-table/r6-01-column-order.png diff --git a/devlog/_plan/260920_round2_followups/r6-usage-table/r6-02-pinned-scroll.png b/devlog/_fin/260920_round2_followups/r6-usage-table/r6-02-pinned-scroll.png similarity index 100% rename from devlog/_plan/260920_round2_followups/r6-usage-table/r6-02-pinned-scroll.png rename to devlog/_fin/260920_round2_followups/r6-usage-table/r6-02-pinned-scroll.png diff --git a/devlog/_plan/260920_round2_followups/r6-usage-table/r6-03-narrow-fallback.png b/devlog/_fin/260920_round2_followups/r6-usage-table/r6-03-narrow-fallback.png similarity index 100% rename from devlog/_plan/260920_round2_followups/r6-usage-table/r6-03-narrow-fallback.png rename to devlog/_fin/260920_round2_followups/r6-usage-table/r6-03-narrow-fallback.png diff --git a/devlog/_plan/260921_app_runtime_ownership/000_charter.md b/devlog/_fin/260921_app_runtime_ownership/000_charter.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/000_charter.md rename to devlog/_fin/260921_app_runtime_ownership/000_charter.md diff --git a/devlog/_plan/260921_app_runtime_ownership/010_coexistence_findings.md b/devlog/_fin/260921_app_runtime_ownership/010_coexistence_findings.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/010_coexistence_findings.md rename to devlog/_fin/260921_app_runtime_ownership/010_coexistence_findings.md diff --git a/devlog/_plan/260921_app_runtime_ownership/020_windows_linux_findings.md b/devlog/_fin/260921_app_runtime_ownership/020_windows_linux_findings.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/020_windows_linux_findings.md rename to devlog/_fin/260921_app_runtime_ownership/020_windows_linux_findings.md diff --git a/devlog/_plan/260921_app_runtime_ownership/030_contradictions.md b/devlog/_fin/260921_app_runtime_ownership/030_contradictions.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/030_contradictions.md rename to devlog/_fin/260921_app_runtime_ownership/030_contradictions.md diff --git a/devlog/_plan/260921_app_runtime_ownership/040_verification_hosts.md b/devlog/_fin/260921_app_runtime_ownership/040_verification_hosts.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/040_verification_hosts.md rename to devlog/_fin/260921_app_runtime_ownership/040_verification_hosts.md diff --git a/devlog/_plan/260921_app_runtime_ownership/050_webview_dialogs.md b/devlog/_fin/260921_app_runtime_ownership/050_webview_dialogs.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/050_webview_dialogs.md rename to devlog/_fin/260921_app_runtime_ownership/050_webview_dialogs.md diff --git a/devlog/_plan/260921_app_runtime_ownership/060_contradictions_round2.md b/devlog/_fin/260921_app_runtime_ownership/060_contradictions_round2.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/060_contradictions_round2.md rename to devlog/_fin/260921_app_runtime_ownership/060_contradictions_round2.md diff --git a/devlog/_plan/260921_app_runtime_ownership/070_decisions.md b/devlog/_fin/260921_app_runtime_ownership/070_decisions.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/070_decisions.md rename to devlog/_fin/260921_app_runtime_ownership/070_decisions.md diff --git a/devlog/_plan/260921_app_runtime_ownership/080_decisions_round2.md b/devlog/_fin/260921_app_runtime_ownership/080_decisions_round2.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/080_decisions_round2.md rename to devlog/_fin/260921_app_runtime_ownership/080_decisions_round2.md diff --git a/devlog/_plan/260921_app_runtime_ownership/090_lanes.md b/devlog/_fin/260921_app_runtime_ownership/090_lanes.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/090_lanes.md rename to devlog/_fin/260921_app_runtime_ownership/090_lanes.md diff --git a/devlog/_plan/260921_app_runtime_ownership/100_resolutions.md b/devlog/_fin/260921_app_runtime_ownership/100_resolutions.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/100_resolutions.md rename to devlog/_fin/260921_app_runtime_ownership/100_resolutions.md diff --git a/devlog/_plan/260921_app_runtime_ownership/110_reaudit.md b/devlog/_fin/260921_app_runtime_ownership/110_reaudit.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/110_reaudit.md rename to devlog/_fin/260921_app_runtime_ownership/110_reaudit.md diff --git a/devlog/_plan/260921_app_runtime_ownership/120_gate_runbook.md b/devlog/_fin/260921_app_runtime_ownership/120_gate_runbook.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/120_gate_runbook.md rename to devlog/_fin/260921_app_runtime_ownership/120_gate_runbook.md diff --git a/devlog/_plan/260921_app_runtime_ownership/120_install_verification.md b/devlog/_fin/260921_app_runtime_ownership/120_install_verification.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/120_install_verification.md rename to devlog/_fin/260921_app_runtime_ownership/120_install_verification.md diff --git a/devlog/_plan/260921_app_runtime_ownership/130_linux_surface_findings.md b/devlog/_fin/260921_app_runtime_ownership/130_linux_surface_findings.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/130_linux_surface_findings.md rename to devlog/_fin/260921_app_runtime_ownership/130_linux_surface_findings.md diff --git a/devlog/_plan/260921_app_runtime_ownership/140_tray_popup_polish.md b/devlog/_fin/260921_app_runtime_ownership/140_tray_popup_polish.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/140_tray_popup_polish.md rename to devlog/_fin/260921_app_runtime_ownership/140_tray_popup_polish.md diff --git a/devlog/_plan/260921_app_runtime_ownership/150_closeout.md b/devlog/_fin/260921_app_runtime_ownership/150_closeout.md similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/150_closeout.md rename to devlog/_fin/260921_app_runtime_ownership/150_closeout.md diff --git a/devlog/_plan/260921_app_runtime_ownership/tray-usage-popup-glass.png b/devlog/_fin/260921_app_runtime_ownership/tray-usage-popup-glass.png similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/tray-usage-popup-glass.png rename to devlog/_fin/260921_app_runtime_ownership/tray-usage-popup-glass.png diff --git a/devlog/_plan/260921_app_runtime_ownership/tray-usage-popup.png b/devlog/_fin/260921_app_runtime_ownership/tray-usage-popup.png similarity index 100% rename from devlog/_plan/260921_app_runtime_ownership/tray-usage-popup.png rename to devlog/_fin/260921_app_runtime_ownership/tray-usage-popup.png diff --git a/devlog/_plan/260922_native_tray_release/000_plan.md b/devlog/_fin/260922_native_tray_release/000_plan.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/000_plan.md rename to devlog/_fin/260922_native_tray_release/000_plan.md diff --git a/devlog/_plan/260922_native_tray_release/001_evidence.md b/devlog/_fin/260922_native_tray_release/001_evidence.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/001_evidence.md rename to devlog/_fin/260922_native_tray_release/001_evidence.md diff --git a/devlog/_plan/260922_native_tray_release/002_plan_review.md b/devlog/_fin/260922_native_tray_release/002_plan_review.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/002_plan_review.md rename to devlog/_fin/260922_native_tray_release/002_plan_review.md diff --git a/devlog/_plan/260922_native_tray_release/010_native_presentation.md b/devlog/_fin/260922_native_tray_release/010_native_presentation.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/010_native_presentation.md rename to devlog/_fin/260922_native_tray_release/010_native_presentation.md diff --git a/devlog/_plan/260922_native_tray_release/011_presentation_verification.md b/devlog/_fin/260922_native_tray_release/011_presentation_verification.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/011_presentation_verification.md rename to devlog/_fin/260922_native_tray_release/011_presentation_verification.md diff --git a/devlog/_plan/260922_native_tray_release/020_shell_integration.md b/devlog/_fin/260922_native_tray_release/020_shell_integration.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/020_shell_integration.md rename to devlog/_fin/260922_native_tray_release/020_shell_integration.md diff --git a/devlog/_plan/260922_native_tray_release/021_integration_verification.md b/devlog/_fin/260922_native_tray_release/021_integration_verification.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/021_integration_verification.md rename to devlog/_fin/260922_native_tray_release/021_integration_verification.md diff --git a/devlog/_plan/260922_native_tray_release/030_regression.md b/devlog/_fin/260922_native_tray_release/030_regression.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/030_regression.md rename to devlog/_fin/260922_native_tray_release/030_regression.md diff --git a/devlog/_plan/260922_native_tray_release/031_verification.md b/devlog/_fin/260922_native_tray_release/031_verification.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/031_verification.md rename to devlog/_fin/260922_native_tray_release/031_verification.md diff --git a/devlog/_plan/260922_native_tray_release/040_release.md b/devlog/_fin/260922_native_tray_release/040_release.md similarity index 100% rename from devlog/_plan/260922_native_tray_release/040_release.md rename to devlog/_fin/260922_native_tray_release/040_release.md diff --git a/devlog/_plan/260922_native_tray_release/evidence/native-glass-bottom.png b/devlog/_fin/260922_native_tray_release/evidence/native-glass-bottom.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/native-glass-bottom.png rename to devlog/_fin/260922_native_tray_release/evidence/native-glass-bottom.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/native-glass-top.png b/devlog/_fin/260922_native_tray_release/evidence/native-glass-top.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/native-glass-top.png rename to devlog/_fin/260922_native_tray_release/evidence/native-glass-top.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/native-panel-bottom.png b/devlog/_fin/260922_native_tray_release/evidence/native-panel-bottom.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/native-panel-bottom.png rename to devlog/_fin/260922_native_tray_release/evidence/native-panel-bottom.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/native-panel-dark.png b/devlog/_fin/260922_native_tray_release/evidence/native-panel-dark.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/native-panel-dark.png rename to devlog/_fin/260922_native_tray_release/evidence/native-panel-dark.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/native-panel-light.png b/devlog/_fin/260922_native_tray_release/evidence/native-panel-light.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/native-panel-light.png rename to devlog/_fin/260922_native_tray_release/evidence/native-panel-light.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/web-tray-opaque-bottom.png b/devlog/_fin/260922_native_tray_release/evidence/web-tray-opaque-bottom.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/web-tray-opaque-bottom.png rename to devlog/_fin/260922_native_tray_release/evidence/web-tray-opaque-bottom.png diff --git a/devlog/_plan/260922_native_tray_release/evidence/web-tray-vibrant-bottom.png b/devlog/_fin/260922_native_tray_release/evidence/web-tray-vibrant-bottom.png similarity index 100% rename from devlog/_plan/260922_native_tray_release/evidence/web-tray-vibrant-bottom.png rename to devlog/_fin/260922_native_tray_release/evidence/web-tray-vibrant-bottom.png diff --git a/devlog/_plan/260923_anthropic_fast_speed/010_plan.md b/devlog/_fin/260923_anthropic_fast_speed/010_plan.md similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/010_plan.md rename to devlog/_fin/260923_anthropic_fast_speed/010_plan.md diff --git a/devlog/_plan/260923_anthropic_fast_speed/020_probe-evidence.md b/devlog/_fin/260923_anthropic_fast_speed/020_probe-evidence.md similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/020_probe-evidence.md rename to devlog/_fin/260923_anthropic_fast_speed/020_probe-evidence.md diff --git a/devlog/_plan/260923_anthropic_fast_speed/030_reflection.md b/devlog/_fin/260923_anthropic_fast_speed/030_reflection.md similarity index 96% rename from devlog/_plan/260923_anthropic_fast_speed/030_reflection.md rename to devlog/_fin/260923_anthropic_fast_speed/030_reflection.md index a7af3f10043..01f06fd4232 100644 --- a/devlog/_plan/260923_anthropic_fast_speed/030_reflection.md +++ b/devlog/_fin/260923_anthropic_fast_speed/030_reflection.md @@ -1,6 +1,6 @@ # Reflection: Anthropic Fast D5 dispatch fallback -**Verdict: FAIL as written; NEAR-PASS after the concrete changes below.** D1-D4/D6 are consistent with the new probe: all three models accepted the OAuth Fast field but this account lacked entitlement (`devlog/_plan/260923_anthropic_fast_speed/020_probe-evidence.md:9-20,31-42`). The plan's pricing rule for both provider IDs is reasonable as a *confirmed-speed list-price estimate*, but D5's claim that `oauthDispatch` wraps every non-forward Anthropic send, and its proposed hidden second send there, do not hold (`010_plan.md:16-23`). This is a source audit, not a runtime test. +**Verdict: FAIL as written; NEAR-PASS after the concrete changes below.** D1-D4/D6 are consistent with the new probe: all three models accepted the OAuth Fast field but this account lacked entitlement (`devlog/_fin/260923_anthropic_fast_speed/020_probe-evidence.md:9-20,31-42`). The plan's pricing rule for both provider IDs is reasonable as a *confirmed-speed list-price estimate*, but D5's claim that `oauthDispatch` wraps every non-forward Anthropic send, and its proposed hidden second send there, do not hold (`010_plan.md:16-23`). This is a source audit, not a runtime test. ## Where `oauthDispatch` runs diff --git a/devlog/_plan/260923_anthropic_fast_speed/040_audit.md b/devlog/_fin/260923_anthropic_fast_speed/040_audit.md similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/040_audit.md rename to devlog/_fin/260923_anthropic_fast_speed/040_audit.md diff --git a/devlog/_plan/260923_anthropic_fast_speed/050_build.md b/devlog/_fin/260923_anthropic_fast_speed/050_build.md similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/050_build.md rename to devlog/_fin/260923_anthropic_fast_speed/050_build.md diff --git a/devlog/_plan/260923_anthropic_fast_speed/060_done.md b/devlog/_fin/260923_anthropic_fast_speed/060_done.md similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/060_done.md rename to devlog/_fin/260923_anthropic_fast_speed/060_done.md diff --git a/devlog/_plan/260923_anthropic_fast_speed/evidence/logs-fast-downgrade.png b/devlog/_fin/260923_anthropic_fast_speed/evidence/logs-fast-downgrade.png similarity index 100% rename from devlog/_plan/260923_anthropic_fast_speed/evidence/logs-fast-downgrade.png rename to devlog/_fin/260923_anthropic_fast_speed/evidence/logs-fast-downgrade.png diff --git a/devlog/_plan/260923_bundle_a_tests_hygiene/000_triage.md b/devlog/_fin/260923_bundle_a_tests_hygiene/000_triage.md similarity index 100% rename from devlog/_plan/260923_bundle_a_tests_hygiene/000_triage.md rename to devlog/_fin/260923_bundle_a_tests_hygiene/000_triage.md diff --git a/devlog/_plan/260923_bundle_a_tests_hygiene/010_build.md b/devlog/_fin/260923_bundle_a_tests_hygiene/010_build.md similarity index 100% rename from devlog/_plan/260923_bundle_a_tests_hygiene/010_build.md rename to devlog/_fin/260923_bundle_a_tests_hygiene/010_build.md diff --git a/devlog/_plan/260923_bundle_a_tests_hygiene/020_delivery.md b/devlog/_fin/260923_bundle_a_tests_hygiene/020_delivery.md similarity index 100% rename from devlog/_plan/260923_bundle_a_tests_hygiene/020_delivery.md rename to devlog/_fin/260923_bundle_a_tests_hygiene/020_delivery.md diff --git a/devlog/_plan/260923_bundle_f1_provider_registry/000_overview.md b/devlog/_fin/260923_bundle_f1_provider_registry/000_overview.md similarity index 100% rename from devlog/_plan/260923_bundle_f1_provider_registry/000_overview.md rename to devlog/_fin/260923_bundle_f1_provider_registry/000_overview.md diff --git a/devlog/_plan/260923_bundle_f1_provider_registry/010_carry_plan.md b/devlog/_fin/260923_bundle_f1_provider_registry/010_carry_plan.md similarity index 100% rename from devlog/_plan/260923_bundle_f1_provider_registry/010_carry_plan.md rename to devlog/_fin/260923_bundle_f1_provider_registry/010_carry_plan.md diff --git a/devlog/_plan/260923_bundle_f1_provider_registry/020_delivery.md b/devlog/_fin/260923_bundle_f1_provider_registry/020_delivery.md similarity index 100% rename from devlog/_plan/260923_bundle_f1_provider_registry/020_delivery.md rename to devlog/_fin/260923_bundle_f1_provider_registry/020_delivery.md diff --git a/devlog/_plan/260923_bundle_lane_e/000_overview.md b/devlog/_fin/260923_bundle_lane_e/000_overview.md similarity index 100% rename from devlog/_plan/260923_bundle_lane_e/000_overview.md rename to devlog/_fin/260923_bundle_lane_e/000_overview.md diff --git a/devlog/_plan/260923_bundle_lane_e/010_decisions.md b/devlog/_fin/260923_bundle_lane_e/010_decisions.md similarity index 100% rename from devlog/_plan/260923_bundle_lane_e/010_decisions.md rename to devlog/_fin/260923_bundle_lane_e/010_decisions.md diff --git a/devlog/_plan/260923_bundle_lane_e/020_carry.md b/devlog/_fin/260923_bundle_lane_e/020_carry.md similarity index 100% rename from devlog/_plan/260923_bundle_lane_e/020_carry.md rename to devlog/_fin/260923_bundle_lane_e/020_carry.md diff --git a/devlog/_plan/260923_bundle_lane_e/030_verify.md b/devlog/_fin/260923_bundle_lane_e/030_verify.md similarity index 100% rename from devlog/_plan/260923_bundle_lane_e/030_verify.md rename to devlog/_fin/260923_bundle_lane_e/030_verify.md diff --git a/devlog/_plan/260923_claude_desktop_first_party_models/000_plan.md b/devlog/_fin/260923_claude_desktop_first_party_models/000_plan.md similarity index 100% rename from devlog/_plan/260923_claude_desktop_first_party_models/000_plan.md rename to devlog/_fin/260923_claude_desktop_first_party_models/000_plan.md diff --git a/devlog/_plan/260923_claude_desktop_first_party_models/001_probe_evidence.md b/devlog/_fin/260923_claude_desktop_first_party_models/001_probe_evidence.md similarity index 100% rename from devlog/_plan/260923_claude_desktop_first_party_models/001_probe_evidence.md rename to devlog/_fin/260923_claude_desktop_first_party_models/001_probe_evidence.md diff --git a/devlog/_plan/260923_claude_desktop_first_party_models/010_roadmap.md b/devlog/_fin/260923_claude_desktop_first_party_models/010_roadmap.md similarity index 100% rename from devlog/_plan/260923_claude_desktop_first_party_models/010_roadmap.md rename to devlog/_fin/260923_claude_desktop_first_party_models/010_roadmap.md diff --git a/devlog/_plan/260923_claude_desktop_first_party_models/020_wp2_first_party_bindings.md b/devlog/_fin/260923_claude_desktop_first_party_models/020_wp2_first_party_bindings.md similarity index 100% rename from devlog/_plan/260923_claude_desktop_first_party_models/020_wp2_first_party_bindings.md rename to devlog/_fin/260923_claude_desktop_first_party_models/020_wp2_first_party_bindings.md diff --git a/devlog/_plan/260923_claude_desktop_first_party_models/030_wp3_live_proof_and_pr.md b/devlog/_fin/260923_claude_desktop_first_party_models/030_wp3_live_proof_and_pr.md similarity index 100% rename from devlog/_plan/260923_claude_desktop_first_party_models/030_wp3_live_proof_and_pr.md rename to devlog/_fin/260923_claude_desktop_first_party_models/030_wp3_live_proof_and_pr.md diff --git a/devlog/_plan/260923_claude_reset_grants/010_plan.md b/devlog/_fin/260923_claude_reset_grants/010_plan.md similarity index 100% rename from devlog/_plan/260923_claude_reset_grants/010_plan.md rename to devlog/_fin/260923_claude_reset_grants/010_plan.md diff --git a/devlog/_plan/260923_configured_native_gpt_models/010_plan.md b/devlog/_fin/260923_configured_native_gpt_models/010_plan.md similarity index 100% rename from devlog/_plan/260923_configured_native_gpt_models/010_plan.md rename to devlog/_fin/260923_configured_native_gpt_models/010_plan.md diff --git a/devlog/_plan/260923_configured_native_gpt_models/020_audit.md b/devlog/_fin/260923_configured_native_gpt_models/020_audit.md similarity index 100% rename from devlog/_plan/260923_configured_native_gpt_models/020_audit.md rename to devlog/_fin/260923_configured_native_gpt_models/020_audit.md diff --git a/devlog/_plan/260923_docs_polish_404/000_plan.md b/devlog/_fin/260923_docs_polish_404/000_plan.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/000_plan.md rename to devlog/_fin/260923_docs_polish_404/000_plan.md diff --git a/devlog/_plan/260923_docs_polish_404/001_existing_link_failures.md b/devlog/_fin/260923_docs_polish_404/001_existing_link_failures.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/001_existing_link_failures.md rename to devlog/_fin/260923_docs_polish_404/001_existing_link_failures.md diff --git a/devlog/_plan/260923_docs_polish_404/010_wp2_link_integrity.md b/devlog/_fin/260923_docs_polish_404/010_wp2_link_integrity.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/010_wp2_link_integrity.md rename to devlog/_fin/260923_docs_polish_404/010_wp2_link_integrity.md diff --git a/devlog/_plan/260923_docs_polish_404/020_wp3_english_polish_readme_resync.md b/devlog/_fin/260923_docs_polish_404/020_wp3_english_polish_readme_resync.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/020_wp3_english_polish_readme_resync.md rename to devlog/_fin/260923_docs_polish_404/020_wp3_english_polish_readme_resync.md diff --git a/devlog/_plan/260923_docs_polish_404/021_wp3_macos_menu_bar_draft.md b/devlog/_fin/260923_docs_polish_404/021_wp3_macos_menu_bar_draft.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/021_wp3_macos_menu_bar_draft.md rename to devlog/_fin/260923_docs_polish_404/021_wp3_macos_menu_bar_draft.md diff --git a/devlog/_plan/260923_docs_polish_404/030_wp4_locale_coverage.md b/devlog/_fin/260923_docs_polish_404/030_wp4_locale_coverage.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/030_wp4_locale_coverage.md rename to devlog/_fin/260923_docs_polish_404/030_wp4_locale_coverage.md diff --git a/devlog/_plan/260923_docs_polish_404/040_wp5_delivery.md b/devlog/_fin/260923_docs_polish_404/040_wp5_delivery.md similarity index 100% rename from devlog/_plan/260923_docs_polish_404/040_wp5_delivery.md rename to devlog/_fin/260923_docs_polish_404/040_wp5_delivery.md diff --git a/devlog/_plan/260923_docs_retirement/000_plan.md b/devlog/_fin/260923_docs_retirement/000_plan.md similarity index 100% rename from devlog/_plan/260923_docs_retirement/000_plan.md rename to devlog/_fin/260923_docs_retirement/000_plan.md diff --git a/devlog/_plan/260923_docs_retirement/010_phase1_docs_retirement.md b/devlog/_fin/260923_docs_retirement/010_phase1_docs_retirement.md similarity index 100% rename from devlog/_plan/260923_docs_retirement/010_phase1_docs_retirement.md rename to devlog/_fin/260923_docs_retirement/010_phase1_docs_retirement.md diff --git a/devlog/_plan/260923_gpt6_catalog_lanes/000_plan.md b/devlog/_fin/260923_gpt6_catalog_lanes/000_plan.md similarity index 100% rename from devlog/_plan/260923_gpt6_catalog_lanes/000_plan.md rename to devlog/_fin/260923_gpt6_catalog_lanes/000_plan.md diff --git a/devlog/_plan/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md b/devlog/_fin/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md similarity index 100% rename from devlog/_plan/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md rename to devlog/_fin/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md diff --git a/devlog/_plan/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md b/devlog/_fin/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md similarity index 100% rename from devlog/_plan/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md rename to devlog/_fin/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md diff --git a/devlog/_plan/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md b/devlog/_fin/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md similarity index 100% rename from devlog/_plan/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md rename to devlog/_fin/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md diff --git a/devlog/_plan/260923_grok47_parity/000_plan.md b/devlog/_fin/260923_grok47_parity/000_plan.md similarity index 98% rename from devlog/_plan/260923_grok47_parity/000_plan.md rename to devlog/_fin/260923_grok47_parity/000_plan.md index 36e98e1cdba..d2dc1cf7bb2 100644 --- a/devlog/_plan/260923_grok47_parity/000_plan.md +++ b/devlog/_fin/260923_grok47_parity/000_plan.md @@ -57,7 +57,7 @@ Reflection: see "Reflection" below. 2. src/providers/registry/entries-core.ts, xai block: modelSupportsServiceTier, modelWireDefaults (oauth, responses inbound), modelInputModalities, preserveReasoningContentModels, modelReasoningEfforts [low..xhigh], modelDefaultReasoningEfforts high, modelContextWindows 500_000 — each with a grok-4.7 sibling of 4.6; comments cite - devlog/_plan/260923_grok47_parity/010_probe-evidence.md. Devin block: add "grok-4-7" after "grok-4-6" in models. + devlog/_fin/260923_grok47_parity/010_probe-evidence.md. Devin block: add "grok-4-7" after "grok-4-6" in models. OpenCode Go block: modelWireDefaults, modelReasoningEfforts, modelDefaultReasoningEfforts for grok-4.7. 3. src/adapters/devin/live-models.ts — DEVIN_MODEL_CONTEXT_WINDOWS "grok-4-7": 500_000; DEVIN_MODEL_EFFORTS (if it has per-model entries) "grok-4-7": low..max, default medium if a default map exists. diff --git a/devlog/_plan/260923_grok47_parity/010_probe-evidence.md b/devlog/_fin/260923_grok47_parity/010_probe-evidence.md similarity index 100% rename from devlog/_plan/260923_grok47_parity/010_probe-evidence.md rename to devlog/_fin/260923_grok47_parity/010_probe-evidence.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/000_plan.md b/devlog/_fin/260923_luvs_l5_responses_usage/000_plan.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/000_plan.md rename to devlog/_fin/260923_luvs_l5_responses_usage/000_plan.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/010_phase1_small_units.md b/devlog/_fin/260923_luvs_l5_responses_usage/010_phase1_small_units.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/010_phase1_small_units.md rename to devlog/_fin/260923_luvs_l5_responses_usage/010_phase1_small_units.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/020_phase2_responses_sequence.md b/devlog/_fin/260923_luvs_l5_responses_usage/020_phase2_responses_sequence.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/020_phase2_responses_sequence.md rename to devlog/_fin/260923_luvs_l5_responses_usage/020_phase2_responses_sequence.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/030_phase3_search_usage.md b/devlog/_fin/260923_luvs_l5_responses_usage/030_phase3_search_usage.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/030_phase3_search_usage.md rename to devlog/_fin/260923_luvs_l5_responses_usage/030_phase3_search_usage.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/040_phase4_pr_ci_review.md b/devlog/_fin/260923_luvs_l5_responses_usage/040_phase4_pr_ci_review.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/040_phase4_pr_ci_review.md rename to devlog/_fin/260923_luvs_l5_responses_usage/040_phase4_pr_ci_review.md diff --git a/devlog/_plan/260923_luvs_l5_responses_usage/050_phase5_close_originals.md b/devlog/_fin/260923_luvs_l5_responses_usage/050_phase5_close_originals.md similarity index 100% rename from devlog/_plan/260923_luvs_l5_responses_usage/050_phase5_close_originals.md rename to devlog/_fin/260923_luvs_l5_responses_usage/050_phase5_close_originals.md diff --git a/devlog/_plan/260923_models_catalog_delivery_disclosure/000_plan.md b/devlog/_fin/260923_models_catalog_delivery_disclosure/000_plan.md similarity index 100% rename from devlog/_plan/260923_models_catalog_delivery_disclosure/000_plan.md rename to devlog/_fin/260923_models_catalog_delivery_disclosure/000_plan.md diff --git a/devlog/_plan/260923_models_catalog_delivery_disclosure/010_architect.md b/devlog/_fin/260923_models_catalog_delivery_disclosure/010_architect.md similarity index 100% rename from devlog/_plan/260923_models_catalog_delivery_disclosure/010_architect.md rename to devlog/_fin/260923_models_catalog_delivery_disclosure/010_architect.md diff --git a/devlog/_plan/260923_models_catalog_delivery_disclosure/020_done.md b/devlog/_fin/260923_models_catalog_delivery_disclosure/020_done.md similarity index 100% rename from devlog/_plan/260923_models_catalog_delivery_disclosure/020_done.md rename to devlog/_fin/260923_models_catalog_delivery_disclosure/020_done.md diff --git a/devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png b/devlog/_fin/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png similarity index 100% rename from devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png rename to devlog/_fin/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png diff --git a/devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png b/devlog/_fin/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png similarity index 100% rename from devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png rename to devlog/_fin/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png diff --git a/devlog/_plan/260923_opus_5_5_catalog/010_plan.md b/devlog/_fin/260923_opus_5_5_catalog/010_plan.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/010_plan.md rename to devlog/_fin/260923_opus_5_5_catalog/010_plan.md diff --git a/devlog/_plan/260923_opus_5_5_catalog/020_audit.md b/devlog/_fin/260923_opus_5_5_catalog/020_audit.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/020_audit.md rename to devlog/_fin/260923_opus_5_5_catalog/020_audit.md diff --git a/devlog/_plan/260923_opus_5_5_catalog/030_done.md b/devlog/_fin/260923_opus_5_5_catalog/030_done.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/030_done.md rename to devlog/_fin/260923_opus_5_5_catalog/030_done.md diff --git a/devlog/_plan/260923_opus_5_5_catalog/040_plan_providers.md b/devlog/_fin/260923_opus_5_5_catalog/040_plan_providers.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/040_plan_providers.md rename to devlog/_fin/260923_opus_5_5_catalog/040_plan_providers.md diff --git a/devlog/_plan/260923_opus_5_5_catalog/050_done_providers.md b/devlog/_fin/260923_opus_5_5_catalog/050_done_providers.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/050_done_providers.md rename to devlog/_fin/260923_opus_5_5_catalog/050_done_providers.md diff --git a/devlog/_plan/260923_opus_5_5_catalog/060_plan_preemptive.md b/devlog/_fin/260923_opus_5_5_catalog/060_plan_preemptive.md similarity index 100% rename from devlog/_plan/260923_opus_5_5_catalog/060_plan_preemptive.md rename to devlog/_fin/260923_opus_5_5_catalog/060_plan_preemptive.md diff --git a/devlog/_plan/260923_p1_provider_state_continuity/000_overview.md b/devlog/_fin/260923_p1_provider_state_continuity/000_overview.md similarity index 100% rename from devlog/_plan/260923_p1_provider_state_continuity/000_overview.md rename to devlog/_fin/260923_p1_provider_state_continuity/000_overview.md diff --git a/devlog/_plan/260923_p1_provider_state_continuity/010_part1_compat_contract.md b/devlog/_fin/260923_p1_provider_state_continuity/010_part1_compat_contract.md similarity index 100% rename from devlog/_plan/260923_p1_provider_state_continuity/010_part1_compat_contract.md rename to devlog/_fin/260923_p1_provider_state_continuity/010_part1_compat_contract.md diff --git a/devlog/_plan/260923_p1_provider_state_continuity/020_part2_shadow_target_lifecycle.md b/devlog/_fin/260923_p1_provider_state_continuity/020_part2_shadow_target_lifecycle.md similarity index 100% rename from devlog/_plan/260923_p1_provider_state_continuity/020_part2_shadow_target_lifecycle.md rename to devlog/_fin/260923_p1_provider_state_continuity/020_part2_shadow_target_lifecycle.md diff --git a/devlog/_plan/260923_p1_provider_state_continuity/030_delivery.md b/devlog/_fin/260923_p1_provider_state_continuity/030_delivery.md similarity index 100% rename from devlog/_plan/260923_p1_provider_state_continuity/030_delivery.md rename to devlog/_fin/260923_p1_provider_state_continuity/030_delivery.md diff --git a/devlog/_plan/260923_p2_update_continuity/000_roadmap.md b/devlog/_fin/260923_p2_update_continuity/000_roadmap.md similarity index 100% rename from devlog/_plan/260923_p2_update_continuity/000_roadmap.md rename to devlog/_fin/260923_p2_update_continuity/000_roadmap.md diff --git a/devlog/_plan/260923_p2_update_continuity/010_fenced_proxy_identity.md b/devlog/_fin/260923_p2_update_continuity/010_fenced_proxy_identity.md similarity index 100% rename from devlog/_plan/260923_p2_update_continuity/010_fenced_proxy_identity.md rename to devlog/_fin/260923_p2_update_continuity/010_fenced_proxy_identity.md diff --git a/devlog/_plan/260923_p2_update_continuity/020_updater_leftovers_and_guidance.md b/devlog/_fin/260923_p2_update_continuity/020_updater_leftovers_and_guidance.md similarity index 100% rename from devlog/_plan/260923_p2_update_continuity/020_updater_leftovers_and_guidance.md rename to devlog/_fin/260923_p2_update_continuity/020_updater_leftovers_and_guidance.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/000_roadmap.md b/devlog/_fin/260923_p3_azure_opaque_recovery/000_roadmap.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/000_roadmap.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/000_roadmap.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/010_source.md b/devlog/_fin/260923_p3_azure_opaque_recovery/010_source.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/010_source.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/010_source.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/020_tests.md b/devlog/_fin/260923_p3_azure_opaque_recovery/020_tests.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/020_tests.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/020_tests.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/030_docs.md b/devlog/_fin/260923_p3_azure_opaque_recovery/030_docs.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/030_docs.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/030_docs.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/040_delivery.md b/devlog/_fin/260923_p3_azure_opaque_recovery/040_delivery.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/040_delivery.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/040_delivery.md diff --git a/devlog/_plan/260923_p3_azure_opaque_recovery/050_review_followup.md b/devlog/_fin/260923_p3_azure_opaque_recovery/050_review_followup.md similarity index 100% rename from devlog/_plan/260923_p3_azure_opaque_recovery/050_review_followup.md rename to devlog/_fin/260923_p3_azure_opaque_recovery/050_review_followup.md diff --git a/devlog/_plan/260923_p4_ci_pr_finish/000_plan.md b/devlog/_fin/260923_p4_ci_pr_finish/000_plan.md similarity index 100% rename from devlog/_plan/260923_p4_ci_pr_finish/000_plan.md rename to devlog/_fin/260923_p4_ci_pr_finish/000_plan.md diff --git a/devlog/_plan/260923_p4_ci_pr_finish/010_pr5469_privacy_gate.md b/devlog/_fin/260923_p4_ci_pr_finish/010_pr5469_privacy_gate.md similarity index 100% rename from devlog/_plan/260923_p4_ci_pr_finish/010_pr5469_privacy_gate.md rename to devlog/_fin/260923_p4_ci_pr_finish/010_pr5469_privacy_gate.md diff --git a/devlog/_plan/260923_p4_ci_pr_finish/020_pr5456_batch_deadline.md b/devlog/_fin/260923_p4_ci_pr_finish/020_pr5456_batch_deadline.md similarity index 100% rename from devlog/_plan/260923_p4_ci_pr_finish/020_pr5456_batch_deadline.md rename to devlog/_fin/260923_p4_ci_pr_finish/020_pr5456_batch_deadline.md diff --git a/devlog/_plan/260923_p4_ci_pr_finish/030_pr5471_latest_dev_wording.md b/devlog/_fin/260923_p4_ci_pr_finish/030_pr5471_latest_dev_wording.md similarity index 100% rename from devlog/_plan/260923_p4_ci_pr_finish/030_pr5471_latest_dev_wording.md rename to devlog/_fin/260923_p4_ci_pr_finish/030_pr5471_latest_dev_wording.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/000_plan.md b/devlog/_fin/260923_p5_ci_release_gaps/000_plan.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/000_plan.md rename to devlog/_fin/260923_p5_ci_release_gaps/000_plan.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/010_release_preflight.md b/devlog/_fin/260923_p5_ci_release_gaps/010_release_preflight.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/010_release_preflight.md rename to devlog/_fin/260923_p5_ci_release_gaps/010_release_preflight.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/020_release_outcome_report.md b/devlog/_fin/260923_p5_ci_release_gaps/020_release_outcome_report.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/020_release_outcome_report.md rename to devlog/_fin/260923_p5_ci_release_gaps/020_release_outcome_report.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/030_shard_balance.md b/devlog/_fin/260923_p5_ci_release_gaps/030_shard_balance.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/030_shard_balance.md rename to devlog/_fin/260923_p5_ci_release_gaps/030_shard_balance.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/040_scope_gap_checks.md b/devlog/_fin/260923_p5_ci_release_gaps/040_scope_gap_checks.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/040_scope_gap_checks.md rename to devlog/_fin/260923_p5_ci_release_gaps/040_scope_gap_checks.md diff --git a/devlog/_plan/260923_p5_ci_release_gaps/050_delivery.md b/devlog/_fin/260923_p5_ci_release_gaps/050_delivery.md similarity index 100% rename from devlog/_plan/260923_p5_ci_release_gaps/050_delivery.md rename to devlog/_fin/260923_p5_ci_release_gaps/050_delivery.md diff --git a/devlog/_plan/260923_subagent_roster_defaults_autosave/000_README.md b/devlog/_fin/260923_subagent_roster_defaults_autosave/000_README.md similarity index 100% rename from devlog/_plan/260923_subagent_roster_defaults_autosave/000_README.md rename to devlog/_fin/260923_subagent_roster_defaults_autosave/000_README.md diff --git a/devlog/_plan/260923_subagent_roster_defaults_autosave/010_gpt6_default_roster.md b/devlog/_fin/260923_subagent_roster_defaults_autosave/010_gpt6_default_roster.md similarity index 100% rename from devlog/_plan/260923_subagent_roster_defaults_autosave/010_gpt6_default_roster.md rename to devlog/_fin/260923_subagent_roster_defaults_autosave/010_gpt6_default_roster.md diff --git a/devlog/_plan/260923_subagent_roster_defaults_autosave/020_roster_autosave.md b/devlog/_fin/260923_subagent_roster_defaults_autosave/020_roster_autosave.md similarity index 100% rename from devlog/_plan/260923_subagent_roster_defaults_autosave/020_roster_autosave.md rename to devlog/_fin/260923_subagent_roster_defaults_autosave/020_roster_autosave.md diff --git a/devlog/_plan/260923_subagent_roster_defaults_autosave/030_delivery.md b/devlog/_fin/260923_subagent_roster_defaults_autosave/030_delivery.md similarity index 100% rename from devlog/_plan/260923_subagent_roster_defaults_autosave/030_delivery.md rename to devlog/_fin/260923_subagent_roster_defaults_autosave/030_delivery.md diff --git a/devlog/_plan/260923_subagent_roster_defaults_autosave/040_legacy_roster_cleanup.md b/devlog/_fin/260923_subagent_roster_defaults_autosave/040_legacy_roster_cleanup.md similarity index 100% rename from devlog/_plan/260923_subagent_roster_defaults_autosave/040_legacy_roster_cleanup.md rename to devlog/_fin/260923_subagent_roster_defaults_autosave/040_legacy_roster_cleanup.md diff --git a/devlog/_plan/260923_usage_timeline_pool_merge/000_plan.md b/devlog/_fin/260923_usage_timeline_pool_merge/000_plan.md similarity index 100% rename from devlog/_plan/260923_usage_timeline_pool_merge/000_plan.md rename to devlog/_fin/260923_usage_timeline_pool_merge/000_plan.md diff --git a/devlog/_plan/260923_usage_timeline_pool_merge/010_phase1.md b/devlog/_fin/260923_usage_timeline_pool_merge/010_phase1.md similarity index 100% rename from devlog/_plan/260923_usage_timeline_pool_merge/010_phase1.md rename to devlog/_fin/260923_usage_timeline_pool_merge/010_phase1.md diff --git a/devlog/_plan/260924_anthropic_fast_opt_in/010_plan.md b/devlog/_fin/260924_anthropic_fast_opt_in/010_plan.md similarity index 97% rename from devlog/_plan/260924_anthropic_fast_opt_in/010_plan.md rename to devlog/_fin/260924_anthropic_fast_opt_in/010_plan.md index 58a8a63a87e..511c2dbc3c7 100644 --- a/devlog/_plan/260924_anthropic_fast_opt_in/010_plan.md +++ b/devlog/_fin/260924_anthropic_fast_opt_in/010_plan.md @@ -5,7 +5,7 @@ - Request (2026-09-24): Anthropic fast mode spends usage credits, so keep it off by default; give the Anthropic provider card on the dashboard Models page one row that turns it on and off; open a PR and merge it. Push, PR, and merge are authorized for this change. -- Previous unit: devlog/_plan/260923_anthropic_fast_speed (#5604) made `claude-opus-5-5`, `claude-opus-5`, +- Previous unit: devlog/_fin/260923_anthropic_fast_speed (#5604) made `claude-opus-5-5`, `claude-opus-5`, `claude-opus-4-8` Fast-eligible on `anthropic` and `anthropic-apikey` with no switch other than the global `fastMode`. Its residual already named the cost: every turn on an account without credits pays a refused round trip, and an account with credits is billed 2x without a per-provider choice. diff --git a/devlog/_plan/260924_anthropic_forced_tool_choice/010_plan.md b/devlog/_fin/260924_anthropic_forced_tool_choice/010_plan.md similarity index 100% rename from devlog/_plan/260924_anthropic_forced_tool_choice/010_plan.md rename to devlog/_fin/260924_anthropic_forced_tool_choice/010_plan.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/000_plan.md b/devlog/_fin/260924_claude_desktop_picker_mode/000_plan.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/000_plan.md rename to devlog/_fin/260924_claude_desktop_picker_mode/000_plan.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/001_research.md b/devlog/_fin/260924_claude_desktop_picker_mode/001_research.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/001_research.md rename to devlog/_fin/260924_claude_desktop_picker_mode/001_research.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/010_wp2_gateway_default_and_warning.md b/devlog/_fin/260924_claude_desktop_picker_mode/010_wp2_gateway_default_and_warning.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/010_wp2_gateway_default_and_warning.md rename to devlog/_fin/260924_claude_desktop_picker_mode/010_wp2_gateway_default_and_warning.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/020_wp3_picker_core.md b/devlog/_fin/260924_claude_desktop_picker_mode/020_wp3_picker_core.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/020_wp3_picker_core.md rename to devlog/_fin/260924_claude_desktop_picker_mode/020_wp3_picker_core.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/030_wp4_picker_activation.md b/devlog/_fin/260924_claude_desktop_picker_mode/030_wp4_picker_activation.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/030_wp4_picker_activation.md rename to devlog/_fin/260924_claude_desktop_picker_mode/030_wp4_picker_activation.md diff --git a/devlog/_plan/260924_claude_desktop_picker_mode/040_wp5_live_proof_pr_merge.md b/devlog/_fin/260924_claude_desktop_picker_mode/040_wp5_live_proof_pr_merge.md similarity index 100% rename from devlog/_plan/260924_claude_desktop_picker_mode/040_wp5_live_proof_pr_merge.md rename to devlog/_fin/260924_claude_desktop_picker_mode/040_wp5_live_proof_pr_merge.md diff --git a/devlog/_plan/260924_cursor_fast_pricing/000_plan.md b/devlog/_fin/260924_cursor_fast_pricing/000_plan.md similarity index 100% rename from devlog/_plan/260924_cursor_fast_pricing/000_plan.md rename to devlog/_fin/260924_cursor_fast_pricing/000_plan.md diff --git a/devlog/_plan/260924_cursor_fast_pricing/010_implementation.md b/devlog/_fin/260924_cursor_fast_pricing/010_implementation.md similarity index 100% rename from devlog/_plan/260924_cursor_fast_pricing/010_implementation.md rename to devlog/_fin/260924_cursor_fast_pricing/010_implementation.md diff --git a/devlog/_plan/260924_cursor_fast_pricing/020_verification.md b/devlog/_fin/260924_cursor_fast_pricing/020_verification.md similarity index 100% rename from devlog/_plan/260924_cursor_fast_pricing/020_verification.md rename to devlog/_fin/260924_cursor_fast_pricing/020_verification.md diff --git a/devlog/_plan/260924_l3_provider_adapters/010_plan.md b/devlog/_fin/260924_l3_provider_adapters/010_plan.md similarity index 100% rename from devlog/_plan/260924_l3_provider_adapters/010_plan.md rename to devlog/_fin/260924_l3_provider_adapters/010_plan.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/000_roadmap.md b/devlog/_fin/260924_l4_codex_cli_service/000_roadmap.md similarity index 100% rename from devlog/_plan/260924_l4_codex_cli_service/000_roadmap.md rename to devlog/_fin/260924_l4_codex_cli_service/000_roadmap.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/010_carry_ready_prs.md b/devlog/_fin/260924_l4_codex_cli_service/010_carry_ready_prs.md similarity index 100% rename from devlog/_plan/260924_l4_codex_cli_service/010_carry_ready_prs.md rename to devlog/_fin/260924_l4_codex_cli_service/010_carry_ready_prs.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/020_subagent_identity_5221.md b/devlog/_fin/260924_l4_codex_cli_service/020_subagent_identity_5221.md similarity index 100% rename from devlog/_plan/260924_l4_codex_cli_service/020_subagent_identity_5221.md rename to devlog/_fin/260924_l4_codex_cli_service/020_subagent_identity_5221.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/030_agent_message_recovery_5009.md b/devlog/_fin/260924_l4_codex_cli_service/030_agent_message_recovery_5009.md similarity index 100% rename from devlog/_plan/260924_l4_codex_cli_service/030_agent_message_recovery_5009.md rename to devlog/_fin/260924_l4_codex_cli_service/030_agent_message_recovery_5009.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/040_main_hard_lock_default_5694.md b/devlog/_fin/260924_l4_codex_cli_service/040_main_hard_lock_default_5694.md similarity index 100% rename from devlog/_plan/260924_l4_codex_cli_service/040_main_hard_lock_default_5694.md rename to devlog/_fin/260924_l4_codex_cli_service/040_main_hard_lock_default_5694.md diff --git a/devlog/_plan/260924_l4_codex_cli_service/050_publish.md b/devlog/_fin/260924_l4_codex_cli_service/050_publish.md similarity index 90% rename from devlog/_plan/260924_l4_codex_cli_service/050_publish.md rename to devlog/_fin/260924_l4_codex_cli_service/050_publish.md index 89e1484903c..64ef6196de6 100644 --- a/devlog/_plan/260924_l4_codex_cli_service/050_publish.md +++ b/devlog/_fin/260924_l4_codex_cli_service/050_publish.md @@ -3,7 +3,7 @@ Rebase on origin/dev; bun run typecheck; focused tests for every item; bun run t ## wp5 P (executable) - origin/dev moved to df61bcecd5 (#5737, #5738). Overlapping files: docs-site reference/configuration/providers.md, scripts/test-layout/layout.json, structure/config.md, structure/subagents.md, tests/fixtures/test-layout-expected.json. Resolve by keeping both sides' entries. -- Before rebase: git mv devlog/_plan/260924_l4_codex_cli_service -> devlog/_fin/ is deferred until after merge (unit stays open while the PR is open). +- Before rebase: git mv devlog/_fin/260924_l4_codex_cli_service -> devlog/_fin/ is deferred until after merge (unit stays open while the PR is open). - Validation after rebase: bun run typecheck; focused union of all item tests; bun run test:changed (worktree under /Users/jun/.codex trips the test-home guard for some temp-dir tests — compare any failure with a pristine git archive copy); bun run privacy:scan; bun run structure:check; bun run lint:gui. - GUI screenshot: run the dashboard (bun run src/cli/index.ts start on a spare port with a throwaway OPENCODEX_HOME), open Codex settings > Multi-auth > Advanced, capture the 98% card to .tmp/. Hosting: pr-assets push only if the user authorizes; otherwise the coordinator uploads it. - PR body: Summary per item with Carries/Closes lines, Security review for #5713, Verification with commands, Checklist, coordinator decisions (Reserve trade-off, previous opt-outs re-enabled, stale connect marker retention, 64 MiB indeterminate). diff --git a/devlog/_plan/260924_regression_risk_fixes/000_overview.md b/devlog/_fin/260924_regression_risk_fixes/000_overview.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/000_overview.md rename to devlog/_fin/260924_regression_risk_fixes/000_overview.md diff --git a/devlog/_plan/260924_regression_risk_fixes/010_wsl_home.md b/devlog/_fin/260924_regression_risk_fixes/010_wsl_home.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/010_wsl_home.md rename to devlog/_fin/260924_regression_risk_fixes/010_wsl_home.md diff --git a/devlog/_plan/260924_regression_risk_fixes/020_windows_mise_node.md b/devlog/_fin/260924_regression_risk_fixes/020_windows_mise_node.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/020_windows_mise_node.md rename to devlog/_fin/260924_regression_risk_fixes/020_windows_mise_node.md diff --git a/devlog/_plan/260924_regression_risk_fixes/030_echo_filter.md b/devlog/_fin/260924_regression_risk_fixes/030_echo_filter.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/030_echo_filter.md rename to devlog/_fin/260924_regression_risk_fixes/030_echo_filter.md diff --git a/devlog/_plan/260924_regression_risk_fixes/040_tool_call_hold.md b/devlog/_fin/260924_regression_risk_fixes/040_tool_call_hold.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/040_tool_call_hold.md rename to devlog/_fin/260924_regression_risk_fixes/040_tool_call_hold.md diff --git a/devlog/_plan/260924_regression_risk_fixes/050_delivery.md b/devlog/_fin/260924_regression_risk_fixes/050_delivery.md similarity index 100% rename from devlog/_plan/260924_regression_risk_fixes/050_delivery.md rename to devlog/_fin/260924_regression_risk_fixes/050_delivery.md diff --git a/devlog/_plan/260924_update_indicator/000_plan.md b/devlog/_fin/260924_update_indicator/000_plan.md similarity index 100% rename from devlog/_plan/260924_update_indicator/000_plan.md rename to devlog/_fin/260924_update_indicator/000_plan.md diff --git a/devlog/_plan/260924_update_indicator/001_sol_plan_draft.md b/devlog/_fin/260924_update_indicator/001_sol_plan_draft.md similarity index 100% rename from devlog/_plan/260924_update_indicator/001_sol_plan_draft.md rename to devlog/_fin/260924_update_indicator/001_sol_plan_draft.md diff --git a/devlog/_plan/260924_update_indicator/002_architect_proposal.md b/devlog/_fin/260924_update_indicator/002_architect_proposal.md similarity index 100% rename from devlog/_plan/260924_update_indicator/002_architect_proposal.md rename to devlog/_fin/260924_update_indicator/002_architect_proposal.md diff --git a/devlog/_plan/260924_update_indicator/010_phase1_package_cache.md b/devlog/_fin/260924_update_indicator/010_phase1_package_cache.md similarity index 100% rename from devlog/_plan/260924_update_indicator/010_phase1_package_cache.md rename to devlog/_fin/260924_update_indicator/010_phase1_package_cache.md diff --git a/devlog/_plan/260924_update_indicator/020_phase2_desktop_state_icons.md b/devlog/_fin/260924_update_indicator/020_phase2_desktop_state_icons.md similarity index 99% rename from devlog/_plan/260924_update_indicator/020_phase2_desktop_state_icons.md rename to devlog/_fin/260924_update_indicator/020_phase2_desktop_state_icons.md index be8a608e57b..9e4eae2e4d6 100644 --- a/devlog/_plan/260924_update_indicator/020_phase2_desktop_state_icons.md +++ b/devlog/_fin/260924_update_indicator/020_phase2_desktop_state_icons.md @@ -1265,7 +1265,7 @@ The commands below record the earlier *pre-B* runs on 2026-09-24 after root and | bun test tests/server/sidebar-routes.test.ts tests/server/management-route-registry.test.ts tests/ci-workflows/build-desktop-icon-set.test.ts tests/cli/cli-capabilities.test.ts (repository root) | 0 | 52 pass, 0 fail across four files; existing source only, no plan read. | | bun test tests/test-layout-tooling.test.ts (repository root) | 0 | 16 pass, 0 fail; reads existing layout JSON and fixture, not the plan. | | bun test tests/desktop-shell.test.ts (gui/) | 0 | 3 pass, 0 fail; reads existing GUI helper, not the plan. | -| bun -e 'const text = require("node:fs").readFileSync("devlog/_plan/260924_update_indicator/020_phase2_desktop_state_icons.md", "utf8"); const transpiler = new Bun.Transpiler({ loader: "ts" }); for (const marker of ["### New src/update/desktop-badge.ts", "NEW tests/update/update-desktop-badge.test.ts"]) { const part = text.slice(text.indexOf(marker)); const match = part.match(/~~~ts\n([\s\S]*?)\n~~~/); if (!match) throw new Error("missing " + marker); transpiler.transformSync(match[1]); } console.log("2 complete new TypeScript blocks parse");' (repository root) | 0 | Both complete new TypeScript blocks parsed; this command reads this plan directly. It is syntax evidence, not typechecking or behavior. | +| bun -e 'const text = require("node:fs").readFileSync("devlog/_fin/260924_update_indicator/020_phase2_desktop_state_icons.md", "utf8"); const transpiler = new Bun.Transpiler({ loader: "ts" }); for (const marker of ["### New src/update/desktop-badge.ts", "NEW tests/update/update-desktop-badge.test.ts"]) { const part = text.slice(text.indexOf(marker)); const match = part.match(/~~~ts\n([\s\S]*?)\n~~~/); if (!match) throw new Error("missing " + marker); transpiler.transformSync(match[1]); } console.log("2 complete new TypeScript blocks parse");' (repository root) | 0 | Both complete new TypeScript blocks parsed; this command reads this plan directly. It is syntax evidence, not typechecking or behavior. | | bun run icons:check (desktop/) | 0 | 18 generated icons match existing source; reads icon generator/assets, not the plan. The earlier trial spelling bun --cwd desktop run icons:check printed Bun usage with exit 0 and was not treated as a verifier. | | cargo test --manifest-path desktop/src-tauri/Cargo.toml (repository root) | 101 | The earlier run stopped before Rust tests because binaries/ocx-aarch64-apple-darwin was absent. This is environment setup, not a Rust test result. CI prepares an empty host-triple placeholder; B must do the same locally before retesting. | | swift -e 'import AppKit; let b = NSStatusBarButton(); print(b.cell?.imageRect(forBounds: b.bounds) as Any)' (repository root) | 0 | Confirmed the existing AppKit imageRect API resolves; this is not an overlay visual test and does not read plan. | diff --git a/devlog/_plan/260924_update_indicator/030_phase3_desktop_update_page.md b/devlog/_fin/260924_update_indicator/030_phase3_desktop_update_page.md similarity index 98% rename from devlog/_plan/260924_update_indicator/030_phase3_desktop_update_page.md rename to devlog/_fin/260924_update_indicator/030_phase3_desktop_update_page.md index 2e555612b60..9fd83af2870 100644 --- a/devlog/_plan/260924_update_indicator/030_phase3_desktop_update_page.md +++ b/devlog/_fin/260924_update_indicator/030_phase3_desktop_update_page.md @@ -967,9 +967,9 @@ After B, run `bun test ./gui/tests/desktop-shell.test.ts ./tests/clients/desktop The focused baseline tests do not read this document or the proposed page, so their result establishes only current conventions. -The docs-only target was checked directly with `bun -e 'import { readFileSync } from "node:fs"; import { scanText } from "./scripts/privacy-scan.ts"; const path = "devlog/_plan/260924_update_indicator/030_phase3_desktop_update_page.md"; const findings = scanText(path, readFileSync(path, "utf8")); console.log(`target privacy findings: ${findings.length}`); if (findings.length) process.exit(1)'`: exit 0, zero findings. This command reads this file. Repeat `bun run privacy:scan` after main stages the plan so the tracked-file walk includes it. +The docs-only target was checked directly with `bun -e 'import { readFileSync } from "node:fs"; import { scanText } from "./scripts/privacy-scan.ts"; const path = "devlog/_fin/260924_update_indicator/030_phase3_desktop_update_page.md"; const findings = scanText(path, readFileSync(path, "utf8")); console.log(`target privacy findings: ${findings.length}`); if (findings.length) process.exit(1)'`: exit 0, zero findings. This command reads this file. Repeat `bun run privacy:scan` after main stages the plan so the tracked-file walk includes it. -The proposed page script was parsed directly from this document with `bun -e 'import { readFileSync } from "node:fs"; import { Script } from "node:vm"; const text = readFileSync("devlog/_plan/260924_update_indicator/030_phase3_desktop_update_page.md", "utf8"); const html = text.match(/### NEW `desktop\/ui\/update\.html`[^]*?```html\n([^]*?)\n```/)?.[1]; if (!html) throw new Error("page block missing"); const script = html.match(/