Repository navigation
Tags
Tags
feat(rod): show running duration for running jobs in queue table (#1588) * feat(rod): show running duration for running jobs in queue table Add `int64 running_duration_seconds = 12` to `DashboardJob` and populate it in `mapWorkUnitToDashboardJob` as `now - WorkUnitStatus.state_update_time` when the current execution is `RUNNING`; it stays 0 for non-running jobs and for missing, invalid, or future timestamps. `state_update_time` changes on every state transition, so the value is the time since the job last entered `RUNNING` and resets after a restart (`RESTARTING` -> `RUNNING`). Add a "Running time" column to the queue jobs table, formatted by the pure `QueueJobRunningTimePipe` (`45s`, `1m 30s`, `14h 22m`, `4d 19h`, or `–` for jobs that are not running), with a header tooltip explaining the restart reset. The pipe accepts the Proto3 JSON int64 string encoding. The "Position" column is unchanged. The column is shown in both the split view and the full-width view so long-running jobs are visible as soon as a queue is selected, without coupling the table to the dashboard's layout state; cells use `nowrap` inside the existing horizontally scrollable container. Bug: 582254269 TAG=agy CONV=da847493-a56a-41af-821a-cd635a811ddd * docs(rod): clarify running duration zero-value semantics The gateway marshals with EmitUnpopulated, so a zero running duration is sent as "0" rather than omitted; correct the pipe comment accordingly. Document in the proto that the field is also zero for a RUNNING job whose state_update_time is missing, invalid, or in the future. TAG=agy CONV=da847493-a56a-41af-821a-cd635a811ddd * docs(rod): state precisely what running duration measures Make the tooltip, proto comment and flow docs explicit that the value is the time since XMC observed the job entering RUNNING (at least one pod ready), trails the actual container start by the reconciliation delay, resets whenever the job leaves RUNNING, and is not cumulative across restarts. TAG=agy CONV=da847493-a56a-41af-821a-cd635a811ddd * docs(rod): describe running duration lag without readiness flapping XMC jobs have no readiness probes, so a pod is ready as soon as its containers run. State the real caveat instead: the value usually trails the container start by a few seconds, and by longer only if the reconciler was unavailable when the job started. Resets happen when a pod is replaced or the job restarts. TAG=agy CONV=da847493-a56a-41af-821a-cd635a811ddd
chore(agents): route discovery and bazel wildcards and enforce file-n… …aming lint (#1573) * docs(agents): route file discovery, bazel wildcards, and scratch scripts Surface three high-frequency cross-cutting routing conventions upfront in .agents/AGENTS.md and TypeScript/Core Engineering rules so sessions stop guessing file paths, Bazel package wildcards, or inline python3 -c strings: - Route unfamiliar path discovery to `git ls-files <dir>` and `git grep` before file reads/edits, and index canonical `tools/` script locations in `.agents/AGENTS.md`. - Clarify Angular/test file naming (`*.ng.html`, `*_test.ts`, `*.screenshot.spec.ts`, `*.test.js`) and the monolithic root `//cmd/ui:ui_unit_tests` Bazel package layout in `.agents/rules/languages/typescript_javascript.md`, alongside upfront `//<dir>/...` vs `:all` Bazel wildcard routing in `.agents/AGENTS.md`. - Cross-link the existing standalone `.py` scratch-script rule from `python.md` §4 and `shell.md` §3 in `.agents/AGENTS.md` and `.agents/rules/core_engineering.md` §9 so non-Python sessions follow it too. TAG=agy CONV=5cd211b5-35b1-40f8-be9a-6bba26108f2b * docs(agents): deduplicate routing bullets and enforce tool --help isolation * chore(lint): enforce UI and workflow file-naming conventions Add tools/lint/check_file_naming.py and wire it into .githooks/pre-commit and .github/workflows/lint.yml to mechanically enforce the UI template, UI test, and GitHub workflow script test naming conventions documented in .agents/rules/languages/typescript_javascript.md: - Angular component templates under cmd/ui/ must live under cmd/ui/app/ and use *.ng.html (with root cmd/ui/index.html allowlisted and verified against stale entries). - Angular Karma unit test specs must live under cmd/ui/app/ and use *_test.ts, closing the silent-skip gap where misnamed *.spec.ts or *.test.ts files compile without executing in Karma. - Playwright visual regression specs under cmd/ui/screenshot_tests/ must use *.screenshot.spec.ts while preserving non-spec helpers such as test_utils.ts. - Node workflow script tests under .github/scripts/ must be top-level *.test.js files matching CI's node --test .github/scripts/*.test.js invocation while preserving hyphenated production modules such as test-file-classifier.js. Includes hermetic unit tests in tools/lint/check_file_naming_test.py, Bazel targets in tools/lint/BUILD.bazel, and documentation updates in .agents/rules/rule_authoring_standards.md, tools/README.md, and docs/developer.md. Comment link: #1573 (comment) Comment link: #1573 (comment) * fix(lint): allow test_* TypeScript fixtures and check git index paths directly Remove the undocumented test_*.ts prohibition from tools/lint/check_file_naming.py so test-support modules under cmd/ui/app/testing/ and feature testing directories (such as test_fixtures.ts) are not flagged as misnamed Karma specs. Also tighten check_file_naming.py and its documentation/tests: - Run _check_github_scripts before _check_ts_test_outside_screenshots so misnamed .github/scripts/*.test.ts files report the .github/scripts/ *.test.js remediation message. - Check tracked git-index paths directly without worktree .exists() or .is_file() filters so staged violations with unstaged worktree deletions cannot bypass .githooks/pre-commit. - Require Karma _test specs under cmd/ui/app/ to end with .ts rather than .tsx/.mts/.cts, matching cmd/ui/angular.json (app/**/*_test.ts). - Clarify repo-wide *.spec.ts / *.test.ts and cmd/ui/ *.html scope in tools/README.md and docs/developer.md, and assert the exact HandledError stderr JSON contract in check_file_naming_test.py. Comment link: #1573 (comment)
feat(ui): add full-row expandable jobs toggle with localStorage persi… …stence (#1570) * feat(ui): add full-row expandable jobs toggle with cookie persistence Add a "View in full width" / "Exit full width" toggle button to the queue jobs table on the Resource Observability Dashboard (/resources) that stacks the cluster queues list and jobs table into full-width rows instead of hiding the queue list, and persists the layout preference in the xmc_jobs_full_width browser cookie. TAG=agy CONV=c0655880-9a67-4bdd-aaa7-bc8e8631798f * fix: address self-review feedback (iteration 1) TAG=agy CONV=23cac48a-f5e0-4dc9-b0fa-c46ba04c7f87 * fix(ui): repair screenshot spec, regenerate baselines, and format dashboard Restore `resource_dashboard.screenshot.spec.ts` and append a single full-width visual regression test using state-based assertions, regenerate the Resource Dashboard Playwright baseline PNG snapshots (`initial`, `queue-selected`, and `full-width`), format TypeScript files with Prettier, and verify resize divider remounting and split ratio preservation when exiting full-width mode. Comment link: #1570 (comment) Comment link: #1570 (comment) TAG=agy CONV=23cac48a-f5e0-4dc9-b0fa-c46ba04c7f87 * test(ui): enforce fixed height in full-width dashboard screenshot test Pin `xmc-resource-dashboard` height (`1160px`) and increase the viewport height (`1300px`) in the full-width Playwright screenshot test, matching the cross-environment bounding-box pattern used in sibling screenshot specs so 1px font line-height differences between gLinux and Ubuntu CI runners do not mismatch canvas dimensions. TAG=agy CONV=23cac48a-f5e0-4dc9-b0fa-c46ba04c7f87 * fix(ui): add visible keyboard focus ring to full-width toggle button Add an explicit `&:focus-visible` outline (`2px solid #1a73e8` with `outline-offset: 2px`) on `button.full-width-toggle-btn` so keyboard focus remains clearly visible in both the outlined default state and the `#1a73e8`-filled `.active` state (WCAG 2.4.7 Focus Visible). TAG=agy CONV=23cac48a-f5e0-4dc9-b0fa-c46ba04c7f87 * refactor(ui): switch jobs layout persistence to localStorage and project header actions Intentionally refines two internal design choices from #1567 while preserving identical visual layout and user behavior: - Replace `document.cookie` (`xmc_jobs_full_width`) with `window.localStorage` (`xmc-jobs-full-width`) to align with existing XMC frontend preference conventions (`StatusMessageFilterService`) and avoid sending a client-only layout flag in HTTP `Cookie` headers on API requests. - Replace `showFullWidthToggle` / `isFullWidth` inputs on `QueueJobsTable` with a generic `<ng-content select="[headerActions]" />` slot in `.title-row` so `QueueJobsTable` stays layout-agnostic and `ResourceDashboard` owns the full-width toggle button directly. TAG=agy CONV=23cac48a-f5e0-4dc9-b0fa-c46ba04c7f87 --------- Co-authored-by: Vlad Lukiantsev <vluk@google.com>
refactor(pr_review): run subprocesses through tool_utils.run_command (#… …1559) * refactor(pr_review): run subprocesses through tool_utils.run_command github_utils, reply_pr_comment and wait_for_ci called subprocess directly with hand-rolled capture, timeout and decoding options. Route them through tool_utils.run_command, which now supports input_text, timeout and errors. All calls pass log_cmd=False and log_on_error=False so stdout stays JSON-only and stderr is unchanged. No handled_instruction is set, so the raw CalledProcessError/TimeoutExpired/OSError still reach the existing handlers: github_utils' credential fallback, reply_pr_comment's "unknown" commit fallback, and wait_for_ci's transient-retry loop with its 60s per-call timeout. wait_for_ci's two gh calls share a small _run_gh helper. TAG=agy CONV=2937a1a9-78d5-4d4f-806c-262c963bb857 * test(pr_review): assert the full gh call for API payloads test_call_github_api_gh_cli_sends_payload_on_stdin only checked the argv tail and input_text, so a changed method or endpoint, or dropped log_cmd/log_on_error flags (which keep tool stdout JSON-only), would still pass. Assert the complete run_command call and the return value, matching the GET test. TAG=agy CONV=2937a1a9-78d5-4d4f-806c-262c963bb857
fix(ui): fail fast with npm ci hint and document canonical test comma… …nds (#1531) * fix(ui): fail fast with npm ci hint when UI dependencies are missing Contributors frequently run tests outside the canonical runners: host `go build/vet/test` (which always fails because Go packages import Bazel-generated protobuf code), guessed Bazel target names, and UI tests or lint in fresh worktrees that never ran `npm ci`. Most of this is already covered by existing tooling (tools/run_affected_tests.py for the change set, `bazel test //<dir>/...` for a directory), so this change documents the canonical commands where they were missing instead of adding new tooling: - golang.md: Go builds and tests are Bazel-only; discover targets with `bazel query 'tests(//<dir>/...)'` instead of guessing. - python.md: same directory/target discovery guidance in the existing Bazel-only bullet. - typescript_javascript.md, developer.md, xmc_feature_development: run `npm ci --legacy-peer-deps` in cmd/ui before UI tests and lint, matching .github/actions/run-ui-tests. - pre-commit: suggest `npm ci --legacy-peer-deps` instead of `npm install` so local installs match the lockfile and CI. //cmd/ui:ui_unit_tests (cmd/ui/run_ui_tests.py) now exits 1 with the exact install command when node_modules/.bin/ng is missing, instead of an opaque npx failure. TAG=agy CONV=8675b6d8-e766-4541-a75f-70dd9ca9dbbb * fix(ui): move run_ui_tests into a py_library and assert the npx call Follows the existing build_ui_oci_lib/server pattern: run_ui_tests_test depends on a run_ui_tests_lib py_library instead of listing the module in its own srcs. The pass-through test now asserts subprocess.run was called exactly once before inspecting its arguments. Comment link: #1531 (comment) Comment link: #1531 (comment) TAG=agy CONV=8675b6d8-e766-4541-a75f-70dd9ca9dbbb
feat(cms): serve the Component Manager Service from dbstore on Postgr… …eSQL (#1505) Now that PostgreSQL implements component writes, `initCMS` uses `dbstore.Store` whenever storage is configured, regardless of backend, instead of falling back to the in-memory `MemoryStore` on PostgreSQL. Remove the backend parameter and `ProdServer.StorageBackend`, which existed only for the Spanner-only gate. TAG=agy CONV=5d43b8db-2f9c-4908-a311-376a2b7dfdf0
feat(cms): serve the Component Manager Service from dbstore on Postgr… …eSQL (#1505) Now that PostgreSQL implements component writes, `initCMS` uses `dbstore.Store` whenever storage is configured, regardless of backend, instead of falling back to the in-memory `MemoryStore` on PostgreSQL. Remove the backend parameter and `ProdServer.StorageBackend`, which existed only for the Spanner-only gate. TAG=agy CONV=5d43b8db-2f9c-4908-a311-376a2b7dfdf0
feat(cms): serve the Component Manager Service from dbstore on Postgr… …eSQL (#1505) Now that PostgreSQL implements component writes, `initCMS` uses `dbstore.Store` whenever storage is configured, regardless of backend, instead of falling back to the in-memory `MemoryStore` on PostgreSQL. Remove the backend parameter and `ProdServer.StorageBackend`, which existed only for the Spanner-only gate. TAG=agy CONV=5d43b8db-2f9c-4908-a311-376a2b7dfdf0
PreviousNext