Skip to content

Account repository installation ID validation: worker evidence

Task: 02793b0f-15cc-45a2-bb57-ed681b57d4bc, frozen version 2. Execution: 0064c821-f36a-4dbc-87cb-088827dbb76e. Repository: h8v6/heyaira; branch: heyaira/02793b0f. Source and starting HEAD: e825a428a1350497fb59fea5dfa32d01fdf5195d. Starting parent: 3ac5376d99e472098bf0cfbc1cafcb08fc376ad0. Starting worktree was clean. No existing commits were rewritten.

Cause and implementation

The CLI previously opened its database pool and upserted the supplied string without validating it. On conflict, the upsert overwrote a working installation ID and printed success. The fix requires the entire ID to match ASCII [1-9][0-9]* before settings or pool creation. The parser still requires the flag, and valid IDs continue through the existing code. No migration, dispatch logic or database constraints changed.

Confidence is high for the scoped behavior: T1 reproduced the actual row overwrite on PostgreSQL before the fix, and passes with the fix. Independent verification and acceptance belong to Bridge. Nothing was pushed or deployed.

Environment and command convention

All commands ran in /Users/jablonskib/HeyAira-agents/.heyaira-worktrees/heyaira/02793b0f-worker. Tests used the existing Python 3.12.7 and supplied writable TMPDIR. PYTHONPATH=src points imports at this worktree; no packages were installed. The supplied HEYAIRA_TEST_ADMIN_DATABASE_URL connects to the real local test PostgreSQL. Account/dispatch fixtures create, migrate and drop isolated databases. Git and authentication responses in the MCP tests are synthetic; the dispatch handlers, catalog validator and PostgreSQL are real. Database URLs and credentials are intentionally absent from this evidence.

The test runs below used the source HEAD plus the working test changes, and, after the reproduction, the two-line admin fix. The local commit containing this evidence pins those tested files; its SHA is recorded in the RESULT receipt.

Initial collection failure and corrected import environment

python -m pytest tests/test_account_instruction_sources.py -q
exit: 2
ERROR tests/test_account_instruction_sources.py
ModuleNotFoundError: No module named 'heyaira'
1 error in 1.97s

Setting PYTHONPATH=src, as the repository's test instructions require, resolved this collection failure. No dependency installation was needed.

K1: T1 real PostgreSQL regression

Frozen method: Run the new T1 test with pytest -> passed; read the assertions that the stored row is unchanged.

Before editing admin.py:

PYTHONPATH=src python -m pytest tests/test_account_instruction_sources.py -k test_t1 -q --tb=short
exit: 1
11 failed, 36 deselected in 12.65s

Observed assertion excerpts (synthetic fixture data):

assert after == before
{'github_installation_id': ''} != {'github_installation_id': '789'}
{'github_installation_id': 'garbage'} != {'github_installation_id': '789'}
{'github_installation_id': '0'} != {'github_installation_id': '789'}

All 11 cases failed at full-row equality, and each call printed account_repository_id=<synthetic UUID> instead of rejecting the input. This fails without the fix because the real upsert replaces 789 with the invalid string. Additional cases cover leading zeros, signs, whitespace, a trailing newline, a non-ASCII digit and a decimal point.

After the fix, identical command:

exit: 0
...........                                                              [100%]
11 passed, 36 deselected in 16.11s

T1 reads the entire stored row before and after each call, requires equality, records pool creation calls and requires none, and checks a nonzero SystemExit with an error naming --github-installation-id. Its recording wrapper would open the real pool if called, so the baseline reproduction exercises real SQL. The existing valid-ID registration test also passes in the suite.

criterion_id: K1 outcome: pass evidence_path: tests/test_account_instruction_sources.py feedback: T1 pytest exit 0; 11 passed on real PostgreSQL; full row unchanged and zero pool opens. Before the fix all 11 failed on the overwritten row.

K2: duplicate sources and historical stored contract

Frozen method: Run T2 and T3 with pytest -> passed.

PYTHONPATH=src python -m pytest tests/test_account_instruction_sources.py -k 'test_t2 or test_t3' -q --tb=short
exit: 0
.....                                                                    [100%]
5 passed, 42 deselected in 9.39s

T2 covers pinned plus tracking in one repository and tracking sources in two repositories, through both dispatch tools. Each case retries the rejected dispatch twice and requires catalog_source_mapping_ambiguous_or_missing, no Git file reads, no branch-head reads, no workflows/executions and unchanged task version. T3 removes layers and layers_missing from a contract without account sources, stores it in PostgreSQL, reads it back and successfully calls validate_catalog_contract without further Git reads.

criterion_id: K2 outcome: pass evidence_path: tests/test_account_instruction_sources.py feedback: T2/T3 pytest exit 0; 5 passed; duplicates rejected deterministically before Git and stored historical contract validates.

K3: full targeted suites, permission blocker

Frozen method: python -m pytest tests/test_account_instruction_sources.py tests/test_backup_state_marker.py tests/test_tracking_sources_compat.py -q -> passed

For this command, PYTHONPATH=src was set and HEYAIRA_BACKUP_E2E_DATABASE_URL was set to the supplied test admin URL. The backup fixture creates its own isolated database per test, retaining the same connection role and Unix socket. No URL was printed or persisted.

python -m pytest tests/test_account_instruction_sources.py tests/test_backup_state_marker.py tests/test_tracking_sources_compat.py -q
exit: 1
3 failed, 131 passed, 3 errors in 56.16s

Actual failures:

FAILED test_a_statistics_reset_never_repeats_an_earlier_marker
FAILED test_the_marker_does_not_depend_on_the_session_time_zone
asyncpg.exceptions.InsufficientPrivilegeError: permission denied for function pg_stat_reset

FAILED test_a_discarded_statistics_epoch_moves_the_marker
asyncpg.exceptions.InsufficientPrivilegeError: permission denied for function pg_stat_reset_shared

ERROR at teardown of test_a_change_to_any_excluded_table_leaves_the_marker
ERROR at teardown of test_a_damaged_newest_copy_is_replaced_inside_the_interval[object-short-runtime-clock-ahead]
ERROR at teardown of test_completing_a_backup_waits_for_the_scope_lock_of_an_enqueue
DROP DATABASE ... WITH (FORCE)
asyncpg.exceptions.InsufficientPrivilegeError: permission denied to terminate process
DETAIL: Only roles with privileges of the role whose process is being terminated or with privileges of the "pg_signal_backend" role may terminate this process.

There were no skips. Account-source and tracking-compatibility tests reported no failures. The three teardown errors can leave test databases behind; no other role was impersonated and no backend termination was attempted manually. The frozen task v2 was reread after this obstruction and K3 was kept unchanged.

Unaffected suites were checked separately after that failure:

PYTHONPATH=src python -m pytest tests/test_account_instruction_sources.py tests/test_tracking_sources_compat.py -q
exit: 0
50 passed in 32.64s

This narrower passing run does not replace the frozen K3 method.

criterion_id: K3 outcome: fail evidence_path: docs/agent-work/02793b0f-evidence.md feedback: Full named suite exit 1; 131 passed, 3 failed, 3 teardown errors. PostgreSQL denies statistics resets and backend termination; K3 is not established.

what: K3 cannot pass with the supplied test role: pg_stat_reset, pg_stat_reset_shared and DROP DATABASE WITH (FORCE) encounter InsufficientPrivilegeError. who_moves: coordinator, then Bridge environment operator needed: re-dispatch with a prepared test PostgreSQL role supporting the existing suite's statistics-reset and fixture-cleanup operations; no worker privilege changes or installations.

Next step: rerun the exact K3 pytest command in that prepared test environment, with PYTHONPATH=src and the test database variables supplied. Review test database cleanup for the failed teardowns. Do not change the frozen criteria.

K4: scope and history

Frozen method: git diff --name-only e825a428a1350497fb59fea5dfa32d01fdf5195d..HEAD and git merge-base --is-ancestor e825a428a1350497fb59fea5dfa32d01fdf5195d HEAD -> only allowed paths, ancestor true.

Intended paths, checked against the frozen allowlist:

docs/agent-work/02793b0f-evidence.md
src/heyaira/admin.py
tests/test_account_instruction_sources.py

git diff --check returned exit 0. The precommit source diff for runtime and tests was 2 files, 83 insertions; the added evidence is the third allowed path. The starting HEAD equals the frozen source and its ancestry check returned exit 0. Only intended paths are staged; the new normal local commit adds above the starting HEAD. The RESULT receipt records the final SHA, parent, final source-to-HEAD path output, ancestry exit code and postcommit worktree status.

criterion_id: K4 outcome: pass evidence_path: docs/agent-work/02793b0f-evidence.md feedback: Three intended paths are allowed; diff --check exit 0. Final committed scope, ancestry and clean worktree are checked after commit and recorded in RESULT.

Verification follow-up: second worker execution

Execution: c655e490-3821-4d9d-859e-a375eb22aaed, as returned by server_identity for this resumed assignment. Task v2 was reread through MCP; the resource, instance and project match the frozen profile. Starting HEAD: d765295bdf0ada2a4eb98788e4871fff81e9e391, the carried candidate. Its parent is the frozen source e825a428a1350497fb59fea5dfa32d01fdf5195d; the assigned branch and origin still match and the starting worktree was clean.

The verifier requested another K3 check after reporting 131 passed, 3 failed and 1 teardown error. This is the verifier's earlier run, distinct from the first worker's 3 teardown errors recorded above. The reviewed failure is an environment capability blocker; no further runtime or test change is needed. This follow-up changes only this evidence file and adds a new local commit above the candidate without rewriting it.

Supplied environment capabilities

The supplied admin test URL is present; the backup fixture URL and PYTHONPATH are unset. The required pytest command is run with PYTHONPATH=src and the backup fixture URL set to the supplied admin test connection, as before. The command and connection are local test operations; no production database or external credential is used.

A read-only query through asyncpg checked the supplied role's EXECUTE privilege on pg_catalog.pg_stat_reset() and pg_catalog.pg_stat_reset_shared(text), plus membership in pg_signal_backend. It was run with PYTHONPATH=src python -c <read-only capability probe> and exited 0, returning:

{'reset_allowed': False, 'shared_reset_allowed': False, 'signal_backend_member': False}

The first attempt to run this optional probe with a shell here-document exited 1 before Python ran: zsh: can't create temp file for here document: operation not permitted. The python -c rerun needed no temporary shell file and used the same read-only query. No privileges were granted, role identity changed or denied operation bypassed.

Repeated K1 and K2 checks on the carried candidate

Working directory and Python/TMPDIR are the same as above. No repository files were changed before these runs.

PYTHONPATH=src python -m pytest tests/test_account_instruction_sources.py -k test_t1 -q --tb=short
exit: 0
11 passed, 36 deselected in 9.10s

PYTHONPATH=src python -m pytest tests/test_account_instruction_sources.py -k 'test_t2 or test_t3' -q --tb=short
exit: 0
5 passed, 42 deselected in 5.31s

criterion_id: K1 outcome: pass evidence_path: tests/test_account_instruction_sources.py feedback: Repeated T1 exit 0; 11 passed on real PostgreSQL. Assertions still require unchanged full rows, no pool opens and nonzero flag-specific rejection. The original red run and overwrite cause remain recorded above.

criterion_id: K2 outcome: pass evidence_path: tests/test_account_instruction_sources.py feedback: Repeated T2/T3 exit 0; 5 passed. Duplicate sources fail before any Git file/head access and the stored historical contract validates.

Repeated K3: blocker remains

The following is the frozen command, with the environment configuration described above. It ran against the carried candidate's unchanged code and tests; the evidence file was appended during the run.

python -m pytest tests/test_account_instruction_sources.py tests/test_backup_state_marker.py tests/test_tracking_sources_compat.py -q
exit: 1
3 failed, 131 passed, 3 errors in 63.56s (0:01:03)

No test was skipped and imports succeeded. The observed failures and errors in this execution were:

FAILED test_a_statistics_reset_never_repeats_an_earlier_marker
FAILED test_the_marker_does_not_depend_on_the_session_time_zone
asyncpg.exceptions.InsufficientPrivilegeError: permission denied for function pg_stat_reset

FAILED test_a_discarded_statistics_epoch_moves_the_marker
asyncpg.exceptions.InsufficientPrivilegeError: permission denied for function pg_stat_reset_shared

ERROR at teardown of test_backup_fresh_needs_the_covering_object_in_r2[copy-gone-No backup with its encrypted object exists in R2]
ERROR at teardown of test_a_damaged_newest_copy_is_replaced_inside_the_interval[object-short-same-clock]
ERROR at teardown of test_retention_racing_the_heartbeat_neither_stalls_nor_supersedes_backups[unmark]
DROP DATABASE ... WITH (FORCE)
asyncpg.exceptions.InsufficientPrivilegeError: permission denied to terminate process
DETAIL: Only roles with privileges of the role whose process is being terminated or with privileges of the "pg_signal_backend" role may terminate this process.

criterion_id: K3 outcome: fail evidence_path: docs/agent-work/02793b0f-evidence.md feedback: Repeated full named suite exit 1; 131 passed, 3 failed, 3 teardown errors, no skips. Read-only capability checks also show both reset permissions and pg_signal_backend membership absent. The required environment capabilities have not been supplied.

what: K3 cannot pass in the current supplied test environment: pg_stat_reset, pg_stat_reset_shared and DROP DATABASE WITH (FORCE) still produce InsufficientPrivilegeError. who_moves: coordinator, then Bridge environment operator needed: prepare the test-role EXECUTE capabilities for the two statistics-reset functions and fixture cleanup able to terminate the remaining test-database connections, then re-dispatch. The worker must not grant privileges, impersonate another role or weaken the tests.

First executable check after those capabilities are prepared: rerun the exact K3 pytest command above with PYTHONPATH=src and the test database variables configured. The environment operator should also review the databases retained by unsuccessful fixture teardown. No additional task implementation defect was found or claimed fixed during this follow-up.

Repeated K4: scope and candidate preservation

On the carried candidate, both frozen Git methods were executed:

git diff --name-only e825a428a1350497fb59fea5dfa32d01fdf5195d..HEAD
exit: 0
docs/agent-work/02793b0f-evidence.md
src/heyaira/admin.py
tests/test_account_instruction_sources.py

git merge-base --is-ancestor e825a428a1350497fb59fea5dfa32d01fdf5195d HEAD
exit: 0

git merge-base --is-ancestor d765295bdf0ada2a4eb98788e4871fff81e9e391 HEAD
exit: 0

git diff --check
exit: 0

The final RESULT receipt repeats the frozen methods after the new evidence commit and records its SHA, direct parent and clean worktree. This follow-up stages only docs/agent-work/02793b0f-evidence.md; runtime and test files remain identical to the carried candidate.

criterion_id: K4 outcome: pass evidence_path: docs/agent-work/02793b0f-evidence.md feedback: Frozen source ancestry and carried candidate ancestry exit 0; source-to-HEAD diff lists the same three allowed files. This follow-up adds only evidence above the preserved candidate; final postcommit checks are recorded in RESULT.