Skip to content

fix: rework connection tests, context capacity, system prompts, Cindy and UI foundation - #206

Merged
HTExplicit merged 47 commits into
mainfrom
fix/admin-rework
Sep 25, 2026
Merged

HTExplicit merged 47 commits into
mainfrom
fix/admin-rework

Conversation

@HTExplicit

Copy link
Copy Markdown
Owner

Summary

Root-cause rework of five admin areas that the v0.2.8-codexrip.8 delivery left wrong or bloated. Each area replaces the
faulty logic instead of patching it; fork deltas against upstream v0.2.8 (fd80b08c9) shrink wherever upstream already has
the capability. Net: 1,510 files, +11k / −298k lines.

1. Connection tests: verbatim upstream errors, streaming batch test

  • Single-account, batch and scheduled tests show the upstream's original error text again (API returned <status>: <body>,
    Request failed: …, stream error/response.failed content). The fixed-text layer from Simplify prompt management and fix proxy input and batch connection tests #205 and the job framework's
    catalog messages are removed; the service log carries the same text.
  • The success criterion stays strict (valid terminal + visible text); failures carry the raw terminal content.
  • Batch test = port of upstream PR 新增批量账号连接测试与模型校验 Wei-Shaw/sub2api#6522 (POST /admin/accounts/batch-test, SSE per-account results,
    BatchAccountTestModal.vue), plus bounded concurrency (10 total, 3 per upstream host), 90 s per account, SSE keep-alive and
    server-side auto model choice (PickConnectionTestModel). The job-based batch test (plans, stamps, snapshots, account-tools
    planning) is deleted; success recovery uses upstream RecoverAccountState.

2. Model context capacity

  • One precedence for every host: custom > this account's upstream declaration > reference catalog > models.dev > unknown.
  • Reference GPT values are the Codex subscription values (gpt-5.5 272K; gpt-5.4 272K/1M; gpt-6-/gpt-5.6- 272K/872K).
  • Group capacity = minimum over active accounts that can serve the model (no schedulable filter; OAuth accounts
    participate). Unknown capacity is no longer fabricated as 200K; image/video/audio models carry no text capacity.
  • One snapshot (upstream_model_metadata, migration 258 folds upstream_model_context_capacities in); paginated
    Anthropic/Gemini sync; vendor-neutral ID normalisation; API-key accounts refresh every 24 h and after credential changes.
  • Fixes: non-OpenAI/Gemini/Grok groups no longer list Claude defaults; the downloadable Codex catalog uses the configured
    client version (GPT-6 entries were filtered by the hard-coded 0.147.0). Self-test contract bumped to version=3.

3. System prompts: small library instead of rules/templates/Skills

  • Prompt library (name, body, prepend/append, role auto/system/developer), one switch, one site-wide default, per-account
    inherit/off/custom (accounts.extra.system_prompt). Stored in one settings row, read from memory (no per-request DB
    queries), fail-open, no prompt_cache_key rewrite, Codex Lite/compact/count_tokens never injected, echo restored.
  • Claude OAuth mimicry returns to the upstream settings and block editor.
  • Migration 259 imports the disabled legacy prompt (behaviour unchanged: nothing is injected) and drops the 12
    template/version/rule/Skill tables; promptskills (459 embedded seed files), 24 retired routes and /skills/... are removed.

4. Cindy becomes an ordinary OpenAI API-key upstream

  • Migration 260: Cindy accounts → openai/apikey (base_url https://api.laxarouter.ai kept), baseline mapping of the
    public free models, group 12 → openai, channel 1 becomes an ordinary priced channel, Cindy tables/columns/triggers dropped.
  • Generic rules: budget_exceeded (HTTP 429 or SSE/WS terminal) puts the account into error with the original upstream
    message; openai_prompt_cache_key_mode (passthrough|sha256_64) is a real account option.
  • Removed: catalog module, free-pool gating, silent alias, health state machine, balance probes, duplicate inventory, group
    split audit, cleanup jobs, alpha search via Cindy, continuation binding, WSv2 bridge, image bridge, 22 routes,
    GATEWAY_CINDY_*, the Cindy page (old path redirects to the "cindy" folder); a "Cindy (Laxa)" preset is added under
    OpenAI → API Key.

5. UI foundation (platform-console language)

  • Tokens, Tailwind mapping, component recipes, shared components and layout follow the platform console: ink-black
    primary actions, green only for success, 5 semantic colour families, radii 4/6/8, shadows and scrim only for popovers and
    dialogs, Geist + Geist Mono (OFL, 67 KB) with system CJK fallback; MiSans (19.9 MB) removed. flat_theme_enabled off
    still renders the upstream look.
  • The regex class sweep is reverted in upstream .vue files (fork-styled upstream files 202 → 78).

Data migrations

  • 258: merges accounts.extra.upstream_model_context_capacities into upstream_model_metadata.
  • 259: settings.system_prompts (switch off, no default), prompt_skills → system_prompt (off only), drops 12 prompt tables.
  • 260: Cindy accounts/group/channel conversion, user_platform_quotas cindy rows deleted, Cindy schema objects dropped,
    API-key auth snapshot version 27.
    These are forward-only; rolling back to an earlier image does not restore dropped tables.

Verification

  • Local (serialized): go build ./..., go vet -tags=unit ./..., go vet -tags=integration ./...,
    golangci-lint 2.13 ./... → 0 issues; vue-tsc --noEmit; focused unit tests and specs per area (see branch commits).
  • Not run locally: PostgreSQL integration tests (migrations 258–260 run in CI), full unit/frontend suites.

🤖 Generated with Claude Code

Codex and others added 30 commits September 25, 2026 18:47
Migration 260 re-platforms Cindy accounts and groups to openai, rewrites
account model_mapping to the public free baseline, turns the managed
Cindy Catalog channel into an ordinary priced channel, drops the Cindy
identity columns, tables, projection/guard triggers and functions, the
cindy_provider_config setting and per-user cindy quotas. The ent schema
loses wire_platform/provider_profile and the cindy_* account fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… verbatim

Connection tests (single, batch and scheduled) report the upstream's own error
text exactly as upstream v0.2.8 does ("API returned <status>: <body>",
"Request failed: <err>", stream error/response.failed messages). The fixed
catalogue layer (transport/HTTP failure types, endpoint labels,
AccountTestSafeFailureMessage, sendAccountTest* helpers) is removed. The strict
completion check stays: a failed terminal carries the upstream terminal content
and wraps the sentinel classes, and the service log line matches the event.

The job-based batch test (plans, stamps, execution snapshots, account-tools
planning, 202 jobs, test_* catalogue entries) is replaced by a port of upstream
PR Wei-Shaw#6522: POST /admin/accounts/batch-test streams per-account SSE results from
RunTestBackgroundDetailed (first-content latency, upstream model, recovery
after success). Additions: at most 10 accounts at once and 3 per upstream host,
a 90 s bound per account, SSE keep-alives, and a server-side automatic model
(PickConnectionTestModel) that the single-test picker also uses as default.
The account-job framework keeps its concurrent executor for Codex ticket and
extension-operation jobs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tState

A successful single, batch or scheduled connection test recovers the account
through upstream's RateLimitService.RecoverAccountState again: an error status
is cleared and recoverable runtime limits are reset, while manually disabled
accounts and the schedulable flag are never touched. The fork's atomic
repository recovery (account_test_recovery.go) had no other caller and is
removed with its integration test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rebuild the theme foundation on the platform-console language instead of
the marketing-site palette:

- styles/theme.css: upstream-equivalent role tokens (canvas, surface,
  subtle, sunk, line/line-strong/line-focus, ink/muted/faint, primary,
  semantic families, radii, popover/overlay shadows, scrim, fonts) plus
  the Tailwind shadow scale defaults.
- styles/flat-theme.css: console values for light and dark (neutral
  canvas #fafafa/#0f0f0f, white/#1a1a1a surfaces, hairlines, ink primary
  actions, green only for success), neutral/dark/primary ramps and the
  five semantic ramps, 4/6/8/12px radii, shadows only for lg/xl/2xl,
  no blur or hover scaling, Geist @font-face.
- tailwind.config.js: every palette, radius, shadow, gradient, blur and
  motion value resolves through a variable with the upstream value as
  fallback (the flat_theme_enabled switch off = upstream look); neutral
  families resolve per role (fill/line/text); red/rose, amber/yellow/
  orange, blue/sky/indigo/cyan, green/emerald/teal/lime and purple/
  violet/fuchsia/pink fold into danger/warning/info/success/purple;
  solid primary fills export --theme-on-fill so text-white follows the
  near-white dark-mode fill.
- Fonts: Geist and Geist Mono 1.7.2 (npm geist, OFL 1.1) as Latin-subset
  variable woff2 (67 KB total); CJK uses system fonts. MiSans (~19.9 MB)
  and its notice are removed; THIRD_PARTY_NOTICES updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Port upstream PR Wei-Shaw#6522's BatchAccountTestModal.vue, batchTestAccounts SSE
client, bulk-bar "test-connection" entry and batchTest locale block. The
modal defaults to the server-side automatic model per account (an explicit
model still filters to the accounts that list it), loads account catalogs at
most 8 at a time, shows each upstream error in full, and adds Stop (closing
the stream stops the run) and Retry failed (re-submits the failed accounts).

The job-based BatchTestAccountModal, its specs and CI entries, the
batch-test job API, the batch branches of AccountOperationProgress and the
account_batch_test task kind are removed. The single-test output-limit note
moves to admin.accounts.testOutputLimited.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ing batch tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n console

Cindy is an ordinary OpenAI API-key upstream (platform openai, base_url
https://api.laxarouter.ai kept per account), so every Cindy-specific screen
and branch goes away:

- delete the Cindy page, balance-probe, duplicate-inventory and group
  audit/split features, the cleanup dialog, the provider settings panel, the
  Cindy APIs, utils/cindyOpenAIDefaults and the Cindy feature locales;
  /admin/cindy-accounts now redirects to the accounts page filtered by the
  existing "cindy" management folder
- drop the cindy platform from constants, colors, icon, badge, types, key
  group providers, channel/composite platform lists and quotas
- accounts list: no Cindy views/counts/column/cleanup/recover action or
  scope prop; details drawer, action menu, status badge and import modal
  lose their Cindy branches (import target group was Cindy-only)
- create/edit: remove the provider-create/provider-edit machinery (managed
  catalog, device ID, edit context, basic-only save, per-platform drafts)
  and restore the upstream platform switch and submit paths; ordinary
  OpenAI edits keep writing only explicitly changed protocol modes
- groups page: remove Cindy audit/split and the Cindy accounts jump;
  settings: remove the risk-page Cindy card and the Cindy image bridge
  switch (Image Studio switch only)
- reasoning policy applies to platform openai only (wire_platform gone)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
OpenAI -> API Key now offers a small "Cindy (Laxa)" preset next to the base
URL. It only pre-fills the visible fields: base_url https://api.laxarouter.ai,
Responses mode force_responses, compact mode force_off and WS v2 off, and
clears the default OpenAI whitelist so the ordinary model area is filled
with the native "sync upstream models" action. The account is created as a
plain platform=openai/type=apikey account.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Pick each account's automatic model only after it holds its upstream-host and
global slots, so a large selection does not evaluate every account's model
support at once, and disable proxy buffering for the batch SSE stream like
the single-account test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- style.css: upstream recipes restored verbatim; a console block keyed on
  :where(.flat-theme) restates buttons (32/28px, 6px, ink primary),
  inputs, cards (hairline, 8px), KPI tiles (mono labels, tabular 18px
  values), tables, badges (soft semantic pills), popovers/menus
  (popover shadow), dialogs (12px, overlay shadow, scrim), sidebar
  (canvas, 32px items, mono section titles), segmented tabs (ink active),
  progress/switch/code; dark twins only where upstream dark: variants
  would win. `ui-decor` hides decorative orbs/grids/tints.
- Shared components and layout are de-swept back to their upstream
  classes, then restyled on purpose: DataTable/TablePageLayout density
  (8/10px cells, 12px uppercase headers, surface header), Select trigger
  = input geometry, Toggle knob hairline, AppHeader 56px with 16px title,
  AuthLayout/AppLayout upstream decorations behind ui-decor.
- Identity hues: platformColors, PlatformTypeBadge and GroupBadge render
  neutral chips while the console theme is on (flatThemeActive), so a
  platform never reads as a status colour; the upstream hues stay for
  the switch-off look.
- Charts: usePresentationColors exposes a 12-colour series palette
  (--theme-chart-series-*); distribution charts and the token trend use
  it, upstream colours remain the fallback.
- tailwind: bg-white follows --theme-on-fill too (switch knobs on
  near-white dark-mode fills).
- DataTable.spec: inactive sort arrows are text-gray-400 (faint) again
  instead of the fork's text-muted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apply artifacts/tmp/admin-rework/ui/desweep/desweep.py (idempotent,
re-runnable after the other areas merge). A class segment takes its
baseline text only when both are identical after removing pure-style
tokens (radius, shadow, blur, gradient stops, neutral/semantic colour
tokens, hover motion, dark primary text), aligned per file:

1. upstream files -> fd80b08 (1,023 segment replacements incl. a few
   <style> colour/radius lines);
2. fork additions and fork-only files -> the pre-restyle fork 54d3675
   where a sweep token (rounded-none, shadow-outline, text-muted, ...)
   remains;
3. rounded-none left in functionally edited strings -> radius of the
   closest baseline segment.

Central files restyled on purpose are excluded (desweep-exclude.txt);
files other areas delete or rewrite (Cindy, batch-test modal, prompt
UI) are skipped. ImageStudioPage and the KeysView provider tile had no
baseline and get their radii by hand.

Result: upstream .vue files carrying fork changes 203 -> 80, vue delta
vs upstream +12718/-3603 -> +11690/-2571, rounded-none/shadow-outline
651 -> 29 (mostly in skipped files). Appearance now comes from the
central token/recipe layer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
System prompts are now one settings row (system_prompts): a small library of
named prompts (position prepend|append, role auto|system|developer), one
global switch and one site default used by every account in inherit mode.
Accounts bind inherit/off/custom in extra.system_prompt. Requests read an
in-memory snapshot and the scheduled account, so sending never queries the
database for prompts.

Each final protocol has one insertion point: Responses instructions or a
developer input item, one leading Chat message, the Anthropic top-level
system (before Claude OAuth mimicry relocates it), Gemini systemInstruction.
Compaction and Codex Responses Lite requests are never injected, failures
forward the request unchanged, prompt_cache_key is not rewritten, and the
echoed instructions are restored to the client's own value.

Claude OAuth mimicry reads the upstream settings again (upstream code
restored, 409 guard removed). Templates, versions, rules, the Skill
registry, frozen public files, retired routes and the promptskills package
are removed. Migration 259 imports inline rule text as library prompts with
the switch off and no default, returns a differing enabled Claude rule to
the upstream settings, and drops the 12 prompt tables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The promptskills package, its seed tree and the fixed prompt capture are
gone, so the bundle validator, the Remote Skill race and closure steps, the
release-time prompt SHA check and its release-note lines, the seed sync
script and the matching .gitattributes rules are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Extensions -> System Prompts now shows one switch, the site default, the
account usage (inherit/off/custom) and the prompt library (name, position,
role, text). Accounts bind inherit/off/custom from the edit form, the row
menu and the bulk bar (up to 1000 accounts); the details drawer entry is
gone. The Settings page gets the upstream Claude OAuth block editor back.
The rule manager, draft/merge composable, history, old APIs, specs and
locale keys are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the rule/template/Skill description with the current model: one
switch, one site default, a small library, account inherit/off/custom,
one insertion point per final protocol, upstream Claude OAuth settings and
migration 259.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…apshot

- Every host resolves a model's context capacity as custom override > this
  account's upstream declaration > reference catalog > models.dev registry >
  unknown. The official-host split, protected accounts and the
  source-identity hash are gone.
- Reference catalog GPT values are the Codex subscription values (gpt-5.5
  272K/272K, gpt-5.4 272K/1M, gpt-5.4-mini and gpt-5.2 272K, gpt-6-* and
  gpt-5.6-* 272K/872K), looked up through vendor-neutral model keys.
- extra.upstream_model_context_capacities is folded into
  extra.upstream_model_metadata with per-model source and observed_at
  (migration 258). The parser also reads OpenRouter top_provider limits.
- A group's capacity is the minimum over its active accounts that can serve
  the model. Unknown capacity is omitted from /v1/models instead of a
  fabricated 200K window; media models never get text capacity.
- Model sync follows Anthropic and Gemini pagination. Active API-key accounts
  are re-synced every 24h (staggered, with backoff) and right after they are
  created or their credentials change; OAuth accounts record the capacities
  of the Codex manifests that pass through.
- Groups of non-Claude platforms list their own default models. The Cindy
  model-list and Codex manifest branches are removed.
- The Codex context contract self-test reports version 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rebuilding input/messages through json.Marshal HTML-escaped the customer's
items, so a retry or reasoning recovery comparing the sent body by bytes
could see a different request. Existing elements are now copied verbatim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Chart series 1 is neutral 600 (light) / 400 (dark) instead of ink, so a
  dominant slice no longer paints a solid black donut; the neutral
  helper colours move to series 7/9/12.
- Dark-mode placeholder text uses the faint token (upstream's
  dark:placeholder variant otherwise wins over the recipe).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The prompt template, Skill registry and rule policy tables they described
are dropped by migration 259; the migration files themselves stay
unchanged and checksum-protected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the loader

The loader rejects names and bodies that are blank under Unicode
whitespace; the migration now skips or renames the same cases instead of
producing a configuration the application would refuse to load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The admin page returns a stored value that no longer validates so it can be
corrected and saved; only valid configurations reach requests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The key modal fetched the Codex manifest with a pinned client_version of
0.147.0, so passed-through ChatGPT manifests dropped every model that needs a
newer client (GPT-6). It now uses /backend-api/codex/models, which the gateway
requests with its configured current Codex version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Capacity sources are custom, upstream, reference catalog and models.dev;
unknown capacity shows no value. OAuth rows are editable like every other
account, and a create-time sync's upstream declaration outranks the
reference catalog in the unsaved preview.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	frontend/src/api/admin/index.ts
#	frontend/src/components/admin/account/AccountDetailsDrawer.vue
…y parser

extractUpstreamModelCatalog keeps upstream's signature and capability
parsing; the strict per-field capacity parser now replaces every synced
model's capacity in one place, which the OAuth manifest recorder shares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	backend/cmd/server/wire_gen.go
#	backend/internal/handler/admin/account_handler.go
Codex and others added 17 commits September 25, 2026 20:23
…h in migration 260

Migrated Cindy accounts get extra.codex_image_generation_bridge=false (the
Laxa endpoint rejects the injected image_generation tool that the Cindy
identity used to suppress), and the stored image_tools_config setting loses
its responses_image_enabled key so only studio_enabled remains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…AI API key

Cindy (Laxa) is now an ordinary OpenAI API-key upstream. Delete the Cindy
provider subsystems and every Cindy branch in the shared backend:

- catalog module, free-pool gating, the gpt-5.4-mini alias, health state
  machine, balance probe jobs, duplicate inventory/review/merge jobs, group
  split/audit, confirmed/banned cleanup, alpha search via Cindy, opaque
  continuation binding, the HTTP to WSv2 bridge, Cindy image models and the
  Responses image bridge, text billing snapshots, provider create/edit
  contracts and the platform identity (wire_platform/provider_profile);
- 22 admin routes plus the Cindy-only edit-context, duplicate review/merge
  and /v1/models/capabilities endpoints;
- the Cindy provider settings, the responses_image_enabled image switch and
  the GATEWAY_CINDY_IMAGE_STUDIO_ENABLED fallback.

Generic replacements:

- budget_exceeded (HTTP 429, or a response.failed/error terminal event) on
  an OpenAI-compatible account sets the account error with the upstream
  message, with no timed recovery;
- extra.openai_prompt_cache_key_mode=sha256_64 hashes prompt_cache_key
  values longer than 64 characters at every Responses send point;
- a structured model_not_supported 400 fails over and cools the account and
  model pair on every OpenAI-compatible HTTP path.

Image Studio keeps its studio_enabled switch but has no model source left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The generic prompt_cache_key option accepts exactly passthrough and
sha256_64 (absent or null keeps the default) on create, update and bulk
update, and a whole-object edit that omits it keeps the stored value.
Its tests now cover the generic option instead of the removed Cindy
normalizer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Migration 260 turns the Cindy group into an OpenAI group. Bumping the
auth snapshot version makes every node reload cached snapshots that still
carry the old platform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rules

Tests of deleted Cindy subsystems (catalog, identity, device fence, edit
fence, balance/health probes, WSv2 bridge, image bridge, alpha search
fallback, Laxa compatibility aliases, strict continuation) are removed.
Tests of shared code keep only their generic cases, and tests whose
contract changed now assert the new behaviour:

- budget_exceeded (HTTP 429 and terminal stream events) puts an
  OpenAI-compatible account into the error state with the upstream message;
- model_not_supported failover and cooldown apply to every
  OpenAI-compatible account;
- Image Studio lists no eligible key until a generic image model source
  exists;
- account import planning keeps only identity matching;
- repository fixtures and sqlmock rows follow the dropped columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backend no longer reads GATEWAY_CINDY_* variables or
gateway.openai_ws.cindy_http_to_wsv2_enabled, so the Compose files,
.env.example, config example, the rollout-defaults shell test and its CI
step, and the removed cindyprovider package in the native domain script go
away. GATEWAY_IMAGE_STUDIO_ENABLED stays as the deploy-time Image Studio
default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Image Studio eligibility checks the key and its image-generation group
  again and is gated by an explicit, currently empty image model source,
  instead of a function that always fails.
- The WS ingress no longer tracks function_call_output for the removed
  strict continuation block; upstream helpers that only served it stay with
  nolint markers for upstream parity, as does the upstream service-tier
  cost helper.
- Fork helpers and test fixtures used only by the removed Cindy code go away.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts in functional frontend files (AccountsView, CreateAccountModal,
EditAccountModal, ModelWhitelistSelector, ImportDataModal, GroupsView,
SettingsView) take the integration side; the de-sweep is re-run in the
next commit. .downstream/native-domains.md keeps both edits. Cindy
removals in PlatformTypeBadge/PlatformIcon/platformColors merged cleanly
with the neutral identity classes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The seven files resolved to the integration side (CreateAccountModal,
EditAccountModal, ModelWhitelistSelector, ImportDataModal, AccountsView,
GroupsView, SettingsView) get their upstream class strings back:
artifacts/tmp/admin-rework/ui/desweep/desweep.py --apply, 301 segment
replacements; a second run changes nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve the integration of batch-test, cindy-frontend, prompts and capacity
with the Cindy removal: the other areas keep their files and designs, Cindy
leftovers are dropped, the openai_prompt_cache_key_mode option moves into
finalizeResponsesForSend, lockAndMergeAccountProbeExtra keeps upstream's two
return values, wire_gen.go is regenerated, and downstream-verify no longer
names deleted Cindy tests or frontend specs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	.downstream/native-domains.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The API keeps upstream's sanitized sync message; the server log now carries
the underlying error so a failed sync can be diagnosed from the ops logs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n override

Migration 260 must not drop enqueue_group_api_key_auth_cache_invalidations,
enqueue_channel_group_scheduler_invalidation or
enqueue_channel_group_cache_invalidations: the managed model route trigger
from 240 still calls them. The ops error classification override only served
the removed capabilities route, so the ops logger returns to upstream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
259 now sets the same lock/statement timeouts as 258/260. 260 drops a
non-boolean openai_long_context_billing_enabled from Cindy rows before
re-platforming them (the 175 trigger would abort the migration), clears the
cindy key from the auth_source_default_*_platform_quotas settings as well,
and documents why the shared invalidation helpers stay. Rehearsed on a
production-shaped database: all three migrations apply, 55/55 trigger
exercises pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@HTExplicit
HTExplicit merged commit 71f056d into main Sep 25, 2026
18 checks passed
@HTExplicit
HTExplicit deleted the fix/admin-rework branch September 25, 2026 16:56
HTExplicit pushed a commit that referenced this pull request Oct 4, 2026
Owner decision of 2026-10-04, like the reasoning fidelity diagnostic this
branch already deletes. The diagnostic was the fork side of one sealed
study (run responses-continuation-repair-20260909, in two rounds): two
test files of internal/handler under the continuation_repair_live build
tag, namely the live test with its three offline tests and the support
file with the fixture that built the OpenAI gateway handler with its
gateway and Ops services over in-memory stores from a frozen snapshot.
No CI step ever built with that tag.

Nothing outside the two files used what they declared, every production
function they called has other callers, and no file carries the build
tag now, so no production code changes. The live test was also the last
code that named an environment switch of the dated studies: besides its
own, it refused to start while the switch of the fidelity study or of
the namespace round-trip study was set. The fork side of that study had
left the tree with #206.

.downstream/upstream-review-v0.2.13.md: the fidelity entry no longer says
that the continuation-repair live test keeps its refusal, a new entry
says what this change deletes and what stays (the Ops continuation
diagnostic and the ordinary unit tests), and the note on the pinned
upstream-risk.json counts the two paths. The history documents of
earlier versions and upstream-risk.json still list them.

Checked: go build -p 2 ./..., go vet -p 2 -tags unit ./internal/handler,
test_upstream_automation_contract.py (16 tests), git diff --check, and a
search of the tree for the build tag, the deleted names and the
environment switches. No test was run: the two files were the only ones
compiled under the tag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HTExplicit added a commit that referenced this pull request Oct 4, 2026
…ored prompts (#244)

259 kept the legacy default rule as a library prompt together with a block that
tells the model to fetch files under /skills/security-research/current/ first.
That public route went away with the remote Skill registry (#206) and now falls
through to the front end, so a client that follows the instruction reads an HTML
page and reports that it cannot read the rules.

Migration 269 removes only that block, recognised by shape: the fenced
paragraph naming the route, the paragraphs after it that still mention
REMOTE_ROOT, and the short fetch instruction directly before it. A prompt whose
route reference sits elsewhere, or that would be empty without the block, is
left as stored and reported with a notice. No other setting or paragraph is
touched and the file can run again.

Co-authored-by: Codex <codex@example.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
HTExplicit added a commit that referenced this pull request Oct 7, 2026
)

The first-party plugin system is gone, but code shaped by it still ran.
This removes it.

Backend
- internal/nativeapi and internal/codexruntime are folded into service;
  the extensionv1 alias, the recovery carrier structs and the identity
  conversion layers are gone. Reasoning recovery keeps its decision order
  and reason strings.
- Building an account's Codex User-Agent cannot fail: the error return and
  its propagation through the send paths are removed.
- Account traffic telemetry is deleted: the Begin/Finish call sites, the
  observer and its Redis cache, GET /admin/accounts/:id/traffic-telemetry,
  the settings switch and gateway.account_traffic_telemetry_disabled.
  Migration 273 removes telemetry_enabled from
  settings.admin_observability_config.
- Fields nobody reads or writes are removed: account_view_facts, the job
  item action, wire_platform and schema_version on the account test plan,
  the job list's kind and created_by filters.

Frontend
- The account-view skeleton is deleted; three dialogs keep discarding late
  answers through a local guard. The account drawer keys its usage cache
  and usage cell by account id.
- The prompt audit page is upstream's.
- /admin/tasks and /admin/cindy-accounts are removed, and the
  duplicate-account review entry whose backend was deleted in #206.
- The settings panel that holds the theme switch is titled Appearance.

A page opened before the deploy needs one refresh: until then the account
test dialog lists no models and saving the Appearance panel fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HTExplicit pushed a commit that referenced this pull request Oct 7, 2026
…pped

THIRD_PARTY_NOTICES.md opened with the notice and MIT licence for the
gpt-5.6-instruct v45 prompt body, which was imported as an inactive template.
The imported file left the tree with the prompt library rework (#206). Checked
by hash and by line, without reading the text: the file at the import commit
has the SHA-256 the notice records; no tracked file has that hash and none
contains any of its lines, also not in SQL or JSON escaping.

The image copies this file to /app/THIRD_PARTY_NOTICES.md. The Geist and
Lucide notices, for fonts and icons the frontend still bundles, are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant