- Installed host dependencies
docker.ioanddocker-compose, started the Docker daemon, and verified managed-local Onyx can run on this Debian 13 ARM host. - Hardened
server/services/onyxLifecycleService.jsso managed installs no longer use the brittlecurl | bashTTY path. It now downloads the real Onyx installer file, runs it non-interactively in Lite mode, detects the nestedonyx_data/deploymentlayout, falls back tosudo dockerwhen the current process lacks socket access, and preserves the Lite overlay on stop/start. - Verified end to end with
node server/cli.js onyx-install,onyx-stop,onyx-start, andonyx-detect. Current healthy endpoint:http://127.0.0.1:3000/api/health.
- Added repo-level Onyx lifecycle CLI commands in
server/cli.jsand root scripts inpackage.json:onyx:detect,onyx:install,onyx:start,onyx:stop,onyx:restart. - Team Chat and quote-thread AI now surface clearer inline product errors when Onyx is unavailable instead of only failing through generic request toasts.
- Managed-local Onyx detection is working, but this machine currently reports
docker not found, so local Onyx install/start remains blocked until Docker is available.
- Added app-managed local Onyx lifecycle support via
server/services/onyxLifecycleService.js. - BadShuffle can now detect, install, start, stop, restart, and auto-start a local Onyx companion service.
- External Onyx remains available as a separate selectable mode in Settings.
- Admin System now exposes Onyx runtime diagnostics and controls.
- Settings now include Onyx mode, managed-local install path/port, local autostart, and external enablement.
- Root and client package versions are now set to
0.0.12. AI/Next-Release.mdhas been rewritten around the real local delta vs GitHuborigin/master.AI/FEATURES/V0_0_12_RELEASE_PREP.mdis the concise release checklist.AI/FEATURES/V0_0_12_COMPARE_TO_GITHUB.mdnow records the exact GitHub baseline, release-scope file counts, and remaining tag blockers.- Before tagging, do not treat
logs/orrust-core/target/as release-source files. - Current release-scope comparison, excluding runtime/build output:
- modified tracked files:
72 - new untracked release-source files:
46 - total release-scope entries:
118
- modified tracked files:
v0.0.12scope now explicitly includes the later local work that was missing from the earlier release draft:- Clients and Venues directory pages
- Team Chat and quote-thread AI assist via Onyx
Current orchestration for BadShuffle work as of 2026-03-31.
rust.md is now being used as the guide for v0.0.12 Rust Engine Core, but adapted to the real BadShuffle stack.
State:
- Rust workspace added under
rust-core/ - Node remains the primary backend
- SQLite remains the system of record
/api/availability/quote/:quoteId/itemsand/api/availability/quote/:quoteIdnow have a feature-flagged Rust integration seam with fallback and shadow logging
Still required before calling the milestone stable:
- compile and verify the Rust workspace
- widen parity-check coverage beyond one-off quote compares
- build parity fixtures or CI-style gates for
quote items,quote summary, andconflicts - decide whether to surface Rust engine status in the admin UI or keep it API-only for now
Latest parity signal:
- batch compare tooling now exists for live quotes
- local run over quote ids
4,8, and10returned:summary_mismatches: 0item_mismatches: 0errors: 0
- item-level compare flags now exist for section-heavy / unsigned-change quotes:
--include-items--item-limit-per-quote
- local item-level run over quote ids
4,8, and10with--include-items --item-limit-per-quote 5also returned:summary_mismatches: 0item_mismatches: 0errors: 0
- standard parity report command now writes
AI/reports/rust-parity-latest.md - latest standard preset run checked quote ids
4,8,10, and12and returned:summary_mismatches: 0item_mismatches: 0errors: 0
- Admin System tab now shows:
- Rust engine health/readiness/mode/url
- a live parity snapshot over the standard batch preset
- local full-stack Rust dev command:
npm run dev:stack
- release parity guard:
npm run check:rust:release- root
npm run packagenow runs the Rust parity guard before packaging - root
npm run releaseinherits the guard throughpackage - escape hatch for local override:
SKIP_RUST_RELEASE_GUARD=1
- parity artifacts:
- markdown:
AI/reports/rust-parity-latest.md - json:
AI/reports/rust-parity-latest.json - packaged copies:
dist/release-checks/ - packaged manifest:
dist/release-checks/manifest.json
- markdown:
Use the AI agents as a coordinated team, not as independent parallel streams. The goal is to keep shipping small, correct changes quickly while preserving product/design quality.
Codex is the default starting agent for almost all tasks.
Use Codex for:
- small edits and tweaks
- bug fixing
- route / schema / UI wiring
- feature implementation
- debugging and verification
- keeping momentum on concrete problems
Codex is the main problem solver for this repo.
Use Claude for:
- product/design judgment
- UI/UX direction
- reviewing implementation quality
- rewriting specs, flows, and handoff docs
- planning larger changes before implementation
- sanity-checking whether a solution is clean, coherent, and user-friendly
Claude should usually not be the first stop for small code edits. Claude is best used to define the shape of the work or review what Codex produced.
Use Cursor for:
- implementation when Codex gets stuck
- alternate execution on bugs that resist one agent
- polishing UI behavior after a plan or review exists
- fast code pass after Claude defines design direction
Cursor is the best “change the approach and try again” agent when the first implementation path stalls.
- Start with Codex.
- If the task is mostly design/product judgment, ask Claude first for direction, then send implementation back to Codex.
- If the same bug has been prompted to one AI more than 2 times without landing cleanly, switch agents.
- If Codex ships a change but the result feels visually or product-wise weak, send it to Claude for review.
- If Claude gives a plan/spec, use Codex to execute it unless Cursor is clearly a better fit for the specific code pass.
Switch away from the current AI when:
- the same bug has been attempted more than 2 times with no clean fix
- the agent is looping on the same diagnosis
- the change is technically correct but product quality is questionable
- the requested task is better matched to another role
Preferred escalation order:
- Codex stuck on implementation: Move to Cursor for an alternate implementation pass.
- Codex solution works but looks/feels wrong: Send to Claude for design review, then back to Codex for execution.
- Claude plan is vague or too abstract: Return to Codex with a narrower concrete implementation target.
- Cursor patch works but needs product cleanup: Send to Claude for review.
Recently landed and now considered current:
-
quote assistant foundation:
- persistent quote-scoped assistant transcripts (
quote_agent_messages) - authenticated
/api/ai/quotes/:id/assistantread/write endpoints - provider abstraction with OpenAI synthesis and non-LLM fallback mode
- Quote Detail
Assistanttab for operator-facing, read-only quote help - initial tool registry covering quote overview, financials, inventory pressure, recent activity, item recommendations, and follow-up drafting
- persistent quote-scoped assistant transcripts (
-
first-pass role/page permission framework with
roles+role_permissions -
seeded
workerrole plus first permission-aware route/client gating pass -
Admin Roles tab for creating custom roles and assigning
none/read/modifymodule permissions -
fulfillment framework with item check-in state, internal fulfillment notes, and a new project detail Fulfillment tab
-
availability now continues reserving fulfilled quantities until manual check-in, even after project close
-
self-service user profiles with first/last name, phone, email, photo, and bio
-
distinct generated
usernameanddisplay_namefields, with first/last name now treated as the primary user identity -
protected
/profilepage plus full-profileGET/PUT /api/auth/me -
team roster cards upgraded from email-only identity to profile-driven names/photos/usernames/details
-
Sharp-based image compression for new uploads with
thumb/ui/largevariants, optional AVIF mirrors, and settings-driven quality control -
upload processing now skips images under 200 KB to avoid small-file bloat, supports a settings toggle for compression, supports a separate auto-WebP toggle, and uses a faster image-encoding profile during processing
-
Team workspace with persistent presence, YTD staff sales totals, quote counts, and recent-project roster cards under
Directory -
quote item sections with titled multi-area quote builders
-
per-section rental date ranges
-
section-aware availability windows with signed item snapshots
-
public quote grouping by section with titles, date ranges, descriptions, and subtotals
-
section-aware export / print / signed PDF rendering
-
latest-live-state public quote reload after approve/sign actions
-
settings-backed event types
-
optional project title city suffix setting
-
unsigned-change balance handling using signed totals/balances
-
signed contract PDF artifacts with signature event history
-
signature audit hardening: signer user-agent, quote snapshot hash, immutable signed artifact attachments, and
/api+/api/v1parity on public approval/signing rules -
server-side pagination and batched totals on the projects list
-
lazy-loaded
QuoteDetailPageandPublicQuotePagesecondary panels -
abortable/deduped client requests plus budget-aware route prefetching
-
inventory/files virtualization and quote-builder row memoization
-
sales pipeline analytics dashboard with React Query, Recharts, filter rail, hover breakdown panel, and historical/forecast KPI splits
-
Mapbox-powered
/mapsworkspace with clustered quote/booked/closed pins and persisted quote geocode cache fields -
sidebar/navigation recently reorganized around the maps rollout:
MapsbelowProjects,MessagesaboveInventory,InventorybelowDirectory, standaloneBillingbelowFiles, andExtensionmoved underSettings -
quote ownership via
quotes.created_byfor staff-aware analytics filtering -
ARCH-1route/service extraction is now materially advanced across quotes, items, files, and leads -
ARCH-2DB-layer split is now materially advanced across schema, migrations, defaults, metadata, shared queries, and the first repository boundary
Still genuinely open:
- formal e-sign / compliance review beyond the current internal audit trail
- permission-system migration follow-through on the remaining legacy route domains and page actions
- worker/read-only project-detail polish beyond the current fallback presentation
- section reordering
- custom-item description editing workflow
- richer signed contract history UX beyond the current Files tab labels/locks
- legacy image-library backfill / optional reprocessing for older pre-variant uploads
- remaining mobile / cross-theme QA and follow-up polish
- focus-trap / color-indicator accessibility follow-up
- deeper architecture follow-through on remaining route domains, client data/cache, and quote-editor state
- quote assistant settings UI + richer operational tools (availability, fulfillment, message digest)
For the detailed product state, see:
ai/HANDOFF.mdai/STATUS.mdai/TODO.mdai/KNOWN_GAPS.mdai/DATA_MODELS.md
- the task changes 1-5 files
- the bug is concrete
- the request is a feature tweak
- the request is “debug this”, “fix this”, “move this”, “wire this up”
- the task needs terminal verification
- the task is “how should this work?”
- the user wants redesign, UX thinking, or product tradeoffs
- the feature needs naming, structure, or workflow definition before coding
- the work needs a review memo before implementation
- Codex already failed twice
- the code path is awkward and needs a fresh implementation attempt
- the task is mostly UI polish with an already-known target
- Keep
ai/TODO.mdin true priority order. - After a meaningful workflow or architecture change lands, update
ai/STATUS.md,ai/HANDOFF.md, andai/DATA_MODELS.mdif schema changed. - Remove stale notes instead of stacking contradictory history on top of them.
- Treat Codex as the default engine unless there is a clear reason not to.
AI/reports/code-audit.md is now complete — 2016 lines covering all divisions:
| Division | Status | High-Priority Issues |
|---|---|---|
| Security | ✅ Complete | JWT fallback secret, extension token over-permissioning, BOLA on ID routes, bearer tokens in query strings |
| Backend / Scalability | ✅ Complete | N+1 queries in quote listing, missing pagination, delivery fee calculation in loops |
| Frontend / Architecture | ✅ Complete | QuoteDetailPage 1550-line God component, duplicated file-fetch hooks, missing useCallback on prop handlers |
| Maintainability | ✅ Complete | Duplicate price logic, scattered totals calculation, inline modal helpers |
| Design | ✅ Complete | Hardcoded colors in 5+ module files bypassing CSS variable theme system |
| Layout / Responsiveness | ✅ Complete | FilesPage grid overflow on small screens, inspect panel has no mobile layout |
| Observability | ✅ Complete | 8 empty catch blocks on critical DB ops, no request logging middleware, no uncaughtException handlers |
| UX Quality | ✅ Complete | Silent false-empty states on conflict/messages/settings load failures |
| Developer Experience | ✅ Complete | Missing return in ai.js route (hanging requests), no ESLint, no lint scripts, wrong APP_URL in .env.example |
| Documentation | ✅ Complete | Undocumented env vars, missing API response shape docs |
Top actionable items for Codex/Cursor:
-
server/routes/ai.js— AddedreturnbeforefallbackSuggest()in catch block to prevent hanging requests. -
server/services/emailPoller.js— Addedconsole.errorlogging to the previously silent catch paths. -
server/routes/quotes.js— Addedconsole.errorfor contract-log write failures and quote-list payment-total aggregation failures. -
server/index.js— Addedprocess.on('uncaughtException')andprocess.on('unhandledRejection')handlers. -
/.env.example— FixedAPP_URLport to3001and added current runtime override vars. - CSS modules — Replaced the remaining audit-target hardcoded status/action colors with theme-aware variables and derived semantic tokens.
-
client/src/pages/QuotePage.jsx— Conflict load catch now logs the failure and explicitly preserves previous state.
Full plan in AI/reports/redesign-plan.md.
Wave 1 completed:
- Noir dark theme added as 5th theme (
data-theme="noir") — deep blue-black palette, glow shadows, vibrant pastels, Inter font, 10px radius - 7 critical
flex-wrapfixes applied to action bars (AdminPage, SettingsPage, VendorsPage, InventorySettingsPage, MessageSettingsPage, QuoteDetailPage, QuoteCard)
Wave 1 remaining (hand to Codex or continue here):
Layout.module.css→ max-width 1400px on.mainInnertheme.css.btn→white-space: nowrap,justify-content: center, refined sm paddingStatsBar.module.css,DashboardPage.module.css→ fixed-width elements to min/max-widthBillingPage.module.css→ search width responsiveAuthPage.module.css→ login card max-width constraint
Wave 2–3: typography system, QuoteBuilder mobile, component extraction — see redesign-plan.md §7–8.
If there is no special context, start with Codex.
Implemented on 2026-03-31.
Follow-up pass on 2026-04-01:
- assistant context widened so it can see quoted item quantities and stock levels
- recommendation prompt now includes quote/venue/section context plus current quoted quantities
- Quote Assistant panel now shows a quote snapshot and visible item chips
- clear-history action moved onto a dedicated
/api/ai/quotes/:id/assistant/clearpath for reliability
Files added:
server/services/agent/itemSuggestionService.jsserver/services/agent/agentProviderService.jsserver/services/quoteAssistantService.jsclient/src/components/QuoteAssistantPanel.jsxclient/src/components/QuoteAssistantPanel.module.cssAI/AGENT_ASSISTANT_PLAN.md
Files changed:
server/routes/ai.jsserver/db/migrations/quotes.jsclient/src/api.jsclient/src/pages/QuoteDetailPage.jsxAI/TODO.mdAI/HANDOFF.md
Important notes:
- the assistant is intentionally read-only
- it persists transcript messages per quote, but there is no delete/export UI yet
- only OpenAI is live-wired today; the abstraction is there so more providers can be added cleanly
- the assistant uses domain tools first and LLM synthesis second
Suggested next owner:
- Codex for availability/message/fulfillment tool expansion
- Claude for sharpening assistant UX wording and action-approval design before enabling mutations
Implemented on 2026-04-02.
scripts/postpackage.jsnow writes a packaged RELEASE-CHECKS.md summary intodist/- the packaged manifest.json remains the machine-readable source of truth for Rust parity metadata
- packaged outputs now clearly include both human-readable and machine-readable release-check artifacts
Files changed:
scripts/postpackage.js
Verification:
node -c scripts/postpackage.jsnode scripts/postpackage.js- verified
dist/RELEASE-CHECKS.md - verified
dist/release-checks/manifest.json
Suggested next owner:
- Codex for optional installer/about-screen surfacing of release-check metadata
Implemented on 2026-04-02.
- admin diagnostics now expose packaged Rust release-check artifacts through
/api/admin/diagnostics/rust-engine/release-checks - the System tab shows packaged parity metadata, package timestamp/version, artifact paths, and the packaged
RELEASE-CHECKS.mdsummary - when
dist/has not been built yet, the admin panel falls back to the latestAI/reports/rust-parity-latest.jsonpayload instead of showing nothing
Files changed:
server/routes/admin.jsclient/src/api.jsclient/src/pages/AdminPage.jsxclient/src/pages/AdminPage.module.css
Verification:
node -c server/routes/admin.jsnpm --prefix client run build
Suggested next owner:
- Codex for optional release-check download/export actions or About-page surfacing
Implemented on 2026-04-02.
- the admin System tab can now trigger a fresh Rust parity run without leaving the app
- manual parity runs overwrite the standard
AI/reports/rust-parity-latest.{md,json}artifacts so admin and CLI share the same "latest" report - operators can now download the packaged parity JSON and packaged
RELEASE-CHECKS.mdsummary directly from the admin UI
Files changed:
server/routes/admin.jsclient/src/api.jsclient/src/pages/AdminPage.jsx
Verification:
node -c server/routes/admin.jsnpm --prefix client run build
Suggested next owner:
- Codex for optional per-quote parity drilldown or a release-check history timeline
Implemented on 2026-04-02.
- the admin Rust parity snapshot now has an
Inspectaction per quote - quote drilldown loads the full compare payload through the existing quote-compare endpoint and shows summary/item match state, compact diff counts, and raw mismatch payloads when present
- the drilldown is read-only and uses the same quote comparison service already used by CLI and admin diagnostics
Files changed:
client/src/pages/AdminPage.jsxclient/src/pages/AdminPage.module.css
Verification:
npm --prefix client run build
Suggested next owner:
- Codex for adding quote links/item labels inside the drilldown instead of raw ids only
Implemented on 2026-04-02.
- the Rust parity compare payload now includes quote metadata and item titles
- the admin drilldown now shows quote names/status, links directly into
/quotes/:id, and displays changed item titles instead of only raw ids - compact diff summaries now carry labeled
changed_itemsarrays for both summary and item mismatches
Files changed:
server/services/rustInventoryParityService.jsclient/src/pages/AdminPage.jsxclient/src/pages/AdminPage.module.css
Verification:
node -c server/services/rustInventoryParityService.jsnpm --prefix client run build
Suggested next owner:
- Codex for linking individual changed items to inventory detail pages or surfacing section labels in compare payloads
Implemented on 2026-04-02.
- the Rust parity compare payload now includes optional section metadata and a resolved target date window
- the admin drilldown shows section title, target window, and links changed items directly to
/inventory/:id - changed item lists now render as linked item labels instead of plain text
Files changed:
server/services/rustInventoryParityService.jsclient/src/pages/AdminPage.jsxclient/src/pages/AdminPage.module.css
Verification:
node -c server/services/rustInventoryParityService.jsnpm --prefix client run build
Suggested next owner:
- Codex for surfacing legacy-vs-Rust reservation source details like reserved/potential/set-aside totals per changed item
Implemented on 2026-04-02.
- the admin diagnostics API now exposes
POST /api/admin/diagnostics/rust-engine/start - the System tab can now start the Rust engine directly, then refresh health/readiness automatically
- Rust diagnostics now show the manual start command, tracked PID, last start timestamp, and the engine log path at
logs/rust-engine.log
Files changed:
server/routes/admin.jsclient/src/api.jsclient/src/pages/AdminPage.jsx
Verification:
node -c server/routes/admin.jsnpm --prefix client run build
Suggested next owner:
- Codex for optional stop/restart controls or streaming the Rust log into admin diagnostics
Implemented on 2026-04-02.
- Rust engine lifecycle is now handled by a shared
rustEngineLifecycleService - the server will auto-start the Rust engine on app boot when
rust_autostart_enabledis on - Admin System settings now include a
Auto-start Rust engine on app startuptoggle - Admin Rust diagnostics now include a
Stop Rust enginebutton for debugging - stop is intentionally limited to Rust processes started by BadShuffle itself; externally started Rust processes are shown as running but cannot be force-stopped from Admin
Files changed:
server/services/rustEngineLifecycleService.jsserver/index.jsserver/routes/admin.jsserver/db/defaults/app.jsclient/src/api.jsclient/src/pages/AdminPage.jsx
Verification:
node -c server/services/rustEngineLifecycleService.jsnode -c server/index.jsnode -c server/routes/admin.jsnpm --prefix client run build- live lifecycle smoke test against
rustEngineLifecycleService
Suggested next owner:
- Codex for optional restart action or external-process attach/detach support
Implemented on 2026-04-02.
- added a new Rust
pricing-enginecrate for quote totals calculation - exposed
POST /engine/pricing/checkfrom the Rust API - added Node-side pricing parity comparison through
rustPricingParityService - added admin diagnostics route
GET /api/admin/diagnostics/rust-engine/pricing/:quoteId - updated Node quote totals to expose
taxableAmountso pricing parity compares the full totals shape
Files changed:
rust-core/Cargo.tomlrust-core/crates/api/Cargo.tomlrust-core/crates/api/src/main.rsrust-core/crates/shared-types/src/lib.rsrust-core/crates/pricing-engine/Cargo.tomlrust-core/crates/pricing-engine/src/lib.rsserver/services/rustEngineClient.jsserver/services/rustPricingParityService.jsserver/services/quoteService.jsserver/routes/admin.jsAI/TODO.mdAI/Next-Release.md
Verification:
cargo check --manifest-path rust-core/Cargo.tomlnode -c server/services/rustPricingParityService.jsnode -c server/services/rustEngineClient.jsnode -c server/routes/admin.js- live smoke test on temporary Rust port
3102:POST /engine/pricing/checkfor quote4returned totals- Node parity compare for quote
4returnedmatch: true
Suggested next owner:
- Codex for adding pricing parity visibility to the Admin Rust panel and extending pricing inputs to section-level totals or snapshot signing use cases
Implemented on 2026-04-02.
- the Admin Rust quote drilldown now also loads quote pricing parity for the selected quote
- pricing parity shows match/mismatch state plus subtotal, delivery, custom item, adjustment, taxable amount, tax, and total values from the Rust side
- when pricing mismatches occur, the drilldown now renders both the pricing diff and the full legacy-vs-Rust totals payload
Files changed:
client/src/api.jsclient/src/pages/AdminPage.jsx
Verification:
npm --prefix client run build
Suggested next owner:
- Codex for adding a dedicated pricing parity batch snapshot or wiring a feature-flagged Rust totals path into quote detail
Implemented on 2026-04-02.
- added batch pricing parity comparison support in
rustPricingParityService - added
GET /api/admin/diagnostics/rust-engine/pricingfor multi-quote pricing parity snapshots - the Admin System tab now shows a Rust pricing snapshot card with quotes checked, mismatch count, error count, and per-quote pricing match state
- pricing snapshot rows reuse the existing quote inspect flow so availability and pricing drilldown stay aligned
Files changed:
server/services/rustPricingParityService.jsserver/routes/admin.jsclient/src/api.jsclient/src/pages/AdminPage.jsx
Verification:
node -c server/services/rustPricingParityService.jsnode -c server/routes/admin.jsnpm --prefix client run build
Suggested next owner:
- Codex for wiring a feature-flagged Rust quote totals path into quote detail or adding a pricing parity report artifact similar to inventory parity
- Consolidated Rust scope around the two active engine domains only: inventory availability/conflicts and quote pricing.
- Added
server/services/quotePricingCore.jsso legacy totals math has one reusable core instead of being embedded only inquoteService. - Added
server/services/quotePricingEngineService.jswith:USE_RUST_PRICINGRUST_PRICING_SHADOW_MODE- Rust pricing fallback to legacy
- mismatch/fallback diagnostics via
diagnostics.recordErrorTrail
- Wired Rust pricing into:
- public contract signing totals in
quoteService.signPublicContract - quote assistant financials tool
- public contract signing totals in
- Updated Rust engine status to expose pricing feature-flag state.
- Added Rust engine capability probing in
server/services/rustEngineLifecycleService.js. - Admin Rust diagnostics now distinguish:
- service health
- inventory route availability
- pricing route availability
build_state(currentvsoutdated_or_prepricing)
- Added
POST /api/admin/diagnostics/rust-engine/restartand Admin UI support forRestart Rust engine. - Important current runtime state:
- the live Rust process on port
3101is healthy - inventory route is present
- pricing route returns
404 tracked_pidisnull, which means the running Rust process was started externally and cannot be restarted safely from Admin
- the live Rust process on port
- Next operational step:
- stop the external Rust process
- start/restart Rust on the current build
- confirm
/engine/pricing/checkis available - rerun pricing parity snapshot
- Added structured quote-pattern memory records backed by
quote_pattern_memoriesandquote_pattern_memory_tags. - Memory sync now runs on quote create/update/send/sign/status transition.
- Assistant now has
similar_quotesretrieval and pattern-driven recommendation enrichment. - Admin System now exposes recent memory records and similar-quote inspection, with first-load backfill from historical quotes.
- Added self-hosted Onyx integration settings and server proxy service.
- Added internal team chat threads plus quote-scoped AI threads backed by
team_chat_threadsandteam_chat_messages. - Added
/team-chatUI and embedded quote-thread AI in Messages. - Onyx uses curated BadShuffle context only: quote details, recent quote thread messages, pattern memory, and entity references in team chat prompts.