Skip to content

Batch file pagination#245

Merged
sejori merged 10 commits into
mainfrom
batch-file-pagination
Nov 27, 2025
Merged

Batch file pagination#245
sejori merged 10 commits into
mainfrom
batch-file-pagination

Conversation

@sejori
Copy link
Copy Markdown
Contributor

@sejori sejori commented Nov 26, 2025

closes #243

@railway-app
Copy link
Copy Markdown

railway-app Bot commented Nov 26, 2025

🚅 Environment control-layer-pr-245 in industrious-light has no services deployed.

@railway-app railway-app Bot temporarily deployed to control-layer (industrious-light / control-layer-pr-245) November 26, 2025 18:20 Destroyed
@railway-app railway-app Bot temporarily deployed to control-layer (industrious-light / control-layer-pr-245) November 26, 2025 18:27 Destroyed
@railway-app railway-app Bot temporarily deployed to control-layer (industrious-light / control-layer-pr-245) November 26, 2025 18:32 Destroyed
@railway-app railway-app Bot temporarily deployed to control-layer (industrious-light / control-layer-pr-245) November 27, 2025 09:59 Destroyed
@sejori sejori merged commit 4c6e2fa into main Nov 27, 2025
7 checks passed
@sejori sejori deleted the batch-file-pagination branch November 27, 2025 10:08
hachall pushed a commit that referenced this pull request Jan 23, 2026
* feat: enrich model endpoints

* fix: collapse conditions

* feat: remove nested paragraphs in transaction modal

* feat: standardised cursor pagination and implemented into batches table

* fix: FileRequests cursor UI

* fix: file content pagination params

* fix: tests

* fix: tests
sejori added a commit that referenced this pull request Apr 28, 2026
Extends FusilladeResponseStore to hold an Option<PostgresResponseStepManager>
and implements the new multi-step ResponseStore trait methods that have
direct one-to-one mappings to the storage layer:

- record_step → PostgresResponseStepManager::create_step
- mark_step_processing → ... ::mark_step_processing
- complete_step → ... ::complete_step
- fail_step → ... ::fail_step
- next_sequence → MAX(step_sequence) + 1 from list_chain

The transition function (next_action_for), execution hooks
(execute_model_call, execute_tool_call), and assembly logic
(assemble_response) intentionally fall through to the trait defaults.
Those are the heart of the Open Responses domain logic and warrant
focused review under their own follow-up issues
(COR-346 / 347 / 348 / 349).

Validated end-to-end:
- dwctl binary builds against the workspace [patch.crates-io] overrides
  pointing at local fusillade and onwards branches.
- Migration #96 applies cleanly; response_steps table exists in
  fusillade DB; response_step_id columns exist on http_analytics and
  tool_call_analytics in dwctl DB.
- dwctl starts up, fusillade daemon registers, /healthz returns 200,
  /admin/openapi.json serves the admin API spec.

Also updates fail_response in store.rs to pass the status code as the
third argument to PostgresRequestManager::fail_request, picking up the
signature change introduced by fusillade #245.

[patch.crates-io] entries in workspace Cargo.toml are deliberately
included so reviewers can reproduce the end-to-end test. They must be
removed before merge — flagged in the PR description.
sejori added a commit that referenced this pull request Apr 30, 2026
## Summary

Schema migration plus storage-layer bridge wiring for the multi-step
Open Responses orchestration described in [fusillade
plan](https://github.com/doublewordai/fusillade/blob/main/docs/plans/2026-04-28-multi-step-responses.md).

### Migration
- \`response_step_id\` column on \`http_analytics\` and
\`tool_call_analytics\` (nullable, partial-index).
- CHECK constraint on \`tool_sources.kind\` documenting the supported
set: \`'http'\` (default) and \`'agent'\` (sub-agent dispatch).

### Bridge wiring (\`dwctl/src/responses/store.rs\`)
- \`FusilladeResponseStore\` now holds an
\`Option<PostgresResponseStepManager>\` via a new \`with_step_manager\`
builder. Existing call-sites that don't need multi-step continue to work
unchanged.
- New \`ResponseStore\` trait methods mapped one-to-one to storage
primitives: \`record_step\`, \`mark_step_processing\`,
\`complete_step\`, \`fail_step\`, \`next_sequence\`. The other
multi-step methods (\`next_action_for\`, \`execute_model_call\`,
\`execute_tool_call\`, \`assemble_response\`) fall through to the trait
defaults — those are the heart of the Open Responses domain logic and
warrant focused review under their own follow-up issues.

### \`fail_request\` signature update
\`store::fail_response\` now passes a status code (\`500\` as the
catch-all). This picks up the signature change in fusillade #245 (\`fix:
accept status code in fail_request\`). Without this, neither this PR nor
any future fusillade bump would compile.

### Local-dev overrides (must be removed before merge)
The workspace \`Cargo.toml\` includes \`[patch.crates-io]\` entries
pointing at sibling \`../fusillade\` and \`../onwards\` checkouts. This
is so the bridge wiring can be exercised end-to-end before the upstream
releases land:

\`\`\`toml
[patch.crates-io]
fusillade = { path = "../fusillade" }
onwards = { path = "../onwards" }
\`\`\`

**Remove these before merging.** Once fusillade #248 and onwards #185
are released to crates.io, bump \`fusillade\` and \`onwards\` versions
in \`dwctl/Cargo.toml\` instead.

## Linear coverage

- Parent: [COR-330](https://linear.app/doubleword/issue/COR-330)
- Closes [COR-344](https://linear.app/doubleword/issue/COR-344) —
analytics columns + tool_sources.kind constraint
- Partial [COR-345](https://linear.app/doubleword/issue/COR-345) —
\`FusilladeResponseStore\` storage primitives wired; remaining trait
methods (transition, execution, assembly) deferred to follow-up

### Deferred to follow-ups
- **COR-346/347**: Transition function (Open Responses tool-call
semantics + sub-agent dispatch via \`tool_sources.kind\`).
- **COR-348**: Assembly logic — chain walk → OpenAI Response JSON.
- **COR-349**: \`fusillade::RequestProcessor::process\` dispatching by
endpoint.
- **COR-350**: \`GET /v1/responses/{id}/steps\` endpoint.
- **COR-351**: Extend \`/admin/api/v1/tool-sources\` to accept \`kind\`.
- **COR-352**: Replace \`create_batch_of_1\` with multi-step-capable
creation.
- **COR-353**: SIGTERM drain handler.
- **COR-354**: Surface \`max_response_step_depth\` and
\`max_response_iterations\` as config knobs.

## Validation

End-to-end with the local crate overrides:

- [x] \`cargo build --package dwctl --bin dwctl\` succeeds.
- [x] \`sqlx migrate run\` applies migration #96 cleanly against the
dwctl DB.
- [x] \`response_steps\` table exists in fusillade DB;
\`response_step_id\` columns exist on \`http_analytics\` and
\`tool_call_analytics\` in dwctl DB.
- [x] \`./target/debug/dwctl\` starts up, registers the fusillade
daemon, listens on :3001.
- [x] \`GET /healthz\` returns \`200 OK\`.
- [x] \`GET /admin/openapi.json\` serves the admin API spec.

## Test plan

- [ ] Reviewer: confirm \`[patch.crates-io]\` is removed before merge
once upstream releases land.
- [ ] After merge, follow-up PRs implement the deferred sub-issues
(transition, assembly, etc.) using the bridge wiring this PR
establishes.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <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.

Infinite pagination of batch input files when row count is 10

1 participant