Repository navigation
feat(web): add a read-only SubmitQueue web UI as a mountable module - #810
Conversation
ff7dde6 to
ab0ebb8
Compare
ab0ebb8 to
71f747a
Compare
…oreview ## Summary ### Why? Recent sessions kept getting the same corrections in review: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, and separate CI workflows. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the decisions in the web UI RFC (#810), plus CI credential/workflow rules, naming and doc-concision bullets, and stack/test-plan commit guidance. - `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default; sweep commit messages for internal names; skip data-migration findings for OSS deployments. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `make fmt` leaves the tree unchanged
71f747a to
6a64dd6
Compare
…oreview ## Summary ### Why? Recent sessions kept getting the same corrections in review: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, and separate CI workflows. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the decisions in the web UI RFC (#810), plus CI credential/workflow rules, naming, RFCs-describe-main, and doc-concision bullets, and stack/test-plan commit guidance. - `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default; sweep commit messages for internal names; skip data-migration findings for OSS deployments. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `make fmt` leaves the tree unchanged
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, and fix stale ID text in the history, list, and Stovepipe workflow RFCs. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
6a64dd6 to
f35f703
Compare
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview dispatch: the parent runs a planner, one lens reviewer per assignment in parallel, and a consolidator, because subagents cannot start their own. Committed targets are reviewed in a clean detached worktree so local edits never skip checks, and every readable changed file must appear in some reviewer's Read list or the report marks it unreviewed. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview dispatch: the parent runs a planner, one lens reviewer per assignment in parallel, and a consolidator, because subagents cannot start their own. Committed targets are reviewed in a clean detached worktree so local edits never skip checks, and every readable changed file must appear in some reviewer's Read list or the report marks it unreviewed. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
…n's design ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (#770, #804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview dispatch: the parent runs a planner, one lens reviewer per assignment in parallel, and a consolidator, because subagents cannot start their own. Committed targets are reviewed in a clean detached worktree so local edits never skip checks, and every readable changed file must appear in some reviewer's Read list or the report marks it unreviewed. Coverage is counted from Read/Partial/Unread buckets rather than judged, and every finding must be re-opened at its cited line before it is admitted, with a recheck log in the report. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
f35f703 to
58f22e9
Compare
…n's design (uber#815) ## Summary ### Why? Recent sessions kept getting the same review corrections: speculative packages and adapters, homegrown wrappers, host code in the library, framework layouts, non-Bazel tooling, re-encoded IDs, internal names in a public repo, separate CI workflows, and RFCs that describe discussion rather than main. Autoreview also never ran its architecture or correctness lenses on TypeScript, because `.ts`/`.tsx` files classified as `other`. One such RFC already exists: queue-scoped decimal IDs shipped (uber#770, uber#804), but the decision still lived in a standalone "current vs proposed" RFC. ### What? - `AGENTS.md`: new **Design Defaults** section, aligned with the web UI RFC (uber#810); CI credential and workflow rules; naming, RFCs-describe-main, and concise-docs bullets; ask before splitting a large change into a stack; local run steps in the Test Plan. - Autoreview `review-scope.py`: new `web` kind (`.ts`, `.tsx`, `.js`, `.css`; `*.test.*` as tests), and `internal-reference` and `new-workflow` smells. - Autoreview dispatch: the parent runs a planner, one lens reviewer per assignment in parallel, and a consolidator, because subagents cannot start their own. Committed targets are reviewed in a clean detached worktree so local edits never skip checks, and every readable changed file must appear in some reviewer's Read list or the report marks it unreviewed. Coverage is counted from Read/Partial/Unread buckets rather than judged, and every finding must be re-opened at its cited line before it is admitted, with a recheck log in the report. - Autoreview `review.md` / `lenses.md`: route `web` to all code lenses; treat unneeded added surface as should-fix; add checks for each design default and for RFCs that diverge from main; sweep commit messages for internal names; skip data-migration findings for OSS deployments. - RFCs: add a **Resource IDs** section to `doc/rfc/submitqueue/workflow.md`, delete `doc/rfc/scoped-resource-ids.md` and its index entry, fix stale ID text in the history and Stovepipe workflow RFCs, delete the superseded SubmitQueue `list-api.md` proposal (shipped as `status-list-api.md`), and describe the implemented Stovepipe List API as current rather than proposed. ## Test Plan ✅ `bazel test //.agents/skills/autoreview/scripts:all` ✅ `bazel test //tool/docsite:site_test` (strict link check) ✅ `make fmt` leaves the tree unchanged
## Summary ### Why? SubmitQueue has no browser UI, and deployers need one they can mount in their own web stack without forking it. ### What? - `web/submitqueue`: the UI as one mountable package (routes, controllers, pages, styles, polling, cursor signing) behind a single `handle(path)` entry, free of generated protos, transports, and web frameworks. Change pages that scan the receipt window refresh on request instead of polling. - `web/service/submitqueue`: the Next.js reference host and its wiring, with a Bazel-built image in the local stack. - `web/api`: private generated gateway bindings for the host and the e2e test. - `doc/rfc/web-ui.md`: URL, UX, and boundary decisions. - CI: failed jobs also upload Bazel test outputs (Playwright traces, compose logs), not just `test.log`. ## Test Plan ✅ `make web-check` ✅ `make web-e2e-test` ✅ `make lint`, `make check-gazelle`, and `make check-tidy` ### Try it locally Requires Docker; Bazel brings its own Node. ```bash make local-submitqueue-start # builds and starts the full stack, then prints the web URL make demo-requests # submits a few requests to browse make local-stop # tears the stack down ``` Open the printed URL and sign in as `test` / `test`. Start at the queue directory, open a queue, then a request's Summary and History tabs, and follow a change link to its submission history. `make web-e2e-test` runs the same flows headlessly.
58f22e9 to
5553376
Compare
Summary: ## Why? Local stack commands use whichever standalone Compose is installed, while the Go test harness probes the Docker plugin and falls back to that standalone binary. A legacy installation can reject required flags such as `up --wait`. ## What? Pin Compose 5.6.0 and its Linux/macOS x86-64/ARM64 checksums in MODULE.bazel. Bazel downloads and caches the verified executable; local Make targets and the Go Docker test harness use the same launcher. The launcher preserves command arguments, exit status, environment, and the caller's working directory. Docker CLI and a reachable Docker daemon remain prerequisites. This pins Compose selection; it does not pin the Docker engine or make container execution hermetic. Image construction is a separate concern handled by rules_oci in the frontend PR. This change is independent of #810. Its local Make targets can inherit the launcher after rebasing; its separate browser-test runner still needs to replace its host Compose probe with the same launcher. Test Plan: Verified `make local-submitqueue-ps` on a host with legacy Compose 1.29.2 and no Docker Compose plugin. Built a temporary image through the pinned launcher on a host without Buildx and removed the image afterward. Automated validation: launcher tests, the real MySQL counter integration test, `make lint`, `make check-gazelle`, and `make check-tidy` passed.
mnoah1
left a comment
There was a problem hiding this comment.
Since this one is quite large, I'm going to leave some comments here and we can work through them more incrementally after getting this merged:
| const response = await client.getRequestSummaryByChangeURI({ queue, changeUri: reference.uri }); | ||
| appendSubmissions(response.requests); | ||
| return { submissions, nextPageToken: null }; | ||
| } |
There was a problem hiding this comment.
Why do we have a special case here for the git scheme? Isn't this more of a backend decision? If this is to the git demo query hints, we should figure out a better way to handle those on the backend and then clean up any special handling here.
| </div> | ||
| <section className="panel" aria-label="Queue requests"> | ||
| <RequestListView key={model.key} result={model.result} basePath={model.basePath} | ||
| changeLinks={model.changeLinks} changeLabels={model.changeLabels} /> |
There was a problem hiding this comment.
if an automatic refresh fails, we keep showing the previously loaded requests, but their change links disappear and their labels change. Can we keep the complete previous view until a refresh succeeds? We should also test a successful load followed by a failed refresh. This applies to both the queue list and request detail pages.
| @@ -506,11 +513,11 @@ local-submitqueue-ps: ## Show running containers and their ports | |||
|
|
|||
| local-submitqueue-restart: build-all-linux ## Restart all services (rebuild and restart) | |||
There was a problem hiding this comment.
Add web-image-load as a dependency here too so it will include web.
|
|
||
| async function load(props: NextPageProps) { | ||
| const [{ path = [] }, search] = await Promise.all([props.params, props.searchParams]); | ||
| return loadPage(`/${path.join("/")}`, JSON.stringify(search)); |
There was a problem hiding this comment.
Branch names containing slashes work in the page, but fail when loading its browser-tab title. For example, refs/heads/main becomes extra URL segments here instead of staying one branch name, so the title falls back to “SubmitQueue.” Can we escape the title generator’s decoded path segments before joining them, so it loads the same page as the renderer?
| * reviewable version, otherwise by scanning at most | ||
| * {@link MAX_CHANGE_SCAN_PAGES} queue pages of the receipt window. | ||
| */ | ||
| export async function readChangeSubmissions( |
There was a problem hiding this comment.
We’re doing quite a bit of change-history searching and identity matching in the web layer here. Could the gateway provide a paginated query for submissions belonging to a change, optionally filtered by version?
| return { | ||
| kind: "user", | ||
| title: "Request limit reached", | ||
| message: "The requested result set is too large. Narrow the time window and try again.", |
There was a problem hiding this comment.
UI doesn't have a time window control. Adjust to word this error more generally.
Summary
Why?
SubmitQueue has no browser UI, and deployers need one they can mount in their own web stack without forking it.
What?
web/submitqueue: the UI as one mountable package (routes, controllers, pages, styles, polling, cursor signing) behind a singlehandle(path)entry, free of generated protos, transports, and web frameworks. Change pages that scan the receipt window refresh on request instead of polling.web/service/submitqueue: the Next.js reference host and its wiring, with a Bazel-built image in the local stack.web/api: private generated gateway bindings for the host and the e2e test.doc/rfc/web-ui.md: URL, UX, and boundary decisions.test.log.Test Plan
✅
make web-check✅
make web-e2e-test✅
make lint,make check-gazelle, andmake check-tidyTry it locally
Requires Docker; Bazel brings its own Node.
Open the printed URL and sign in as
test/test. Start at the queue directory, open a queue, then a request's Summary and History tabs, and follow a change link to its submission history.make web-e2e-testruns the same flows headlessly.🤖 Generated with Claude Code