Repository navigation
Conversation
…is private, leaving one public validate_session_ownership (#14016)
…ture for the file routes, and an unreadable owner denies (#14016)
… a fail-closed owner lookup (#14016)
… reference and every route with no check (#14016)
…string owner denies (#14016)
…, keeping its empty-owner deny (#14016)
… call and an awaited check per route, and resolves aliases (#14016)
…gainst a second (#14785)
…14785) Adds the Refined palette (light, dark, contrast, mono) and the grid, table, form and tooltip sizes to design-tokens.css and themes/, with the existing --bg-*, --text-*, --border-* and card/table/input names resolving to the Refined names through themes/refined-map.css. Tailwind aliases, the token catalogue and the name-by-name mapping (docs/design) ride along. Refs #18223
…#14785) useTheme accepts dark, light, contrast, mono and system; the data-theme attribute stays on <html> and useUserStore applies the same set, with contrast and mono rendering the light color-scheme. The theme presets and the per-theme icons move to their own modules, so ThemeToggle and ThemePresetPicker share one icon record instead of two copies. The two file-size ceilings are lowered to match. Refs #18223
…red token names (#14785) The SLM control plane gets its teal scheme and dark identity bar in every theme (light, dark, contrast, mono) from slm-scheme.css, with the same token names as the user frontend and its own values. Its --a11y-* set now derives from the scheme; the legacy high-contrast theme is untouched. Refs #18223, #17566
… spacing (#18161) The ember red/orange primitives return to the default palette in the base and are restated only behind [data-theme-variant="ember"]; ember is no longer the default variant (VITE_DEFAULT_THEME_VARIANT=ember restores it). The density scope now sets the spacing scale and the table and card tokens as one list, entered by the attribute or a .density-* class on any ancestor (#17564), and a test pins that every scope sets the same names. Refs #18223, #14785, #17564
…14785) The two copies of aui-theme.css (one per app, 142 differing lines, each mapping the kit contract onto names only its own app defined) become libs/autobot-ui/src/tokens/adapter.css, which maps --aui-* onto the shared semantic names and holds no value. The SLM defines the names it lacked in slm-scheme.css; the user frontend gains --focus-ring-width. vue-notus.css gives its palette-primitive :root block to design-tokens.css, so the base token source is that one file plus the per-theme overrides. Refs #18223, #17566
…d guard against a repeat (#17613) main.css was imported by nothing. The load-failure banner three LLC views use, the RTL code-direction rule, the touch-target rules and the phone-width header rule move into css/components.css. Removed as dead, each with its evidence: .sr-only (identical in base.css), .sr-only-focusable (no template references it since the skip links became the kit's SkipLink) and the RTL .chat-sidebar rule (no element carries the class). The new ds-unloaded-stylesheet rule fails on any stylesheet under either assets tree that no file imports. Refs #18223
….css exempt (#14579) libs/autobot-ui was in neither the trigger paths nor the diff filter, so its CSS was never linted, with or without the stale ignore entry #14554 removed. It gets its own .stylelintrc.json (src/tokens/contract.css, the token definition site, ignored) and a step that runs the user frontend's pinned stylelint with --config-basedir, so no ad-hoc install is needed. Refs #18223
…t in both apps (#14580) A new ratchet freezes the Tailwind palette classes written into .vue templates (bg-red-50 and friends: they bypass the tokens and cannot follow a theme), keyed by class literal with the SLM kept apart, with a failure message that names the token to use. The existing !important ratchet now covers autobot-slm-frontend as well. DESIGN_SYSTEM.md states which check owns which form of local override. Refs #18223, #17567, #17566
…d both apps (#14775) SemanticVariant, BaseBadge, BaseButton and the --aui-color-* contract say error, not danger; the nine user-frontend call sites and the SLM's --color-danger-500/600, bg-/text-/border-danger-* and btn-danger follow. The SLM defines the user frontend's whole --color-autobot-* set in its @theme with its own values (the contract names it lacked get SLM definitions), and a canonical rule fails when the two sets differ in either direction. The --color-danger token family in the user frontend is a separate colour, not a rename, and stays. Refs #18223, #17566
…s the default accent (#18223) The Refined handoff names Light the default and says nothing about following the OS on first run, so a fresh install is light (system stays selectable). A new 'theme' accent sets no data-accent, which lets the theme's primary stand; it is the default, and the accent presets remain selectable. The account preferences accept theme and the contrast/mono themes (they would have been rejected with a 422), and default to light and theme. Ember stays a selectable variant, no longer the default (#18161); VITE_DEFAULT_THEME_VARIANT=ember still restores it. Refs #14785, #18161
…epaint contrast or mono (#18223) The Refined link colour equals the text colour (--link = --text, hover --link-h), so colour alone no longer marks a link (WCAG 1.4.1): base.css underlines unclassed anchors and .prose / .message-text links and takes --text-link-hover on hover. Ember's no-theme surface rule is scoped away from contrast and mono with :where(:not(...)), keeping its specificity; a cascade test evaluates the selector against a real <html>, and pins the link rule. Refs #14785, #18161
…-tree tests their real budget (#14785) ds-duplicate-base-declaration re-parsed every stylesheet for each stylesheet it checked (3.3s for 19 files); it now computes the sites once per tree and reuses them until a stylesheet's size or mtime changes (0.5s). The two runner tests that spawn a whole-tree run had the default 5s, which the import-graph rule added in #17613 exceeds; they now state a 60s budget. Refs #18223
…n all 11 locales (#14785)
…e first paint, SLM links keep a non-colour cue (#14785)
…n canvas, scrubbed (#18238)
…they get the whole-tree budget (#14785)
…tector's *.vue sweep (#14580)
…e-event writer and RS256 prefix (#17856)
…cord density-scope fragmentation growth (#14785)
…M ar/fa/he/ur locales (#14785)
…posture contract lives in session_posture's docstring so the doc stays at its 160-line cap (#14016)
…term, so the SLM lift keeps it translated (#14785)
…on turn; transcripts are read-only legacy (#18293)
… relaxation; derive the seven remaining tool tables from the catalogue (#18294)
…ssion delete clears the LLM-context cache, docs name chat_sessions the record (#18293)
…tribute instead of adding .density-* classes, and the fragmentation ratchet goes down, not up (#14785)
…r does not durably own; admin route 403s; location from SSOT config (#18293)
…cy-only id cannot be taken, and deploy templates pin the location (#18293)
…no chat_sessions turns starts with empty context (#18293)
…ion-turn-store # Conflicts: # repo_tests/reach_scope_claim_17844_test.py
…s, and re-pin three floors mid-window after the tree grew (#18293)
… longer fails in every pre-push (#17844) main went red on reach_scope_claim_17844 when run alone, which the pre-push hook does on any repo_tests change, so every push was blocked. Root cause: the test imported a hand-kept list of guard modules; the #18295 train fixups recorded scopes whose modules it never imported, and a full run hid it because other tests imported them first. Fixed as a class: the test imports repo_tests.reach_declarations_test, whose _import_every_guard() loads every guard, so the live set is the same alone as in a full run and no hand list can drift again. With the full registry visible, two gaps of #18310 surfaced and are recorded: the tool-effect-table-scan scope, and its ALLOWANCE_VERDICTS row. collectable-modules-inert-on-import re-pinned mid-window (population 2922, window [2722, 2922]) after the tree grew. reach_scope_claim alone: 10 passed; reach_declarations + reach_scope_claim: 505 passed.
…cope class fix and floors supersede #18309's in-branch lines)
…class fix exposed it (#18293) Measured on this train tree (main + train-2 + #18309 + #18318): - kb-admin-read-bypass 2650 (population 2750), model-revision-pinning-sweep 2984 (3084), credential-field-name-only-callers 6384 (6534), each pinned mid-window. - conversation-turn-single-store (#18309) scope recorded; it was hidden until reach_scope imported the full REGISTRY (train-2 class fix). #18309s own reach_scope imports and floor re-pins are superseded by train-2s class fix. reach_declarations + reach_scope_claim: 511 passed.
|
Important Review skippedToo many files! This PR contains 365 files, which is 265 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters (5)
📒 Files selected for processing (365)
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
✅ SSOT Configuration Compliance: Passing🎉 No new hardcoded values of either class — Known backlog in |
| def legacy_transcript_file(session_id: str) -> Path | None: | ||
| """The existing legacy transcript of *session_id*, or None (none, or an unsafe id).""" | ||
| path = _transcript_path(session_id, None) | ||
| return path if path is not None and path.is_file() else None |
|
Superseded. #18318 is folded into #18309 (one PR, one agent: mutually dependent, same file), and train #2 (#18314) has merged. Train #3 will be rebuilt as #18309 alone on main 5efe902 once its fix round lands. This branch's CI run did its job: it exposed the #18309 × #18318 × #18258 interaction reds early. |
Thinking Path
Merge train #3, under the owner decision of 2026-10-11 (see #18295). It is stacked on train #2 (#18314), which is stacked on the merged train #1, so this CI measures
main+ train #2 + this train. Merge this only after #18314 is merged. It lands with a merge commit, so every constituent head reachesmain.It is a priority train: #18318 fixes a bug users can see (
DELETE /chats/{id}reported success and deleted nothing). It delegates to the canonical session-delete handler that #18309 rewrites, so #18309 goes first.What Changed
Constituents (
#PR @ approved head), in order:DELETE /chats/{id}awaits the one canonical delete implementation, with ownership validated throughvalidate_session_ownership.Train-only commits:
repo_tests/reach_scope_claim_17844_test.pyand floors: train Docs improvements #2 fixed the run-alonereach_scope_claimfailure once as a class (it imports the full registry), which supersedes refactor(chat): chat_sessions is the one durable home of a conversation turn; transcripts are read-only legacy, found where they really are (#18293) #18309's two in-branch imports and three floor re-pins. This train re-pins kb-admin-read-bypass 2650, model-revision-pinning-sweep 2984 and credential-field-name-only-callers 6384 from a measurement on this tree, and records refactor(chat): chat_sessions is the one durable home of a conversation turn; transcripts are read-only legacy, found where they really are (#18293) #18309'sconversation-turn-single-storescope.repo_tests/python_file_size_ratchet_baseline.py,scripts/python_file_size_known_large.py) take both shrinks:chat.py2776 (fix(chat): DELETE /chats/{id} deletes again — it delegates to the one canonical session delete (#18316) #18318) andchat_sessions.py1938 (refactor(chat): chat_sessions is the one durable home of a conversation turn; transcripts are read-only legacy, found where they really are (#18293) #18309), equal to the measured line counts of the merged files.Closes #18293
Closes #18316
Refs #18315
Verification
wc -lof the merged files.Model Used
Claude Opus 5.5 (merge orchestration). Constituent reviews used Opus (#18309) and the merger directly (#18318).
🤖 Generated with Claude Code