flower
/

review · segments

New dispatch — Brief #32 (brief dependency chains with agent-affinity, v2 of #31). Run: git checkout -b flower/brief-affinity master (master now has #31 brief-relations merged — you build ON its BriefRelationService + brief_dependencies + recall_disp

codex 1562 events 19 segments flower/codex-tool-discovery

segment 1 of 19

Understand existing dispatch/relation code and plan additive changes for Brief #32 agent-affinity

Abandoned

The assistant branched to flower/brief-affinity, used recall to get Brief #32 and dispatch queue data, then read DispatchService, BriefRelationService, DispatchRequest model, migrations, MCP tools (BriefDispatchTool, RecallDispatchQueueTool, BriefUpdateStatusTool, BriefDispatchCompleteTool), Livewire Index and Show components, and relevant tests. It identified the current dispatch_request schema lacks agent_tool and session_id fields, and that the completion/unblock path does not yet surface affinity hints. A plan was formed to add optional agent_tool/session_id columns to dispatch_requests, capture them during dispatch, derive affinity hints from the latest completed blocker dispatch, and surface them in recall_dispatch_queue, newly_unblocked returns, and the /briefs dispatchable view.

outcome

Existing codebase read and implementation plan sketched; no code modifications yet.

next steps

  • Write migration to add agent_tool and session_id columns to dispatch_requests table
  • Update DispatchRequest model casts and fillable
  • Modify DispatchService::dispatch to accept and store agent_tool and session_id
  • Modify DispatchService::complete/completeForBrief to pass completion actor info for affinity derivation
  • Add method to BriefRelationService to compute affinity hint from a brief's completed blocker dispatch
  • Update RecallDispatchQueueTool to include affinity hint in its response
  • Update Livewire Briefs/Index to show affinity hint in dispatchable filter view
  • Write/update tests for new functionality
  • Run php artisan test and pint on changed files
  • Commit with 'Brief: #32' trailer

key decisions

  • Add optional agent_tool (string) and session_id (string) columns to dispatch_requests table, separate from resume_session_id
  • Capture affinity metadata at dispatch time, not retroactively
  • Derive a dependent's affinity hint from the latest Done dispatch request of its immediate blocking brief
  • Affinity hint includes the predecessor's target_worktree, agent_tool, and session_id
  • Do not auto-spawn agents when affinity exists; dispatch stays orchestrator-mediated
  • No behavior change when no affinity exists
  • Use additive approach — no migrations or schema changes to existing columns
  • Keep resume_session_id semantics for Resume dispatch kind unaffected

open questions

  • Should agent_tool be stored as a free-text string or a foreign key to an agent_tools table?
  • Should the session_id field accept any session identifier or only UUIDs from known harnesses?
  • Where exactly in the Livewire briefs/index.blade.php should the affinity hint be displayed?
  • Does BriefRelationService need a new method to compute affinity, or can it be inlined in DispatchService?

4 days ago 4 days ago

segment 2 of 19

Survey existing dispatch and relation infrastructure

Done

Read key test files including BriefRelationsUiTest, QueryEfficiencyAuditTest, BriefEvent model, BriefRelationToolsTest, DispatchToolsTest, and FoundationTest to understand current dispatch capture, relation service, and MCP tool patterns.

outcome

Understood the codebase structure for implementing affinity hints.

next steps

  • Implement affinity capture fields and propagation

key decisions

open questions

4 days ago 4 days ago

segment 3 of 19

Implement agent-affinity capture, MCP derivation, and UI hint

Done

Created migration to add agent_tool and session_id columns to dispatch_requests. Updated DispatchService, DispatchPacketDefaults, BriefDispatchTool, BriefClaimTool, BriefDispatchCancelTool, RecallService, and Livewire Show to capture and preserve the new fields. Added derivation logic in BriefRelationService to read predecessor's latest completed dispatch request for affinity hints. Surfaced affinity in BriefDispatchCompleteTool, BriefUpdateStatusTool, RecallDispatchQueueTool MCP responses and in the /briefs dispatchable list UI with a chip. Wrote focused tests, ran full suite (462 passed), and committed in three clean units.

outcome

Branch flower/brief-affinity has three commits with 20 files changed, 462 tests passing, implementing affinity capture, MCP derivation, and UI hint.

next steps

  • Merge into master after review

key decisions

  • Capture affinity from dispatch input fields (agent_tool, session_id) rather than from event logs.
  • Derive hint for a brief from its predecessor's latest 'done' dispatch request's captured affinity.
  • Surface affinity in MCP completion/queue responses and in the dispatchable list UI as a chip.

open questions

4 days ago 4 days ago

segment 4 of 19

Finalize and hand off Brief #32 implementation

Done

Verified the branch is clean at three commits for Brief #32. Appended an implementation handoff note to Brief #32 via brief_append MCP. Recorded Flower feedback note #40 about recall_search surfacing the right prior context. Then presented a summary of the completed work and noted that the branch is not merged.

outcome

Brief #32 implementation complete on branch flower/brief-affinity with three commits; all tests passing; handoff note appended to Brief #32; dogfooding feedback recorded as note #40.

next steps

key decisions

  • Commits a4d956f, c31524e, 0b096ec finalize Brief #32 on branch flower/brief-affinity
  • Implementation records agent_tool/session_id on dispatch_requests and surfaces affinity hints in recall_dispatch_queue and /briefs view
  • No auto-spawn behavior added per spec
  • Branch not merged; operator handles merge

open questions

4 days ago 4 days ago

segment 5 of 19

Start Brief #33 merge/collapse implementation

Abandoned

Received Brief #33 spec for merge/collapse. Verified master at 8a6648c includes #31 and #32 merges. Created branch flower/brief-merge via git checkout -b. Recalled Brief #33 via recall_brief and searched for relevant context. Appended a starting note to Brief #33.

outcome

Branch flower/brief-merge created from master; Brief #33 recalled and its spec confirmed; started implementation note appended to Brief #33.

next steps

  • Read current BriefRelationService, model, migrations, enums, and MCP tool files to understand existing patterns
  • Implement merge() method on BriefRelationService with guards (self-merge, cycles, complete/cancelled sources) and row re-pointing
  • Create brief_merge MCP tool and register in FlowerServer
  • Add merged_into/merged_from event kind + schema migration for merged_into_brief_id column
  • Add service-level tests for merge, then run pint, focused tests, and full test suite

key decisions

  • Create branch flower/brief-merge from master (master includes both #31 and #32 merges)
  • Use existing BriefRelationService pattern for additive merge behavior
  • Do NOT implement UI/recall changes in this first segment; focus on service and MCP tool

open questions

4 days ago 4 days ago

segment 6 of 19

Read existing code to plan merge implementation

Done

Read the existing Brief model, migration schema, event kinds, status enums, the full BriefRelationService, FlowerServer MCP tool registration, BriefSetParentTool pattern, RecallService folder/list summary methods, and existing test file. Reviewed unique constraints on junction tables to plan deduplication during merge. Confirmed the additive pattern to fit into existing relationship invariants.

outcome

Existing codebase read: Brief model, migrations (briefs, brief_links, brief_participants, brief_projects, brief_dependencies), event enums, status enums, BriefRelationService, FlowerServer MCP registration, BriefSetParentTool pattern, RecallService briefFolder and briefListSummary methods, and existing tests.

next steps

  • Create migration adding merged_into_brief_id to briefs table
  • Add Merged and MergedFrom event kinds
  • Add mergedInto relationship on Brief model + casts
  • Implement BriefRelationService::merge() with guards and row re-pointing
  • Create BriefMergeTool MCP tool and register in FlowerServer
  • Write tests for the merge operation
  • Add recall provenance (merged_into/merged_from) in RecallService

key decisions

  • Merge operation will re-point children, depends-on edges, dependent edges, links, participants, and projects from sources to survivor
  • Schema will use a nullable merged_into_brief_id column on briefs table (self-FK)
  • Will add BriefEventKind::Merged and BriefEventKind::MergedFrom cases
  • Will protect against self-merge, cycle detection, and merging already-complete/cancelled briefs

open questions

4 days ago 4 days ago

segment 7 of 19

Implement core merge in BriefRelationService + MCP tool + tests

Abandoned

Applied patches: migration adding merged_into_brief_id to briefs table, BriefEventKind enum updated with Merged/MergedFrom cases, Brief model updated with mergedInto relationship and casts, BriefRelationService::merge() implemented with full row re-pointing, guards, and event recording, BriefMergeTool MCP tool created and registered in FlowerServer, 8 service-level merge tests added, and FoundationTest updated.

outcome

Schema migration, event kinds, merge method on BriefRelationService, BriefMergeTool MCP tool registration, and service-level tests for merge all written and patched in. Tests pending execution.

next steps

  • Run php artisan test --filter BriefRelationServiceTest to verify new merge tests pass
  • Run pint on changed files
  • Run full test suite
  • Add merged_into/merged_from provenance to recall_brief output
  • Surface merge UI action and merged-away briefs in /briefs dispatchable view
  • Add MCP tool-level test for BriefMergeTool

key decisions

  • Use merged_into_brief_id column on briefs table with index and FK where the driver supports it
  • Add BriefEventKind::Merged and BriefEventKind::MergedFrom for provenance
  • merge() guarded: rejects self-target, non-existent briefs, complete/cancelled/abandoned sources, and would-create cycles
  • Row re-pointing: moves children, depends-on edges (source as dependent), dependent edges (source as blocker), links, participants, and projects to survivor; deduplicates against unique constraints
  • Sources are set to status=cancelled and updated with merged_into_brief_id
  • Merge trace events recorded on both survivor and each source
  • BriefMergeTool added as MCP tool with source_ids[], target_id, and actor_ref
  • Added 8 service-level tests and extended FoundationTest

open questions

4 days ago 4 days ago

segment 8 of 19

Complete Brief #33: brief merge core, recall provenance, and UI

Done

Ran focused tests (service/MCP/recall/UI/query) and full suite (474 tests, 473 passed), split work into three commits (core merge, recall provenance, UI), appended completion note to Brief #33, and verified clean branch state.

outcome

Brief #33 fully implemented on branch flower/brief-merge with three commits (df3e4ef, 1b27e8a, 46b2903), all tests green, handoff appended.

next steps

key decisions

  • Split merge work into three commits for clarity: core merge API, recall provenance, and /briefs UI.
  • Kept eager-loading minimal by using merged_into_brief_id pointer and withCount for survivor rollup.

open questions

4 days ago 4 days ago

segment 9 of 19

Start Brief #43: compress session_events with transparent model accessor

Abandoned

Received Brief #43 dispatch, created branch flower/compress-session-events from master, recalled brief spec via MCP, inspected session_events model, migration, config, and related jobs (IngestSession, SegmentSession, FlowerSessionRawTool), and updated the plan with steps for migration, accessor, backfill command, and tests.

outcome

Branch created, spec understood, codebase inspection done, plan updated; no code written yet.

next steps

  • Add config key 'flower.ingest.compress_events' (default true).
  • Create migration adding nullable text_gz LONGBLOB to session_events.
  • Add transparent accessor/mutator on SessionEvent model for gzcompress/gzuncompress with legacy fallback.
  • Create flower:compress-session-events backfill command with dry-run, --force, --batch, and table size reporting.
  • Write sqlite tests: round-trip, legacy fallback, ingest/segment smoke.
  • Run Pint and full test suite, commit per unit with Brief: #43 trailer.
  • Append progress to Brief #43 and hand back without merge.

key decisions

  • Will not run migration, backfill, or mutating tinker against live MAIN DB; only sqlite tests.
  • Will flag Horizon graceful reload because IngestSession/SegmentSession touch session_events.

open questions

3 days ago 3 days ago

segment 10 of 19

Implement gzip compression for session event text storage

Done

The assistant reads existing code to understand the ingest pipeline, then creates a migration adding a `text_gz` binary column, a `SessionEventBuilder` to handle bulk inserts, a config toggle `flower.ingest.compress_events`, and a `CompressSessionEvents` artisan command for backfill. The model's `text` accessor transparently decompresses `text_gz` when present, and the mutator compresses on write. Tests cover compression round-trip, legacy fallback, config-off storage, and ingest-to-segment smoke. After fixing migration compatibility (longBlob → raw SQL for MySQL / binary for sqlite) and adjusting test assertions, all 25 focused tests pass.

outcome

Session event text is now transparently gzip-compressed on write and decompressed on read, controlled by `flower.ingest.compress_events` (default true), with a backfill command and full test coverage.

next steps

  • Run the full test suite to ensure no regressions
  • Run Pint for code style formatting
  • Commit the changes

key decisions

  • Use a model-specific builder (SessionEventBuilder) to intercept bulk inserts and compress text_gz consistently
  • Add a config toggle `flower.ingest.compress_events` defaulting to true, version-controlled
  • Use raw SQL `LONGBLOB` for MySQL and `binary` for sqlite in migration to avoid blueprint method incompatibility
  • Keep the public `text` attribute API unchanged; compression is transparent to all callers
  • Add a backfill command with dry-run default to avoid accidental mutation

open questions

3 days ago 3 days ago

segment 11 of 19

Complete Brief #43: compress session event text storage

Done

Ran Pint formatting and focused tests (26 passed), then full sqlite test suite (516 passed, 1 skipped). Staged and committed two commits: 'Compress session event text storage' (model, builder, migration, config, tests) and 'Add session event compression backfill command' (command, service provider registration, command tests). Appended completion note to Brief #43 via MCP tool. Verified branch is clean on flower/compress-session-events.

outcome

Two commits on flower/compress-session-events with Brief #43 trailer; brief progress appended; branch handed back without merge.

next steps

key decisions

  • Split into two commits: storage plumbing first, backfill command second, each with 'Brief: #43' trailer.
  • Used same pattern as v1: gzcompress on set, gzuncompress on get, legacy fallback, bulk insert() coverage, config gate.

open questions

3 days ago 3 days ago

segment 12 of 19

Start Brief #51: compress session_events tool_input and usage columns

Abandoned

Received new dispatch for Brief #51 (v2 of #43, compressing tool_input and usage JSON columns). Recalled Brief #51 spec via MCP, confirmed it is planned. Created branch flower/compress-tool-input from master. Read existing v1 code (SessionEvent.php, SessionEventBuilder.php, CompressSessionEvents.php, SessionProjectTouchService.php) to mirror pattern. Applied patches adding migration for tool_input_gz/usage_gz columns, updated SessionEvent model with compressed JSON accessors, extended builder partial-select support, and fixed the touch-service presence check to use tool_input_gz. Extended the backfill command to also backfill tool_input and usage, added --optimize flag (inert for sqlite).

outcome

Branch flower/compress-tool-input created; migration, model accessors, builder support, touch-service fix, and extended command applied via patches; tests not yet written or run.

next steps

  • Write sqlite tests for tool_input/usage round-trip, legacy fallback, bulk insert, and touch-service query post-compression.
  • Run Pint and focused tests, then full sqlite suite.
  • Commit in per-unit chunks with 'Brief: #51' trailer.
  • Append progress to Brief #51 via MCP.

key decisions

  • Mirror v1 pattern exactly: gzcompress JSON on set, gzuncompress+json_decode on get, legacy fallback, config gate, bulk insert() coverage.
  • Replace existing 'tool_input' and 'usage' casts with custom compressed JSON accessors to avoid double-decoding conflicts.
  • Fix SessionProjectTouchService presence check to use tool_input_gz instead of tool_input.
  • Extend existing flower:compress-session-events command rather than creating a new one; add --optimize flag.

open questions

  • Whether the --optimize flag should be MySQL-only and how to handle it in sqlite tests.

3 days ago 3 days ago

segment 13 of 19

Complete Brief #51: compress session event JSON payloads

Done

The assistant completed Brief #51 by extending the session event compression to cover tool_input and usage columns. It added a migration for the new compressed columns, updated the SessionEvent model accessors/mutators, fixed the SessionProjectTouchService query to check both legacy and compressed payloads, extended the compress-session-events command to backfill all three payload columns idempotently with an optional --optimize flag, and added comprehensive sqlite tests. After running Pint and the full test suite (all passing), the assistant committed the changes in two logical commits and appended a progress note to Brief #51.

outcome

Two commits on branch flower/compress-tool-input: a83eebb (Compress session event JSON payloads) and 3d91a51 (Backfill compressed session event payloads). All sqlite tests pass (519 tests, 1 skipped). Progress appended to Brief #51.

next steps

key decisions

  • Split the changes into two commits: storage/query behavior first, then command backfill/optimize.
  • Kept legacy JSON columns alongside new compressed columns for backward compatibility.
  • Extended existing compression accessors/mutators to tool_input and usage, sharing the #43 config gate.
  • Added --optimize flag for MySQL OPTIMIZE TABLE after forced backfill.

open questions

3 days ago 3 days ago

segment 14 of 19

Initiate Brief #58: adaptive summarize subdivide and per-session circuit breaker

Abandoned

The assistant received the dispatch for Brief #58, read the brief via recall_brief, inspected the existing adaptive chunking code on master, and created a plan with six steps. It appended a start note to Brief #58 and updated the plan in the tool. No implementation code was written in this chunk.

outcome

Brief #58 read and planned. Branch flower/flower16-subdivide created from master. Start note appended to Brief #58. No code changes yet.

next steps

  • Add session failure columns/config and model casts.
  • Wire SegmentSession success/failure reset/increment and preflight cap.
  • Enforce failed-attempt debounce/cap in IngestSession and backlog visibility.
  • Add/adjust sqlite tests for subdivision config, failure counters, cap, and non-timeout behavior.
  • Run Pint/tests, commit per unit, append Brief #58 progress.

key decisions

  • Will build on existing adaptive timeout subdivision code already present on master.
  • Will add a config knob for subdivision factor (currently hardcoded at 2).
  • Will add per-session failure columns (summarize_failures, last_summarize_failed_at) and enforce cap in IngestSession::chainSegmentation and SegmentSession preflight.
  • Will surface failure counts in flower:ingest-backlog report.

open questions

3 days ago 3 days ago

segment 15 of 19

Add configurable adaptive subdivision factor and non-timeout map error test

Done

Added chunk_timeout_subdivide_factor config (default 2) to replace hardcoded /2 in subdividedLimits(). Added test_non_timeout_map_error_does_not_subdivide to verify non-timeout map errors don't trigger subdivision. Fixed a Log::spy() issue in the timeout test. Committed as e346ae2.

outcome

Configurable subdivision factor and regression test committed on branch flower/flower16-subdivide.

next steps

key decisions

  • Use configurable factor instead of hardcoded /2 to allow tuning subdivision aggressiveness.
  • Non-timeout map errors should not trigger subdivision; only timeout errors do.

open questions

3 days ago 3 days ago

segment 16 of 19

Implement summarize failure circuit breaker with per-session counters and backlog visibility

Done

Added sessions.summarize_failures and sessions.last_summarize_failed_at migration with Session casts. Created SummarizeFailurePolicy with max_failures (default 3) and failure_retry_after_minutes (default 10) config. Wired SegmentSession to preflight-skip capped/recently failed sessions, increment/stamp on failure, and reset on success. Wired IngestSession::chainSegmentation to skip dispatch when policy says skip. Updated flower:ingest-backlog to surface summary failed circuit-open and summary retry debounced counts/samples, and exclude those sessions from rekick. Added tests in SegmentSessionTest, TranscriptIngestTest, IngestBacklogCommandTest, and FoundationTest. Committed as 88ab091.

outcome

Summarize failure circuit breaker fully implemented and committed on branch flower/flower16-subdivide.

next steps

key decisions

  • Use a dedicated SummarizeFailurePolicy service rather than duplicating cap/debounce math across jobs.
  • SegmentSession preflight-skips capped or recently failed sessions before invoking the summarizer.
  • IngestSession skips SegmentSession dispatch when policy says skip, matching too-large guard behavior.
  • Backlog command shows two new buckets: summary failed circuit-open and summary retry debounced.

open questions

3 days ago 3 days ago

segment 17 of 19

Implement incremental (append-only) session summarization

Abandoned

The agent completed Brief #58 on branch flower/flower16-subdivide, then received a new dispatch for Brief #60 (incremental summarization). It recalled the brief, switched to a new branch from master, appended a progress comment, and spent the remainder of the chunk reading the relevant source files: SegmentSession job, SessionSegment model, EmbedChunks job, migrations for sessions, session_segments, chunks, chunk_embeddings, and the AiSegmentSummarizer and SegmentSummarizerAgent. The agent confirmed that EmbedChunks already uses updateOrCreate on chunkable_type+chunkable_id and only re-embeds when text changes, so preserving frozen segment IDs will keep their embeddings untouched. The agent concluded by stating it is about to edit the schema, summarizer boundary normalization, and SegmentSession persistence with the core rule that rows before the active segment ordinal are never touched.

outcome

Codebase analysis complete; implementation about to begin.

next steps

  • Add start_event_ordinal and end_event_ordinal columns to session_segments table via migration.
  • Add a frozen_until_event_ordinal (or similar) watermark column to sessions table.
  • Modify SegmentSession::handle() to skip frozen segments and only re-summarize from the active segment's start forward.
  • Update AiSegmentSummarizer to accept an optional tail start ordinal and only pass events from that point.
  • Update SegmentSummarizerAgent schema to include start_event_ordinal/end_event_ordinal (already present in JSON schema).
  • Write tests simulating a growing session across two ingests, asserting settled segments are untouched.
  • Run php artisan test and pint on changed files.
  • Hand back branch with migration and Horizon reload note.

key decisions

  • Preserve existing segment row IDs for frozen segments so EmbedChunks does not re-embed them.
  • Add event ordinal columns to session_segments to freeze exact boundaries instead of relying on timestamps.
  • Use a session-level frozen watermark (frozen_until_event_ordinal) to track the last frozen segment's end.
  • Only re-summarize from the active segment's start forward; settled segments are immutable.
  • Regenerate session-level roll-up summary cheaply from segment summaries, not raw events.

open questions

  • Exact column name for the frozen watermark on sessions (e.g., frozen_until_event_ordinal vs last_frozen_event_ordinal).
  • How to handle the case where the active segment is empty or no segments exist yet (first run).
  • Whether the SegmentSummarizer interface needs a new method or an optional parameter for tail-only summarization.

3 days ago 3 days ago

segment 18 of 19

Implement incremental session summarization (Brief #60)

Done

Added event ordinal boundary columns (start_event_ordinal/end_event_ordinal) on session_segments and summarized_until_event_ordinal on sessions. Modified SegmentSummarizer/AiSegmentSummarizer to accept an optional tail start ordinal and persist boundary ordinals. Reworked SegmentSession to preserve settled segment rows, summarize only from the active tail, update the active row in place, append new tail segments, and regenerate session summary from persisted segment summaries. Kept existing failure/size-limit circuit breakers intact. Added growing-session resummary tests and EmbedChunks identity regression. All sqlite tests passed (540 tests, 539 passed, 1 skipped).

outcome

Committed incremental summarization changes on branch flower/incremental-summarization (commit 9afc4e8) with Brief: #60 trailer. Branch clean, full test suite green.

next steps

  • Merge into master after review.
  • Run migrate on MAIN to add new columns.
  • Graceful Horizon reload for updated SegmentSession job code.
  • Optional: run flower:segment manually against a growing session to verify behavior.

key decisions

  • Settled segments are frozen; only the active tail (from lastFrozenEndEventOrdinal) is re-summarized.
  • Active segment row is updated in place; newly detected tail segments are appended.
  • Session summary is regenerated cheaply by concatenating persisted segment summaries.
  • Boundary columns added to model casts (integer) rather than separate table.
  • EmbedChunks chunkable morph (session_segment) is unchanged; identity preserved via chunk ID.

open questions

3 days ago 3 days ago

segment 19 of 19

Initiate Brief #68 prune orphaned chunks

Abandoned

Read the Solo scratchpad #1037 spec for Brief #68. Verified the branch is flower/prune-orphaned-chunks and clean. Attempted to read the canonical brief via MCP recall_brief id=68, but the tool failed with an enum error (invalid BriefOrigin value 'feedback'). No further progress was made; the session ended without any code changes or tests for the prune feature.

outcome

No code written. The recall_brief MCP tool is broken for this brief; the spec from scratchpad is available but the canonical brief was not retrieved.

next steps

  • Fix the MCP recall_brief enum issue (invalid backing value 'feedback' for BriefOrigin).
  • Re-attempt reading the canonical brief or rely on scratchpad spec.
  • Read existing models (Chunk, ChunkEmbedding) and Meili service to design the prune command.
  • Implement PruneOrphanedChunks command with dry-run, limit, type options.
  • Add Segment delete cascade (observer or event) to clean up chunks when segment is deleted.
  • Add scheduled reconcile command (e.g., prune-orphaned-chunks --autofix) for periodic cleanup.
  • Write sqlite tests with faked Meili client.
  • Commit on flower/prune-orphaned-chunks with Brief: #68 trailer.

key decisions

open questions

  • Why does the MCP recall_brief fail with 'feedback' enum value? Is it a stale data issue or a code bug?
  • What is the exact canonical brief text? (Scratchpad provides a good summary but may lack some details.)

2 days ago 2 days ago