Skip to content

SEP-1655: Move the remaining Nomad-specific vocabulary out of app/tasks/models.py - #1226

Open
peter-o-addo wants to merge 25 commits into
mainfrom
SEP-1655
Open

SEP-1655: Move the remaining Nomad-specific vocabulary out of app/tasks/models.py#1226
peter-o-addo wants to merge 25 commits into
mainfrom
SEP-1655

Conversation

@peter-o-addo

@peter-o-addo peter-o-addo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Summary

Move remaining Nomad-specific vocabulary out of the tasks models layer into the Nomad executor package, with executor-neutral log-cursor columns and a regenerated API contract.

  • app/tasks/execution/executors/nomad/__init__.py, app/tasks/logs/log_writer.py: break the Nomad package import cycle via lazy export and deferred config imports
  • app/tasks/execution/executors/nomad/steps.py, app/tasks/execution/executors/nomad/constants.py, app/tasks/models.py, app/tasks/db/seed.py, app/sep/apps/framework/spec.py: relocate the Nomad-owned constants and keep internal task names without importing the executor package. RUN_SCRIPT_OUTPUT_FILES_PATH lives beside NomadStep and derives from it (f"{NomadStep.RUN_SCRIPT}/local/output_files") so renaming the step cannot leave the path behind; constants.py keeps the seeded Nomad-only task name
  • app/tasks/models.py, app/tasks/crud.py, app/tasks/logs/log_writer.py, app/tasks/execution/executors/nomad/models.py: rename Nomad-named log-cursor columns/accessors to executor-neutral names and neutralize related docs, including the four output_files_path descriptions
  • app/tasks/migrations/versions/2026_07_30_1300-c8e4a2b91f70_rename_log_cursor_columns_executor_neutral.py: rename those columns in place with a reversible Alembic migration
  • app/tasks/models.py: the stale-task alert summary now reads skipped as stale (executor placement delayed past threshold) instead of naming Nomad — the one user-visible behaviour change, recorded in changelog.d/SEP-1655.changed.md
  • app/tasks/models.py: the alert-hook builder is imported at module scope; the deferral it replaced guarded no cycle, since alert_hooks reaches app.tasks.models only under TYPE_CHECKING
  • changelog.d/SEP-1630.added.md: record that TaskHistory responses now carry a required log_producer_epoch field. The field's existence is new relative to v0.13.1 and belongs to SEP-1630, which introduced it and is already closed
  • frontend/packages/api/specs/{tasks,sep}.json, frontend/packages/api/src/generated/{tasks,sep}.ts, tests/app/sep/snapshots/openapi/*.json: regenerate the OpenAPI/TS client and snapshot fixtures for the TaskHistory field rename and the neutralized docstrings
  • Tests: cover the import-cycle fix and column-rename migration, pin the new alert wording, and update references for the relocated constants and renamed fields. Separately, 31 fixture docstrings across 19 files that opened with Yield on functions that return were corrected to Return

The changelog.d/SEP-1630.breaking.md fragment that earlier revisions of this branch carried was dropped: the migration that added log_allocation_epoch is not reachable from the v0.13.1 tag, so no released version ever returned the old field name and the rename is invisible from outside.

Tested

  • Confirm SQLite uses producer_fetch_offset / producer_epoch / log_producer_epoch only (no nomad_offset / allocation_epoch).
  • Confirm GET /api/tasks/history/{id} has no log_allocation_epoch and reports log_capture after the task finishes.
  • Run a Nomad run-command (e.g. ping) and confirm logs grow while running, then finish complete with advancing producer_fetch_offset.

Operator note. Two of the renamed columns (taskhistory_log_state.nomad_offset, taskhistory_log_state.allocation_epoch) shipped in v0.13.1, so rolling the image back to a build from before this release requires alembic --name tasks downgrade a19da5cf0bca first.

Checklist

  • New/modified functions have type hints and rST docstrings
  • New tests added for new features or bug fixes
  • All tests pass locally (make test)
  • Pre-commit hooks pass (make run-pre-commit)
  • Database migrations generated if models changed (make makemigrations)
  • User-facing changes documented (README, inline help, UI text)
  • Configuration changes documented with examples
  • Changelog fragment added under changelog.d/ if the change is user-facing (make changelog-add), or confirmed N/A (internal-only change, or a same-release-cycle fix for an unreleased sibling ticket)

@peter-o-addo
peter-o-addo marked this pull request as ready for review July 30, 2026 15:04
Copilot AI review requested due to automatic review settings July 30, 2026 15:04

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the executor-neutralization work in the Tasks service by relocating remaining Nomad-specific vocabulary/constants out of the tasks models layer into the Nomad executor package, renaming Nomad-named log cursor columns/accessors to executor-neutral terms, and regenerating the API/TS client contract (with a documented breaking change for the renamed TaskHistory field).

Changes:

  • Break the Nomad executor import cycle by switching app.tasks.execution.executors.nomad to a lazy NomadExecutor export and deferring app.tasks.config imports where needed.
  • Rename Nomad-vocabulary log cursor columns to executor-neutral names (nomad_offsetproducer_fetch_offset, allocation_epochproducer_epoch, log_allocation_epochlog_producer_epoch) with a reversible Alembic migration and updated CRUD/log-writer logic.
  • Regenerate OpenAPI specs + TS clients and add a breaking changelog fragment for the TaskHistory response field rename; update tests accordingly (including new regression tests for the import-cycle and migration rename).

Reviewed changes

Copilot reviewed 21 out of 23 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/app/tasks/test_routes.py Updates test imports to pull RUN_SCRIPT_OUTPUT_FILES_PATH from Nomad constants.
tests/app/tasks/migrations/test_taskhistory_log_nomad_cursor.py Updates existing migration test expectations to use executor-neutral cursor column names.
tests/app/tasks/migrations/test_rename_log_cursor_columns.py Adds coverage for the rename migration upgrade/downgrade preserving values.
tests/app/tasks/logs/test_log_writer.py Updates log-writer tests to use new cursor/epoch parameter and field names.
tests/app/tasks/logs/test_log_eviction.py Updates eviction test to pass the renamed epoch argument.
tests/app/tasks/execution/executors/nomad/test_models.py Updates Nomad executor tests for renamed cursor/epoch fields.
tests/app/tasks/execution/executors/nomad/test_import_cycle.py Adds a subprocess-based regression test ensuring Nomad submodules import without config-first ordering.
tests/app/tasks/db/test_seed.py Updates seed tests to import Nomad-only task name from Nomad constants.
tests/app/sep/apps/framework/test_spec.py Updates framework spec tests to import RUN_SCRIPT_OUTPUT_FILES_PATH from Nomad constants.
frontend/packages/api/src/generated/tasks.ts Regenerates TS types/docs including log_producer_epoch and doc wording adjustments.
frontend/packages/api/src/generated/sep.ts Regenerates shared TS types/docs for the same doc wording adjustments.
frontend/packages/api/specs/tasks.json Regenerates OpenAPI spec reflecting log_producer_epoch and doc wording adjustments.
frontend/packages/api/specs/sep.json Regenerates OpenAPI spec reflecting doc wording adjustments.
changelog.d/SEP-1630.breaking.md Documents the breaking rename from log_allocation_epoch to log_producer_epoch.
app/tasks/models.py Removes RUN_SCRIPT_OUTPUT_FILES_PATH from tasks models; renames cursor/epoch columns and neutralizes related docs; updates internal task-name set.
app/tasks/migrations/versions/2026_07_30_1300-c8e4a2b91f70_rename_log_cursor_columns_executor_neutral.py Adds reversible Alembic column renames for executor-neutral naming.
app/tasks/logs/log_writer.py Renames log-writer cursor/epoch args and guards; defers config import to avoid import cycles.
app/tasks/execution/executors/nomad/models.py Updates Nomad executor log fetching/persisting logic to use executor-neutral cursor/epoch naming.
app/tasks/execution/executors/nomad/constants.py Introduces a dependency-free Nomad constants module for layout and Nomad-only system task names.
app/tasks/execution/executors/nomad/init.py Implements lazy NomadExecutor export via __getattr__ to break import cycles.
app/tasks/db/seed.py Switches seed-time Nomad constants to the new Nomad constants module to avoid heavy imports.
app/tasks/crud.py Renames TaskHistory epoch accessor/mutator methods and updates state-frontier persistence APIs to new field names.
app/sep/apps/framework/spec.py Updates framework spec code to import RUN_SCRIPT_OUTPUT_FILES_PATH from Nomad constants.

Comment thread app/tasks/logs/log_writer.py
Comment thread app/tasks/execution/executors/nomad/models.py Outdated
Comment thread app/tasks/models.py
@peter-o-addo peter-o-addo added the qa in progress Someone is currently testing this PR - do not merge it label Aug 3, 2026
@github-actions github-actions Bot added the svc:tasks PR touches the tasks service (app/tasks/) label Aug 17, 2026
@peter-o-addo

Copy link
Copy Markdown
Contributor Author

1. DB schema

sqlite3 tasks.db "PRAGMA table_info(taskhistory_log_state);" | rg 'producer_|nomad_|allocation_'
sqlite3 tasks.db "PRAGMA table_info(taskhistory);" | rg 'epoch'
sqlite3 tasks.db "SELECT * FROM alembic_version_tasks;"
producer_offset | producer_fetch_offset | producer_epoch
log_producer_epoch
c8e4a2b91f70

No nomad_offset / allocation_epoch / log_allocation_epoch.


2. API contract

curl -sS -H "Authorization: Bearer $TOKEN" \
  'http://127.0.0.1:8000/api/tasks/history/17'
{
  "id": 17,
  "status": "success",
  "log_capture": "complete",
  "has_logs": true,
  "has_log_allocation_epoch": false,
  "has_log_producer_epoch": false
}

Old name absent. (log_producer_epoch lives on the ORM/OpenAPI TaskHistory model, not on TaskHistoryResponse.)


3. Live Nomad logs

Dispatch

POST /api/tasks/execute/run-command
{"meta":{"target":"pbm-test-03","command":"ping","args":"-c\n30\n127.0.0.1","log_capture_hold_seconds":"5"}}
{"id": 17, "status": "running"}

While running → after finish (sync + DB)

RUNNING  incomplete  producer_fetch_offset=334   producer_epoch=359818
SUCCESS  complete    producer_fetch_offset=1931  producer_epoch=359818
GREW_WHILE_RUNNING True

Logs

curl -sS -H "Authorization: Bearer $TOKEN" \
  'http://127.0.0.1:8000/api/tasks/history/17/logs/'
{
  "step": "run-script",
  "type": "stdout",
  "offset": 1931,
  "msg": "PING 127.0.0.1 ...\n30 packets transmitted, 30 received, 0% packet loss..."
}

@peter-o-addo peter-o-addo added qa passed Tests for this PR are completed and successful. and removed qa in progress Someone is currently testing this PR - do not merge it labels Aug 17, 2026
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown

Coverage report

Click to see where and how coverage changed

FileStatementsMissingCoverageCoverage
(new stmts)
Lines missing
  app/sep/apps/framework
  spec.py
  app/sep/sync/syncers
  pmm.py
  app/tasks
  crud.py
  models.py
  app/tasks/db
  seed.py
  app/tasks/execution/executors/nomad
  constants.py
  models.py 1445
  app/tasks/logs
  log_writer.py
  app/tasks/migrations/versions
  2026_07_30_1300-c8e4a2b91f70_rename_log_cursor_columns_executor_neutral.py 64
Project Total  

This report was generated by python-coverage-comment-action

@yyyyyyyan yyyyyyyan self-assigned this Aug 19, 2026
Every other alter_column in the tree goes through batch_op; a bare call
breaks the SQLite-backed paths. Also drops the both-columns-present
branch, which dropped the old column without carrying its values over.
…utionEvent opener

The annotation is the source of truth, so a :type:/:rtype: echoing it is
redundant; the docstrings this branch rewrote had shed them only on their
new lines. Opens ExecutionEvent with an imperative verb. Regenerates the
OpenAPI specs and TS clients, which embed both docstrings verbatim.
…e docstrings

The hand-maintained tuple covered three of the package's four submodules
while the test claimed to cover any of them, so a submodule added later
would join the package without joining the regression test. Deriving it
from the package closes that, and an emptiness guard keeps the probe from
passing vacuously. Also corrects three fixture docstrings that said Yield
on a function that returns.
log_allocation_epoch never appeared in a tagged release -- the migration
that added it is not reachable from v0.13.1 -- so there is no old field
name for consumers to migrate off, and the fragment was filed under
SEP-1630 rather than this PR's ticket.
…dels.py

Covers the three spots outside the ticket's enumerated docstring list:
TaskHistoryLog.source (the sibling of the already-neutralized
TaskHistoryLogState.source), TaskHistoryStatusEnum.STALE, and the
operator-facing stale-task alert summary. The alert text is released, so
it ships with a changelog fragment; the enum docstring propagates into
every app's OpenAPI snapshot.
@yyyyyyyan

yyyyyyyan commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Follow-up from review — release-notes coverage for the new TaskHistory field.

Relative to v0.13.1, TaskHistory API responses gain a required log_producer_epoch property, and no changelog fragment under either ticket covers that addition.

The field itself was introduced by SEP-1630, which is still unreleased — the migration that added log_allocation_epoch is not reachable from the v0.13.1 tag. This PR only renames it, which is why the changelog.d/SEP-1630.breaking.md fragment was removed here: the consumer-visible break it described (migrating off the old field name) never shipped, because no tagged release ever returned the old name.

What is genuinely new to an operator upgrading from v0.13.1 is the field's existence, and that belongs to SEP-1630 rather than to this ticket.

Suggested wording, filed under SEP-1630: the TaskHistory schema returned by POST /history/ — and any other endpoint that returns TaskHistory — now carries a log_producer_epoch integer field.


Resolved. Implemented in this PR as changelog.d/SEP-1630.added.md (27afbeb) rather than deferred: SEP-1630 is already Done, so no future PR would have carried its fragment, and the field is in TaskHistory.required on eight endpoints. Marker cleared — no Jira draft needed.

@yyyyyyyan

yyyyyyyan commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Follow-up from review — Yield docstrings on fixtures that return.

An AST sweep of tests/ finds 31 functions whose docstring opens with Yield ... but which return rather than yield, so the first line describes a generator contract the function does not have. Three of them were inside this PR's diff and are fixed here; the remaining 31 are pre-existing and outside its subject.

Densest clusters:

  • tests/app/sep/apps/framework/test_api.py — 9 sites (the authed_* / unauthed_* client fixtures)
  • tests/app/tasks/migrations/ — 3 sites (test_relativize_task_payload_refs.py, test_run_result_recorder_column.py, test_setting_class_enum.py), all the same tasks_alembic_config fixture copied across files

The fix is mechanical — YieldReturn — but it spans the whole test tree and touches files unrelated to this ticket, so it wants its own PR rather than riding along here.


Resolved. Implemented in this PR (b05ade6): all 31 openers rewritten YieldReturn across 19 files, verified by re-running the AST audit to zero and the touched suites green. Marker cleared — no Jira draft needed.

@yyyyyyyan yyyyyyyan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peter-o-addo — pushed fixes for everything this review could act on. Not approving yet, because two items are tracked separately rather than settled here:

  • Relative to v0.13.1, TaskHistory responses gain a required log_producer_epoch field that no changelog fragment covers. The addition belongs to SEP-1630, which introduced the field and is still unreleased, so it is not this PR's fragment to add — see the follow-up comment above.
  • 31 fixture docstrings across tests/ open with Yield on functions that return. The three inside this diff are fixed; the rest span files unrelated to this ticket and want their own PR.

Two notes on what changed under you, since neither corresponds to a review comment:

  • changelog.d/SEP-1630.breaking.md was removed. Its stated break — consumers migrating off log_allocation_epoch — cannot have occurred: the migration that added that column is not reachable from the v0.13.1 tag, so no published release ever returned the old field name. The rename is invisible from outside.
  • 40 :type: / :vartype: / :rtype: directives that restate their annotations were dropped from the docstrings this branch had already rewritten — 26 in app/tasks/models.py, plus 9 in app/tasks/logs/log_writer.py, 3 in app/tasks/execution/executors/nomad/models.py and 2 in app/tasks/crud.py. Those were pre-existing on the base branch; editing a docstring is what obliges shedding them, so they had to go for the branch to pass the docstring checks.

Everything else — the batch_alter_table wrap on the rename migration, the executor-neutral alert summary and its fragment, and the derived submodule list in the import-cycle test — is in the pushed commits.

@yyyyyyyan

Copy link
Copy Markdown
Contributor

Follow-up from review — TaskExecutionRequest.tracking still names Nomad concepts in the executor-agnostic model.

app/tasks/models.py:279 defaults the field to {"allocation_id": None, "evaluation_id": None}, documented at :270-271 as "a dictionary with keys for allocation and evaluation IDs". Allocations and evaluations are Nomad concepts, and this is the executor-agnostic model module — arguably the largest piece of Nomad vocabulary left in it after SEP-1655.

It is out of scope here for a concrete reason rather than an arbitrary one: unlike the three columns this PR renamed, these are keys inside a persisted/serialized mapping, so neutralizing them is a data-shape change and needs its own migration story plus a sweep of every producer and consumer of tracking. SEP-1655 is scoped to a rename-and-relocate with a column migration, and the lines are untouched by its diff.

Worth its own ticket in the same neutralization epic.

@yyyyyyyan

yyyyyyyan commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Follow-up from review — the Nomad executor package now has two dependency-free constant homes.

app/tasks/db/seed.py:38-45 imports from app/tasks/execution/executors/nomad/constants.py and app/tasks/execution/executors/nomad/steps.py side by side, for the same class of value. steps.py already describes itself as "a pure leaf: it imports nothing beyond enum" and already holds NON_PERSISTABLE_STEPS, NOMAD_STEP_ANONYMIZE and LOG_CAPTURE_HOLD_DEFAULT_SECONDS, so it satisfies the same dependency-free requirement the new module was added for.

RUN_SCRIPT_OUTPUT_FILES_PATH in particular fits steps.py on responsibility: its value is NomadStep.RUN_SCRIPT plus a suffix, and constants.py:23-29 says exactly that in prose ("the run-script/local/ prefix is the Nomad allocation layout (run-script task name + ${NOMAD_TASK_DIR})") while re-spelling "run-script" as a literal. Deriving it (f"{NomadStep.RUN_SCRIPT}/local/output_files") would remove the drift risk. CHECK_NOMAD_CERT_EXPIRY_TASK_NAME is a seeded SEP task-row name rather than a job-spec step, so it reasonably stays where it is.

Not raised against SEP-1655: its implementation notes named a new constants.py, and "run-script" is already hardcoded at six other sites across app/sep/** (topology/api_routes.py:77, atw/send.py:83, backup_mongo/deps.py:244, sync/syncers/system_facts/syncer.py:151, sync/syncers/mysql/syncer.py:391), so consolidating it is a wider cleanup than that PR.


Resolved. Implemented in this PR (e6ef47c): RUN_SCRIPT_OUTPUT_FILES_PATH now lives in steps.py as f"{NomadStep.RUN_SCRIPT}/local/output_files", with the four importers retargeted. steps.py still imports nothing but enum, constants.py keeps the seeded task name, and the resolved value is byte-identical. Marker cleared — no Jira draft needed.

@yyyyyyyan

yyyyyyyan commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Follow-up from review — four output_files_path docstrings still describe the path as "allocation-relative".

app/tasks/models.py:374, :436, :495 and :540 all open with "The allocation-relative path where output files …". "Allocation" is the Nomad executor's word, and these sit in the executor-agnostic model module — the surface SEP-1655's in-scope note asks to sweep. The relocated constant now documents the Nomad layout in app/tasks/execution/executors/nomad/constants.py, which is where that vocabulary belongs; the generic field description is the remainder.

Suggested replacement for the opening clause only, leaving each site's tail intact: "The path, relative to the executor's working directory, where output files …".

Left for its own change rather than fixed inline, because it is not prose-only: this text reaches the published contract, so it needs a make regen-specs pass. It currently appears in frontend/packages/api/specs/tasks.json (×2), frontend/packages/api/specs/sep.json, frontend/packages/api/src/generated/tasks.ts (×2) and tests/app/sep/snapshots/openapi/tasks.json, and the snapshot suite fails until those are regenerated.


Resolved. Implemented in this PR (4ce4d57): the four docstrings now read "The path, relative to the executor's working directory, ...", and make regen-specs regenerated the two spec files, the two TS clients and the tasks snapshot. The regen diff is 13 insertions / 10 deletions, all of it this prose — no unrelated drift. Marker cleared — no Jira draft needed.

@yyyyyyyan

yyyyyyyan commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Follow-up from review — the deferred imports in _check_nomad_cert_expiry are load-bearing for test patching, which is not a sanctioned reason to defer.

This marker originally claimed two sites needed their import cycle named. That diagnosis was wrong on both, and the corrected finding is narrower but more interesting.

app/tasks/models.py — done, not deferred. There is no cycle: alert_hooks imports app.tasks.models only under TYPE_CHECKING, and hook_resolver is stdlib-only. So the deferral bought nothing (the plugin still loads lazily inside resolve_hook), and the import was promoted to module scope in 2ac9542.

app/tasks/celery.py:1018-1020 — still open, and the reason is not a cycle either. app.core.alerts never imports app.tasks, so there is nothing circular here. Three of the four names are already imported at module scope — alert_service at line 44, AlertSeverity at line 45, utc_now at line 58 — so the block re-imports them redundantly and only alert_settings is new.

What the deferral actually does is keep those names late-bound, which is what lets six tests patch them at their source modules:

  • tests/app/tasks/test_celery.pymocker.patch("app.core.alerts.config.alert_service", ...) at lines 3146, 3173, 3200, 3222, 3250, 3294, plus mocker.patch("app.core.utils.utc_now", ...)
  • tests/app/tasks/test_celery_settings_override.py:479 — the nested-leaf-override assertion

I confirmed this empirically: promoting the imports and deleting the block fails 4 tests in TestCheckNomadCertExpiry and 1 in TestCheckNomadCertExpiryWithOverride, because the patches no longer reach the already-bound names. That change was reverted rather than shipped.

So the production structure is being shaped by test patch targets, and "so tests can patch the source module" is neither of the two sanctioned reasons for an inline import. A comment cannot fix it — the remedy is to promote the imports and retarget the patches to the binding site (app.tasks.celery.alert_service, app.tasks.celery.alert_settings, app.tasks.celery.utc_now), which is where the names are actually looked up. That touches two test files in an area unrelated to SEP-1655, which is why it wants its own change.

@yyyyyyyan

Copy link
Copy Markdown
Contributor

Follow-up from review — 18 subprocess.run call sites in the test suite have no timeout=.

SEP-1655 added timeout=300 to the child-interpreter probe in tests/app/tasks/execution/executors/nomad/test_import_cycle.py, matching the precedent in tests/app/test_conftest_collection_order.py:80. Sweeping the rest of tests/ for the same shape finds 18 unbounded call sites across 12 files:

  • tests/app/test_openapi_specs_fresh.py:35, :65
  • tests/app/sep/apps/framework/test_scaffold.py:754, :1138, :1183
  • tests/app/sep/apps/framework/test_contract_suite.py:680
  • tests/app/sep/apps/framework/test_oneof_schema_determinism.py:328
  • tests/app/sep/apps/dipper/test_pcs_collect_pmm_mysql.py:43, :104, :151
  • tests/app/sep/apps/dipper/test_pcs_collect_pmm_valkey.py:129
  • tests/app/sep/apps/dipper/test_pcs_collect_environment_valkey.py:135
  • tests/app/tasks/db/test_seed.py:282, :356
  • tests/app/core/settings_override/test_policy.py:361
  • tests/scripts/test_release.py:881
  • tests/sidecar/test_verify_image_apps.py:88
  • tests/sidecar/test_settings_env.py:60

A child that hangs rather than exiting non-zero stalls the whole run with no diagnostic, and CI has no per-test time limit to fall back on. The fix is mechanical — add a bounded timeout= — but it spans files unrelated to SEP-1655, so it wants its own change.

@github-actions github-actions Bot added app:archives PR touches the archives app slice app:mysql_backups PR touches the mysql_backups app slice labels Aug 19, 2026
@yyyyyyyan

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Co-authored-by: yyyyyyyan <24644216+yyyyyyyan@users.noreply.github.com>

Copilot AI commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into this branch and fixing all merge conflicts in commit 40e50f38.

Copilot AI requested a review from yyyyyyyan August 19, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app:archives PR touches the archives app slice app:mysql_backups PR touches the mysql_backups app slice frontend python qa passed Tests for this PR are completed and successful. svc:tasks PR touches the tasks service (app/tasks/)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants