feat(page): add typed keyset pagination for Bob #15

Merged
end merged 8 commits from feat/page into main 2026-10-27 20:21:58 -07:00
Owner

Adds transport-neutral Bob keyset pagination with a plain Sort and typed row key, versioned cursors preserving supported concrete values, bidirectional pages, and a separate authorized Count. Includes SQLite outcomes, a runnable example, and required PostgreSQL service-container coverage.

Closes #6. Follows the accepted cursor ADR, now marked implemented with this PR as delivery evidence.

Validation: independent Standard review found no Blocking/Major issues; its one Minor authorization-fixture finding was fixed. Fresh High review at 927594b found no Blocking/Major/Minor issues. Local build, vet, race tests, pinned golangci-lint v2.15.0 (0 issues), TODO scan, docs check (4 records), formatting and whitespace passed after merging main. Earlier real SQLite/PostgreSQL flows passed; required PostgreSQL race coverage also passed in CI on the current merge head.

Readiness: merged main at e5298cff37, resolving the README conflict by retaining both page and lifecycle sections and updating the introduction. Page source is unchanged; imported lifecycle source exactly matches main. All CI passed on head 9d799714f5: root checks and PostgreSQL race suite, documentation. No merge conflicts or outstanding review findings remain. The PR is open for owner merge.

Limits: MySQL runtime remains unverified (native composition compiles). Sort/key field/type correspondence, non-null values, final-column uniqueness, comparison semantics and query authorization remain caller contracts. Cursors are editable seek boundaries; no snapshot guarantee.

Adds transport-neutral Bob keyset pagination with a plain Sort and typed row key, versioned cursors preserving supported concrete values, bidirectional pages, and a separate authorized Count. Includes SQLite outcomes, a runnable example, and required PostgreSQL service-container coverage. Closes #6. Follows the accepted [cursor ADR](https://gitea.auvem.com/corestack/go/src/branch/feat/page/docs/adr/20261027T184351001Z-preserve-typed-sort-values-in-versioned-page-cursors.md), now marked implemented with this PR as delivery evidence. Validation: independent Standard review found no Blocking/Major issues; its one Minor authorization-fixture finding was fixed. Fresh High review at 927594b found no Blocking/Major/Minor issues. Local build, vet, race tests, pinned golangci-lint v2.15.0 (0 issues), TODO scan, docs check (4 records), formatting and whitespace passed after merging main. Earlier real SQLite/PostgreSQL flows passed; required PostgreSQL race coverage also passed in CI on the current merge head. Readiness: merged main at e5298cff37f4beea2719935cf874269bdf31912b, resolving the README conflict by retaining both page and lifecycle sections and updating the introduction. Page source is unchanged; imported lifecycle source exactly matches main. All CI passed on head 9d799714f5f3f205ca7515de4de0af8393e0a6c6: [root checks and PostgreSQL race suite](https://gitea.auvem.com/corestack/go/actions/runs/2559), [documentation](https://gitea.auvem.com/corestack/go/actions/runs/2560). No merge conflicts or outstanding review findings remain. The PR is open for owner merge. Limits: MySQL runtime remains unverified (native composition compiles). Sort/key field/type correspondence, non-null values, final-column uniqueness, comparison semantics and query authorization remain caller contracts. Cursors are editable seek boundaries; no snapshot guarantee.
end added 5 commits 2026-10-27 13:04:47 -07:00
Add versioned typed cursors, composable native query mods, bidirectional page assembly and opt-in authorized counts. Cover SQLite and PostgreSQL outcomes, strict cursor boundaries and a runnable example; require PostgreSQL service tests in CI.

Refs: #6
test(page): cover tied foreign-tenant seek row
Documentation / docs (pull_request) Successful in 22s
ci / postgres (pull_request) Failing after 34s
ci / check (pull_request) Successful in 3m19s
927594b567
end added 1 commit 2026-10-27 13:05:07 -07:00
docs(page): reconcile delivery with PR 15
ci / postgres (pull_request) Failing after 16s
Documentation / docs (pull_request) Successful in 26s
ci / check (pull_request) Successful in 3m12s
c3f3a3faf5
end added 1 commit 2026-10-27 13:06:11 -07:00
ci(page): use Node-capable runner for PostgreSQL tests
Documentation / docs (pull_request) Successful in 10m48s
ci / check (pull_request) Successful in 12m53s
ci / postgres (pull_request) Successful in 12m55s
f75a8acf60
Author
Owner

CI exposed a workflow harness issue: the explicit Go image has no node, so checkout failed with exit 127 before tests ran, although PostgreSQL became healthy (job 2947). f75a8ac uses the existing Node-capable runner plus the repository's pinned setup-go action; the PostgreSQL service network/health check, required DSN and race test remain unchanged. Product code is unchanged since the independent High review. Final-head CI is pending.

CI exposed a workflow harness issue: the explicit Go image has no `node`, so checkout failed with exit 127 before tests ran, although PostgreSQL became healthy ([job 2947](https://gitea.auvem.com/corestack/go/actions/runs/2516/jobs/2947)). f75a8ac uses the existing Node-capable runner plus the repository's pinned setup-go action; the PostgreSQL service network/health check, required DSN and race test remain unchanged. Product code is unchanged since the independent High review. Final-head CI is pending.
Author
Owner

Final-head CI is delayed by an external action-download failure: all three jobs report context deadline exceeded (Client.Timeout exceeded while awaiting headers) while downloading https://codeload.github.com/actions/checkout/tar.gz/v7.0.1, and the runner is retrying. PostgreSQL became healthy, but checkout/tests have not run on f75a8ac. Readiness remains pending; checks are unchanged.

Final-head CI is delayed by an external action-download failure: all three jobs report `context deadline exceeded (Client.Timeout exceeded while awaiting headers)` while downloading `https://codeload.github.com/actions/checkout/tar.gz/v7.0.1`, and the runner is retrying. PostgreSQL became healthy, but checkout/tests have not run on f75a8ac. Readiness remains pending; checks are unchanged.
Author
Owner

Automatic retries recovered. All checks now pass on final head f75a8acf6011eaa712e3e656ba5fefba6791f0c7: root checks, required PostgreSQL race suite, and documentation (3 records). No manual rerun, bypass or further code changes were needed. The accepted ADR links this PR, and no Blocking/Major review findings remain. Ready for owner merge; MySQL runtime remains explicitly unverified.

Automatic retries recovered. All checks now pass on final head `f75a8acf6011eaa712e3e656ba5fefba6791f0c7`: [root checks](https://gitea.auvem.com/corestack/go/actions/runs/2518/jobs/2949), [required PostgreSQL race suite](https://gitea.auvem.com/corestack/go/actions/runs/2518/jobs/2950), and [documentation (3 records)](https://gitea.auvem.com/corestack/go/actions/runs/2519/jobs/2951). No manual rerun, bypass or further code changes were needed. The accepted ADR links this PR, and no Blocking/Major review findings remain. Ready for owner merge; MySQL runtime remains explicitly unverified.
end added 1 commit 2026-10-27 20:18:54 -07:00
Merge main into feat/page
ci / postgres (pull_request) Successful in 35s
Documentation / docs (pull_request) Successful in 33s
ci / check (pull_request) Successful in 42s
9d799714f5
end merged commit c45e8abe08 into main 2026-10-27 20:21:58 -07:00
end deleted branch feat/page 2026-10-27 20:21:59 -07:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: corestack/go#15