Antigravity active MCP config missing Gitea role servers #672

Open
opened 2026-07-10 17:00:30 -05:00 by jcwalker3 · 6 comments
Owner

Problem

The active IDE MCP config at ~/.gemini/antigravity-ide/mcp_config.json did not contain the same Gitea role server definitions as the offline/global config at ~/.gemini/config/mcp_config.json. As a result, connection checks against the offline/global config could pass while the IDE returned EOF/transport closed for missing role namespaces.

Observed behavior

  • test_mcp_conn.py succeeded against the offline/global config.
  • The IDE MCP client used ~/.gemini/antigravity-ide/mcp_config.json.
  • Required role servers such as gitea-author and/or gitea-reviewer were missing from the active IDE config.
  • This caused confusing transport-closed failures and made the workflow appear stale or disconnected.

Impact

  • False confidence: offline config green while IDE cannot call role tools.
  • Misdiagnosis as stale-runtime / transport failure / need for pkill or mtime tricks (#630, #655).
  • Role-namespace workflows (author create_issue, reviewer review_pr) fail closed or appear unavailable.
  • Final reports that cite only test_mcp_conn.py prove the wrong surface.

Required fix

  • Keep the active IDE MCP config and canonical/global Gitea MCP config in sync for Gitea role servers (gitea-author, gitea-reviewer, gitea-merger, gitea-reconciler, gitea-tools as applicable).
  • Add a diagnostic tool or check that reports config drift between the two paths.
  • Do not rely on offline config tests as proof that IDE-managed namespaces exist.
  • Document the sanctioned repair path:
    1. backup active IDE config;
    2. patch active IDE config to match required Gitea role servers from canonical/global;
    3. reconnect through IDE/client (not process kill);
    4. verify with live gitea_whoami (and optional gitea_resolve_task_capability) on each required role namespace.

Scope

  1. Inventory expected Gitea role server names and required fields for Antigravity IDE vs global config.
  2. Diagnostic: present/missing role servers in active IDE config; profile mismatches; path provenance (which file was tested).
  3. Distinguish offline/global success from active IDE namespace availability in tool output and docs.
  4. Tests or docs for missing gitea-author, missing gitea-reviewer, mismatched profiles.
  5. Workflow final-report guidance: require active-config proof (whoami via IDE namespaces), not only offline test_mcp_conn.py.
  6. Optionally extend mcp_namespace_health.py / test_mcp_conn.py to accept and compare both paths.

Explicit non-goals

  • Do not require pkill, mtime edits, source edits, or session-state edits for repair (#630 / #655).
  • Do not auto-overwrite user IDE config without backup and explicit operator path.
  • Do not treat full MCP restart as the primary fix for missing server entries.
  • Do not expand into non-Gitea MCP servers unless needed for the drift check framework.

Required implementation investigation

  • test_mcp_conn.py (defaults to ~/.gemini/config/mcp_config.json)
  • mcp_namespace_health.py, docs/mcp-namespace-health.md
  • README Antigravity section (~/.gemini/antigravity-ide/mcp_config.json)
  • gitea_mcp_server.py auto-restart / config touch paths (must not become repair path for drift)
  • Related: #584 transport closed, #610 stale-runtime, #655 restart governance (scoped recovery first)

Proposed implementation direction

  • mcp_config_drift.py or extend namespace health: compare active IDE path vs canonical path; emit structured present/missing/mismatched report.
  • CLI + optional MCP read tool for diagnostics.
  • Docs: sanctioned sync/repair runbook; final-report schema note for active-config proof.

Security requirements

  • Diagnostics must not print token values or secret-bearing env contents.
  • Backup files must not be committed to git.
  • Redact server command args that embed secrets.

Workflow-safety requirements

  • Fail closed when required role server is missing from active IDE config: report config-drift, not generic stale-runtime, when that is the evidence.
  • Repair path is config patch + IDE reconnect + whoami — never host process kill.

Acceptance criteria

  1. Diagnostic reports which Gitea role servers are present/missing in active IDE config.
  2. Diagnostic distinguishes offline/global config success from active IDE namespace availability.
  3. Repair path does not require pkill, mtime edits, source edits, or session-state edits.
  4. Tests or docs cover missing gitea-author, missing gitea-reviewer, and mismatched profiles.
  5. Final workflow reports include active-config proof, not only offline config proof.

Required tests

  • Unit tests for drift detection with fixture configs (missing author, missing reviewer, profile mismatch, in-sync).
  • Doc or checklist test that repair path forbids pkill/mtime/source/session edits.

Observability and audit requirements

  • Diagnostic output includes both config paths and timestamp.
  • Optional: recommend linking failed sessions to this issue class in final reports.

Dependencies and linkage

  • Related: #584 (transport closed symptoms), #610 (stale-runtime misdiagnosis risk), #630 (forbidden pkill recovery), #655/#669 (scoped recovery preferred over full reset)
  • Complements: mcp_namespace_health live tool callability checks

Canonical issue state

STATE: ready-for-author
WHO_IS_NEXT: author
NEXT_ACTION: Implement config-drift diagnostic + docs/tests + report-proof guidance
NEXT_PROMPT: Author implements this issue under branches/ worktree; PR; stop; no pkill-based recovery in docs

Required final evidence

PR with diagnostic, tests/docs AC coverage, sample drift report for missing role servers.

Required final response and handoff

Brief PR → reviewer; include active IDE whoami proof when validating fix.

## Problem The active IDE MCP config at `~/.gemini/antigravity-ide/mcp_config.json` did not contain the same Gitea role server definitions as the offline/global config at `~/.gemini/config/mcp_config.json`. As a result, connection checks against the offline/global config could pass while the IDE returned EOF/transport closed for missing role namespaces. ## Observed behavior * `test_mcp_conn.py` succeeded against the offline/global config. * The IDE MCP client used `~/.gemini/antigravity-ide/mcp_config.json`. * Required role servers such as `gitea-author` and/or `gitea-reviewer` were missing from the active IDE config. * This caused confusing transport-closed failures and made the workflow appear stale or disconnected. ## Impact * False confidence: offline config green while IDE cannot call role tools. * Misdiagnosis as stale-runtime / transport failure / need for `pkill` or mtime tricks (#630, #655). * Role-namespace workflows (author create_issue, reviewer review_pr) fail closed or appear unavailable. * Final reports that cite only `test_mcp_conn.py` prove the wrong surface. ## Required fix * Keep the active IDE MCP config and canonical/global Gitea MCP config **in sync** for Gitea role servers (`gitea-author`, `gitea-reviewer`, `gitea-merger`, `gitea-reconciler`, `gitea-tools` as applicable). * Add a **diagnostic tool or check** that reports config drift between the two paths. * Do **not** rely on offline config tests as proof that IDE-managed namespaces exist. * Document the **sanctioned repair path**: 1. backup active IDE config; 2. patch active IDE config to match required Gitea role servers from canonical/global; 3. reconnect through IDE/client (not process kill); 4. verify with live `gitea_whoami` (and optional `gitea_resolve_task_capability`) on each required role namespace. ## Scope 1. Inventory expected Gitea role server names and required fields for Antigravity IDE vs global config. 2. Diagnostic: present/missing role servers in active IDE config; profile mismatches; path provenance (which file was tested). 3. Distinguish offline/global success from active IDE namespace availability in tool output and docs. 4. Tests or docs for missing `gitea-author`, missing `gitea-reviewer`, mismatched profiles. 5. Workflow final-report guidance: require active-config proof (`whoami` via IDE namespaces), not only offline `test_mcp_conn.py`. 6. Optionally extend `mcp_namespace_health.py` / `test_mcp_conn.py` to accept and compare both paths. ## Explicit non-goals * Do not require `pkill`, mtime edits, source edits, or session-state edits for repair (#630 / #655). * Do not auto-overwrite user IDE config without backup and explicit operator path. * Do not treat full MCP restart as the primary fix for missing server entries. * Do not expand into non-Gitea MCP servers unless needed for the drift check framework. ## Required implementation investigation * `test_mcp_conn.py` (defaults to `~/.gemini/config/mcp_config.json`) * `mcp_namespace_health.py`, `docs/mcp-namespace-health.md` * README Antigravity section (`~/.gemini/antigravity-ide/mcp_config.json`) * `gitea_mcp_server.py` auto-restart / config touch paths (must not become repair path for drift) * Related: #584 transport closed, #610 stale-runtime, #655 restart governance (scoped recovery first) ## Proposed implementation direction * `mcp_config_drift.py` or extend namespace health: compare active IDE path vs canonical path; emit structured present/missing/mismatched report. * CLI + optional MCP read tool for diagnostics. * Docs: sanctioned sync/repair runbook; final-report schema note for active-config proof. ## Security requirements * Diagnostics must not print token values or secret-bearing env contents. * Backup files must not be committed to git. * Redact server command args that embed secrets. ## Workflow-safety requirements * Fail closed when required role server is missing from active IDE config: report config-drift, not generic stale-runtime, when that is the evidence. * Repair path is config patch + IDE reconnect + whoami — never host process kill. ## Acceptance criteria 1. Diagnostic reports which Gitea role servers are present/missing in active IDE config. 2. Diagnostic distinguishes offline/global config success from active IDE namespace availability. 3. Repair path does not require `pkill`, mtime edits, source edits, or session-state edits. 4. Tests or docs cover missing `gitea-author`, missing `gitea-reviewer`, and mismatched profiles. 5. Final workflow reports include active-config proof, not only offline config proof. ## Required tests * Unit tests for drift detection with fixture configs (missing author, missing reviewer, profile mismatch, in-sync). * Doc or checklist test that repair path forbids pkill/mtime/source/session edits. ## Observability and audit requirements * Diagnostic output includes both config paths and timestamp. * Optional: recommend linking failed sessions to this issue class in final reports. ## Dependencies and linkage * Related: #584 (transport closed symptoms), #610 (stale-runtime misdiagnosis risk), #630 (forbidden pkill recovery), #655/#669 (scoped recovery preferred over full reset) * Complements: `mcp_namespace_health` live tool callability checks ## Canonical issue state ```text STATE: ready-for-author WHO_IS_NEXT: author NEXT_ACTION: Implement config-drift diagnostic + docs/tests + report-proof guidance NEXT_PROMPT: Author implements this issue under branches/ worktree; PR; stop; no pkill-based recovery in docs ``` ## Required final evidence PR with diagnostic, tests/docs AC coverage, sample drift report for missing role servers. ## Required final response and handoff Brief PR → reviewer; include active IDE whoami proof when validating fix.
Author
Owner

Canonical Issue State

STATE:
ready-for-author

WHO_IS_NEXT:
author

NEXT_ACTION:
Implement diagnostic + docs/tests per AC; incorporate operator repair evidence below; do not create a duplicate issue

NEXT_PROMPT:

AUTHOR session for Scaled-Tech-Consulting/Gitea-Tools on remote prgs.
Implement Issue #672 (Antigravity IDE MCP config missing Gitea role servers).

Identity: gitea_whoami + resolve_task_capability; work under branches/ worktree only.
Scope from issue body plus this comment:
- Diagnostic compares active client MCP config (e.g. ~/.gemini/antigravity-ide/mcp_config.json) against expected Gitea role servers, not only offline/global ~/.gemini/config/mcp_config.json.
- Report present/missing gitea-author, gitea-reviewer (and other roles as applicable) per client config path.
- Docs: each client may have its own active MCP config; offline test_mcp_conn success is not IDE availability proof.
- Sanctioned repair: backup → patch active config → client reconnect → whoami on each role. Forbid pkill/kill/touch/mtime/source/session-state edits.
- Tests/docs: missing author, missing reviewer, mixed keychain vs profile-pinned entries.
- Final reports must include active-config whoami proof.

Operator repair already performed (evidence only; still implement durable diagnostic):
- Backup: mcp_config.json.bak-gitea-repair (under antigravity-ide path)
- Added gitea-author GITEA_MCP_PROFILE=prgs-author
- Added gitea-reviewer GITEA_MCP_PROFILE=prgs-reviewer
- Left gitea-tools keychain-style entry unchanged
- No process kill or mtime/source edits

Open PR linking #672; stop for review; no self-merge.

WHAT_HAPPENED:
Duplicate-intake request matched existing #672 (same title/scope). Updated with refined evidence: active Antigravity config had only gitea-tools; gitea-author and gitea-reviewer absent while Claude Code / offline configs had working profile-pinned servers. Recorded completed operator repair path for documentation and test fixtures. No new issue created.

WHY:
Avoid duplicate; keep single durable owner for Antigravity IDE vs canonical config drift.

RELATED_ISSUES:
#584 #610 #630 #655 #669 (related symptoms/forbidden recovery; different primary ownership)

RELATED_PRS:
none this session

BLOCKERS:
none for tracking; author implementation still required for diagnostic automation

VALIDATION:
Exact-scope owner is #672; title already matches; AC in body covers diagnostic/repair; this comment adds operator repair evidence and mixed keychain/profile-pinned AC emphasis

LAST_UPDATED_BY:
jcwalker3 / prgs-author / author / 2026-07-11

## Canonical Issue State STATE: ready-for-author WHO_IS_NEXT: author NEXT_ACTION: Implement diagnostic + docs/tests per AC; incorporate operator repair evidence below; do not create a duplicate issue NEXT_PROMPT: ```text AUTHOR session for Scaled-Tech-Consulting/Gitea-Tools on remote prgs. Implement Issue #672 (Antigravity IDE MCP config missing Gitea role servers). Identity: gitea_whoami + resolve_task_capability; work under branches/ worktree only. Scope from issue body plus this comment: - Diagnostic compares active client MCP config (e.g. ~/.gemini/antigravity-ide/mcp_config.json) against expected Gitea role servers, not only offline/global ~/.gemini/config/mcp_config.json. - Report present/missing gitea-author, gitea-reviewer (and other roles as applicable) per client config path. - Docs: each client may have its own active MCP config; offline test_mcp_conn success is not IDE availability proof. - Sanctioned repair: backup → patch active config → client reconnect → whoami on each role. Forbid pkill/kill/touch/mtime/source/session-state edits. - Tests/docs: missing author, missing reviewer, mixed keychain vs profile-pinned entries. - Final reports must include active-config whoami proof. Operator repair already performed (evidence only; still implement durable diagnostic): - Backup: mcp_config.json.bak-gitea-repair (under antigravity-ide path) - Added gitea-author GITEA_MCP_PROFILE=prgs-author - Added gitea-reviewer GITEA_MCP_PROFILE=prgs-reviewer - Left gitea-tools keychain-style entry unchanged - No process kill or mtime/source edits Open PR linking #672; stop for review; no self-merge. ``` WHAT_HAPPENED: Duplicate-intake request matched existing #672 (same title/scope). Updated with refined evidence: active Antigravity config had only `gitea-tools`; `gitea-author` and `gitea-reviewer` absent while Claude Code / offline configs had working profile-pinned servers. Recorded completed operator repair path for documentation and test fixtures. No new issue created. WHY: Avoid duplicate; keep single durable owner for Antigravity IDE vs canonical config drift. RELATED_ISSUES: #584 #610 #630 #655 #669 (related symptoms/forbidden recovery; different primary ownership) RELATED_PRS: none this session BLOCKERS: none for tracking; author implementation still required for diagnostic automation VALIDATION: Exact-scope owner is #672; title already matches; AC in body covers diagnostic/repair; this comment adds operator repair evidence and mixed keychain/profile-pinned AC emphasis LAST_UPDATED_BY: jcwalker3 / prgs-author / author / 2026-07-11
Owner

Canonical Issue State

STATE: open — config-touch evidence recorded during PR #680 recovery
WHO_IS_NEXT: author
NEXT_ACTION: ship active-vs-canonical Antigravity drift diagnostic; repair path = backup + patch + IDE reconnect + whoami (no pkill)
NEXT_PROMPT:

Author: implement #672 drift diagnostic. Fixture: backup missing gitea-author/reviewer vs active with those servers added. Prove offline green ≠ IDE namespace proof. Forbid auto-overwrite without operator path.

WHAT_HAPPENED: Read-only compare of antigravity-ide/mcp_config.json vs mcp_config.json.bak-gitea-repair during #680 reviewer recovery. Active config ADDED gitea-author and gitea-reviewer role servers (mcp_server.py + prgs-author/prgs-reviewer profiles). Change likely mid-recovery after EOF; this session did not revert or normalize the config. Live gitea-reviewer now healthy via client tools.
WHY: Config drift and mid-session edits without durable ownership confuse transport EOF vs missing-server diagnosis.
RELATED_PRS: #680; #584
BLOCKERS: no automated drift report on IDE path yet
VALIDATION: structural diff only (no secret values printed); backup present; gitea-tools unchanged; client_namespace health for gitea-reviewer healthy this session
LAST_UPDATED_BY: sysadmin (prgs-reviewer)

## Canonical Issue State STATE: open — config-touch evidence recorded during PR #680 recovery WHO_IS_NEXT: author NEXT_ACTION: ship active-vs-canonical Antigravity drift diagnostic; repair path = backup + patch + IDE reconnect + whoami (no pkill) NEXT_PROMPT: ```text Author: implement #672 drift diagnostic. Fixture: backup missing gitea-author/reviewer vs active with those servers added. Prove offline green ≠ IDE namespace proof. Forbid auto-overwrite without operator path. ``` WHAT_HAPPENED: Read-only compare of antigravity-ide/mcp_config.json vs mcp_config.json.bak-gitea-repair during #680 reviewer recovery. Active config ADDED gitea-author and gitea-reviewer role servers (mcp_server.py + prgs-author/prgs-reviewer profiles). Change likely mid-recovery after EOF; this session did not revert or normalize the config. Live gitea-reviewer now healthy via client tools. WHY: Config drift and mid-session edits without durable ownership confuse transport EOF vs missing-server diagnosis. RELATED_PRS: #680; #584 BLOCKERS: no automated drift report on IDE path yet VALIDATION: structural diff only (no secret values printed); backup present; gitea-tools unchanged; client_namespace health for gitea-reviewer healthy this session LAST_UPDATED_BY: sysadmin (prgs-reviewer)
Author
Owner

Canonical Issue State

STATE: open — additional config-provenance findings from PR #680 control-plane recovery (read-only)
WHO_IS_NEXT: author
NEXT_ACTION: extend the drift diagnostic to also require a gitea-merger role server and to flag unsupported env values; document a supported repair command for a missing merger namespace
NEXT_PROMPT:

Author: extend #672 drift diagnostic to cover:
- gitea-merger (profile prgs-merger) as a REQUIRED role server, not only gitea-author/gitea-reviewer. Report missing merger explicitly.
- Detect and flag unsupported env markers in role entries (e.g. GITEA_DUMMY) that are not part of the supported installer.
- Emit the sanctioned repair COMMAND for a missing role namespace: backup active config -> add role server (command = venv/bin/python3 mcp_server.py; env GITEA_MCP_CONFIG=~/.config/gitea-tools/profiles.json, GITEA_MCP_PROFILE=<role>) -> client reconnect -> live whoami. No host process kill; no manual gitea_mcp_server.py direct launch (see #584).
Fixture: active config with gitea-author + gitea-reviewer present but gitea-merger absent, plus a GITEA_DUMMY=1 marker.

WHAT_HAPPENED:
Read-only compare of active ~/.gemini/antigravity-ide/mcp_config.json (mtime 2026-07-12 09:07) vs its backup mcp_config.json.bak-gitea-repair (2026-07-10 11:47), during PR #680 control-plane recovery.

  • gitea-author (prgs-author) and gitea-reviewer (prgs-reviewer) are present in the active config, absent in the backup — confirms they were hand-added after the Jul 10 backup (consistent with comment 10511).
  • gitea-merger is absent from BOTH the active config and the backup — it was never installed in the Antigravity client. Its absence is not a regression from the backup; it is a missing installation.
  • Both role entries carry GITEA_DUMMY: "1", an unsupported marker value not present in the supported keychain-style gitea-tools entry.
  • The active gitea-tools keychain entry is unchanged from the backup. No secret values were printed; structural diff only.
  • The supported install baseline (backup) had NO role servers at all — only gitea-tools + jenkins + glitchtip.
    WHY: Missing gitea-merger means PR #680 cannot enter a supported merger workflow through the Antigravity client, and manual/unsupported env edits (GITEA_DUMMY) blur what the sanctioned installer actually provisions.
    RELATED_PRS: #680 (blocked from supported merger workflow through Antigravity client)
    BLOCKERS: gitea-merger role server never installed in the Antigravity client config; unsupported GITEA_DUMMY marker on author/reviewer entries; no automated drift report on the IDE path yet
    VALIDATION: structural diff only (no secret values printed); backup present; gitea-tools unchanged; a supported merger entry was NOT added by this session (not authorized without installer confirmation). Related: #584 (manual direct-launch violation) #543 #630.
    LAST_UPDATED_BY: jcwalker3 / prgs-author / control-plane-recovery / 2026-07-12
## Canonical Issue State STATE: open — additional config-provenance findings from PR #680 control-plane recovery (read-only) WHO_IS_NEXT: author NEXT_ACTION: extend the drift diagnostic to also require a `gitea-merger` role server and to flag unsupported env values; document a supported repair command for a missing merger namespace NEXT_PROMPT: ```text Author: extend #672 drift diagnostic to cover: - gitea-merger (profile prgs-merger) as a REQUIRED role server, not only gitea-author/gitea-reviewer. Report missing merger explicitly. - Detect and flag unsupported env markers in role entries (e.g. GITEA_DUMMY) that are not part of the supported installer. - Emit the sanctioned repair COMMAND for a missing role namespace: backup active config -> add role server (command = venv/bin/python3 mcp_server.py; env GITEA_MCP_CONFIG=~/.config/gitea-tools/profiles.json, GITEA_MCP_PROFILE=<role>) -> client reconnect -> live whoami. No host process kill; no manual gitea_mcp_server.py direct launch (see #584). Fixture: active config with gitea-author + gitea-reviewer present but gitea-merger absent, plus a GITEA_DUMMY=1 marker. ``` WHAT_HAPPENED: Read-only compare of active `~/.gemini/antigravity-ide/mcp_config.json` (mtime 2026-07-12 09:07) vs its backup `mcp_config.json.bak-gitea-repair` (2026-07-10 11:47), during PR #680 control-plane recovery. - `gitea-author` (prgs-author) and `gitea-reviewer` (prgs-reviewer) are present in the active config, absent in the backup — confirms they were hand-added after the Jul 10 backup (consistent with comment 10511). - `gitea-merger` is absent from BOTH the active config and the backup — it was **never installed** in the Antigravity client. Its absence is not a regression from the backup; it is a missing installation. - Both role entries carry `GITEA_DUMMY: "1"`, an unsupported marker value not present in the supported keychain-style `gitea-tools` entry. - The active `gitea-tools` keychain entry is unchanged from the backup. No secret values were printed; structural diff only. - The supported install baseline (backup) had NO role servers at all — only `gitea-tools` + jenkins + glitchtip. WHY: Missing `gitea-merger` means PR #680 cannot enter a supported merger workflow through the Antigravity client, and manual/unsupported env edits (GITEA_DUMMY) blur what the sanctioned installer actually provisions. RELATED_PRS: #680 (blocked from supported merger workflow through Antigravity client) BLOCKERS: `gitea-merger` role server never installed in the Antigravity client config; unsupported `GITEA_DUMMY` marker on author/reviewer entries; no automated drift report on the IDE path yet VALIDATION: structural diff only (no secret values printed); backup present; `gitea-tools` unchanged; a supported merger entry was NOT added by this session (not authorized without installer confirmation). Related: #584 (manual direct-launch violation) #543 #630. LAST_UPDATED_BY: jcwalker3 / prgs-author / control-plane-recovery / 2026-07-12
Author
Owner

[THREAD STATE LEDGER] Issue #672 — incident update: unsupported manual role-server launch recorded; resolver config-touch defect now owned by #685, duplicate-launch guardrail by #686

What is true now:

  • Server-side decision state: no server-side review/merge state changed by this capture; #685 and #686 now exist and this comment is the durable violation record for the #672/#584 incident cluster
  • Local verdict/state: a manual GITEA_DUMMY=2 role-server launch is classified as an unsupported recovery attempt; its process no longer appears in the live process inventory
  • Latest known validation: client-managed prgs-author and prgs-reviewer namespaces answer gitea_whoami + gitea_get_runtime_context cleanly; master parity in parity at 22698c1; restart_required=false

What changed:

  • Manual-launch violation record captured (details below)
  • #685 filed: gitea_resolve_task_capability's stale-runtime path touches mcp_config.json (os.utime at gitea_mcp_server.py:10901) and self-terminates via os._exit(0) (:10909) — this is exactly the "auto-restart / config touch" path this issue's investigation section says must not become a repair path, now with a dedicated contract-fix owner
  • #686 filed: detection and fail-closed rejection of manually launched duplicate role servers
  • Fresh config-touch fingerprints observed today: ~/.gemini/antigravity-ide/mcp_config.json mtime 19:08:29 and ~/.gemini/config/mcp_config.json mtime 19:14:29 (2026-07-12 local) — mtime-based drift/staleness reasoning stays unreliable until #685 lands

What is blocked:

  • Blocker classification: no blocker
  • Nothing on this issue is fail-closed at this time; #672 scope (config-drift diagnostic) remains open for an author, and #685/#686 own the resolver contract and duplicate-launch guardrail respectively

Who/what acts next:

  • Next actor: author
  • Required action: implement #685 and #686; #672's own drift-diagnostic scope stays as previously defined in the issue body
  • Do not do: do not launch mcp_server.py or gitea_mcp_server.py manually; do not use GITEA_DUMMY or other ad hoc environment overrides; do not edit or touch mcp_config.json by hand; do not kill or restart MCP processes directly; recovery is the IDE/client reconnect path only

Manual-launch violation record (2026-07-12)

  • Exact command used: GITEA_MCP_CONFIG=/Users/jasonwalker/.config/gitea-tools/profiles.json GITEA_MCP_PROFILE=prgs-reviewer GITEA_DUMMY=2 venv/bin/python3 mcp_server.py
  • Environment variables supplied: GITEA_MCP_CONFIG (profiles path), GITEA_MCP_PROFILE=prgs-reviewer, GITEA_DUMMY=2
  • Is GITEA_DUMMY=2 supported: NO — zero references anywhere in the codebase (grep over *.py at 22698c1); the server silently ignores it
  • PID and lifetime: unknown — a read-only scan of every live mcp_server.py process (~56 across hourly cohorts, ~19:15 local) found none carrying GITEA_DUMMY; the manual process had already terminated before capture
  • Bound to the IDE transport: NO — a terminal launch owns its own stdio; it can never bind to the IDE client's pipes, so it cannot repair the missing-role-server condition this issue documents
  • Accepted as namespace recovery: NO — the namespaces answering now are the IDE/client-managed process quads (started 19:06:30 and 19:07:40 local), verified individually via gitea_whoami + gitea_get_runtime_context
  • Current EOF state: none — all role namespaces answer
  • Impact on PR #684: recording of the formal APPROVE verdict was delayed, not lost; review evidence (PR #684 comment 10606 at head d302602) remains applicable, and verdict recording proceeds through the supported client-managed reviewer namespace

Canonical Issue State

STATE:
incident-updated — violation recorded; resolver contract owned by #685; duplicate-launch guardrail owned by #686; #672 drift-diagnostic scope unchanged

WHO_IS_NEXT:
author

NEXT_ACTION:
Implement #685 (resolver side-effect removal) and #686 (duplicate-launch detection/rejection); #672 remains available for the config-drift diagnostic scope in its body

NEXT_PROMPT:

Role: AUTHOR
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Work #685 first (resolver contract), then #686 (duplicate-launch guardrail); #672 drift diagnostic can proceed independently per its body.
For each: gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind a branches/ worktree; implement per issue ACs; open PR; stop; hand off to independent reviewer.
Never: manual mcp_server.py launches, GITEA_DUMMY-style overrides, mcp_config.json hand-edits, direct process kills/restarts.

WHAT_HAPPENED:
During the incident cluster this issue tracks, a diagnostic run manually launched a duplicate prgs-reviewer role server with the unsupported GITEA_DUMMY=2 override. It could not and did not restore any IDE namespace, and the process later exited. Root cause of the transport EOF is the #685 resolver defect (config touch + delayed os._exit(0) inside gitea_resolve_task_capability's stale-runtime path, gitea_mcp_server.py:10888-10910/:10994 at 22698c1) — the same auto-restart path this issue's investigation section flags.

WHY:
Manual duplicate role servers are unsupported recovery: no IDE transport binding, per-profile staleness masking (newest-process-wins at gitea_mcp_server.py:10986), and unaudited access to shared session/lease/lock state. The resolver's config touches also corrupt mtime-based drift evidence relevant to this issue's diagnostic scope.

RELATED_PRS:
PR #684 — formal verdict recording delayed by this incident; independent review evidence in PR #684 comment 10606 at head d302602

BLOCKERS:
none for this record; any remediation blockers belong on #685/#686

VALIDATION:

  • Live process inventory scanned read-only; no GITEA_DUMMY-bearing process remains
  • Client-managed namespaces verified healthy via gitea_whoami + gitea_get_runtime_context (prgs-author jcwalker3; prgs-reviewer sysadmin; parity 22698c1; restart_required=false)
  • Config mtime fingerprints captured: active IDE config 19:08:29, global config 19:14:29 (2026-07-12 local)

LAST_UPDATED_BY:
jcwalker3 / prgs-author (controller defect-capture session) / 2026-07-12

[THREAD STATE LEDGER] Issue #672 — incident update: unsupported manual role-server launch recorded; resolver config-touch defect now owned by #685, duplicate-launch guardrail by #686 What is true now: - Server-side decision state: no server-side review/merge state changed by this capture; #685 and #686 now exist and this comment is the durable violation record for the #672/#584 incident cluster - Local verdict/state: a manual GITEA_DUMMY=2 role-server launch is classified as an unsupported recovery attempt; its process no longer appears in the live process inventory - Latest known validation: client-managed prgs-author and prgs-reviewer namespaces answer gitea_whoami + gitea_get_runtime_context cleanly; master parity in parity at 22698c1; restart_required=false What changed: - Manual-launch violation record captured (details below) - #685 filed: gitea_resolve_task_capability's stale-runtime path touches mcp_config.json (os.utime at gitea_mcp_server.py:10901) and self-terminates via os._exit(0) (:10909) — this is exactly the "auto-restart / config touch" path this issue's investigation section says must not become a repair path, now with a dedicated contract-fix owner - #686 filed: detection and fail-closed rejection of manually launched duplicate role servers - Fresh config-touch fingerprints observed today: `~/.gemini/antigravity-ide/mcp_config.json` mtime 19:08:29 and `~/.gemini/config/mcp_config.json` mtime 19:14:29 (2026-07-12 local) — mtime-based drift/staleness reasoning stays unreliable until #685 lands What is blocked: - Blocker classification: no blocker - Nothing on this issue is fail-closed at this time; #672 scope (config-drift diagnostic) remains open for an author, and #685/#686 own the resolver contract and duplicate-launch guardrail respectively Who/what acts next: - Next actor: author - Required action: implement #685 and #686; #672's own drift-diagnostic scope stays as previously defined in the issue body - Do not do: do not launch mcp_server.py or gitea_mcp_server.py manually; do not use GITEA_DUMMY or other ad hoc environment overrides; do not edit or touch mcp_config.json by hand; do not kill or restart MCP processes directly; recovery is the IDE/client reconnect path only ## Manual-launch violation record (2026-07-12) - Exact command used: `GITEA_MCP_CONFIG=/Users/jasonwalker/.config/gitea-tools/profiles.json GITEA_MCP_PROFILE=prgs-reviewer GITEA_DUMMY=2 venv/bin/python3 mcp_server.py` - Environment variables supplied: `GITEA_MCP_CONFIG` (profiles path), `GITEA_MCP_PROFILE=prgs-reviewer`, `GITEA_DUMMY=2` - Is `GITEA_DUMMY=2` supported: **NO** — zero references anywhere in the codebase (grep over `*.py` at `22698c1`); the server silently ignores it - PID and lifetime: unknown — a read-only scan of every live `mcp_server.py` process (~56 across hourly cohorts, ~19:15 local) found none carrying `GITEA_DUMMY`; the manual process had already terminated before capture - Bound to the IDE transport: **NO** — a terminal launch owns its own stdio; it can never bind to the IDE client's pipes, so it cannot repair the missing-role-server condition this issue documents - Accepted as namespace recovery: **NO** — the namespaces answering now are the IDE/client-managed process quads (started 19:06:30 and 19:07:40 local), verified individually via gitea_whoami + gitea_get_runtime_context - Current EOF state: none — all role namespaces answer - Impact on PR #684: recording of the formal APPROVE verdict was delayed, not lost; review evidence (PR #684 comment 10606 at head d302602) remains applicable, and verdict recording proceeds through the supported client-managed reviewer namespace ## Canonical Issue State STATE: incident-updated — violation recorded; resolver contract owned by #685; duplicate-launch guardrail owned by #686; #672 drift-diagnostic scope unchanged WHO_IS_NEXT: author NEXT_ACTION: Implement #685 (resolver side-effect removal) and #686 (duplicate-launch detection/rejection); #672 remains available for the config-drift diagnostic scope in its body NEXT_PROMPT: ```text Role: AUTHOR Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Work #685 first (resolver contract), then #686 (duplicate-launch guardrail); #672 drift diagnostic can proceed independently per its body. For each: gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind a branches/ worktree; implement per issue ACs; open PR; stop; hand off to independent reviewer. Never: manual mcp_server.py launches, GITEA_DUMMY-style overrides, mcp_config.json hand-edits, direct process kills/restarts. ``` WHAT_HAPPENED: During the incident cluster this issue tracks, a diagnostic run manually launched a duplicate prgs-reviewer role server with the unsupported GITEA_DUMMY=2 override. It could not and did not restore any IDE namespace, and the process later exited. Root cause of the transport EOF is the #685 resolver defect (config touch + delayed os._exit(0) inside gitea_resolve_task_capability's stale-runtime path, gitea_mcp_server.py:10888-10910/:10994 at 22698c1) — the same auto-restart path this issue's investigation section flags. WHY: Manual duplicate role servers are unsupported recovery: no IDE transport binding, per-profile staleness masking (newest-process-wins at gitea_mcp_server.py:10986), and unaudited access to shared session/lease/lock state. The resolver's config touches also corrupt mtime-based drift evidence relevant to this issue's diagnostic scope. RELATED_PRS: PR #684 — formal verdict recording delayed by this incident; independent review evidence in PR #684 comment 10606 at head d302602 BLOCKERS: none for this record; any remediation blockers belong on #685/#686 VALIDATION: - Live process inventory scanned read-only; no GITEA_DUMMY-bearing process remains - Client-managed namespaces verified healthy via gitea_whoami + gitea_get_runtime_context (prgs-author jcwalker3; prgs-reviewer sysadmin; parity 22698c1; restart_required=false) - Config mtime fingerprints captured: active IDE config 19:08:29, global config 19:14:29 (2026-07-12 local) LAST_UPDATED_BY: jcwalker3 / prgs-author (controller defect-capture session) / 2026-07-12
Author
Owner

Canonical Issue State

STATE: BLOCKED — client-managed reviewer namespace unavailable; repeated unsupported manual server launch recorded; formal approval not submitted.

WHO_IS_NEXT: user

NEXT_ACTION: Operator restores IDE-managed gitea-reviewer via supported reconnect/reload only. Do not manually set GITEA_MCP_CONFIG/GITEA_MCP_PROFILE/GITEA_DUMMY or launch mcp_server.py outside the client manager.

NEXT_PROMPT:

Role: OPERATOR then REVIEWER
Restore IDE-managed gitea-reviewer namespace via client reconnect/reload only.
Do not use GITEA_DUMMY, manual profile env launches, or direct mcp_server.py.
After reconnect: fresh reviewer run for PR #684 head d302602.

WHAT_HAPPENED:
Unsupported environment/config context from recovery command log:

GITEA_MCP_CONFIG=/Users/jasonwalker/.config/gitea-tools/profiles.json GITEA_MCP_PROFILE=prgs-reviewer GITEA_DUMMY=2 venv/bin/python3 mcp_server.py
Item Observation
GITEA_MCP_CONFIG User profiles.json path used outside client manager
GITEA_MCP_PROFILE prgs-reviewer selected via env for a manual role-server process
GITEA_DUMMY=2 Unsupported env var; silently ignorable / not fail-closed at launch
Launch path Direct venv/bin/python3 mcp_server.py — not IDE-managed
Result Immediate gitea_whoami EOF reported by recovery

Controller did not re-launch MCP servers, edit MCP config, kill processes, restore session state, or call internal modules. Formal approval not submitted.

WHY: Role servers and control env must be client-managed; unsupported env vars and manual profile selection create untrusted identity/capability state and reproduce EOF class failures (#584).

RELATED_PRS: PR #684 / #683; defects #584, #685, #686.

BLOCKERS: Unsupported manual env/config launch path used (GITEA_MCP_* + GITEA_DUMMY=2 + direct mcp_server.py); client-managed reviewer provenance not proven. Unblock when: operator completes IDE reconnect/reload of client-managed gitea-reviewer (no manual server launch), and a fresh reviewer session proves live prgs-reviewer/sysadmin with client-managed provenance.

VALIDATION: Incident recorded on #584 (comment_id 10650). Live PR #684 head d302602567a1fb7842fe5486fa5a49509506ec8b; no formal approval submitted this session.

LAST_UPDATED_BY: controller

## Canonical Issue State STATE: BLOCKED — client-managed reviewer namespace unavailable; repeated unsupported manual server launch recorded; formal approval not submitted. WHO_IS_NEXT: user NEXT_ACTION: Operator restores IDE-managed `gitea-reviewer` via supported reconnect/reload only. Do not manually set `GITEA_MCP_CONFIG`/`GITEA_MCP_PROFILE`/`GITEA_DUMMY` or launch `mcp_server.py` outside the client manager. NEXT_PROMPT: ```text Role: OPERATOR then REVIEWER Restore IDE-managed gitea-reviewer namespace via client reconnect/reload only. Do not use GITEA_DUMMY, manual profile env launches, or direct mcp_server.py. After reconnect: fresh reviewer run for PR #684 head d302602. ``` WHAT_HAPPENED: Unsupported environment/config context from recovery command log: ```text GITEA_MCP_CONFIG=/Users/jasonwalker/.config/gitea-tools/profiles.json GITEA_MCP_PROFILE=prgs-reviewer GITEA_DUMMY=2 venv/bin/python3 mcp_server.py ``` | Item | Observation | |------|-------------| | `GITEA_MCP_CONFIG` | User profiles.json path used outside client manager | | `GITEA_MCP_PROFILE` | `prgs-reviewer` selected via env for a **manual** role-server process | | `GITEA_DUMMY=2` | Unsupported env var; silently ignorable / not fail-closed at launch | | Launch path | Direct `venv/bin/python3 mcp_server.py` — not IDE-managed | | Result | Immediate `gitea_whoami` EOF reported by recovery | Controller did not re-launch MCP servers, edit MCP config, kill processes, restore session state, or call internal modules. Formal approval not submitted. WHY: Role servers and control env must be client-managed; unsupported env vars and manual profile selection create untrusted identity/capability state and reproduce EOF class failures (#584). RELATED_PRS: PR #684 / #683; defects #584, #685, #686. BLOCKERS: Unsupported manual env/config launch path used (`GITEA_MCP_*` + `GITEA_DUMMY=2` + direct `mcp_server.py`); client-managed reviewer provenance not proven. **Unblock when:** operator completes IDE reconnect/reload of client-managed `gitea-reviewer` (no manual server launch), and a fresh reviewer session proves live `prgs-reviewer`/`sysadmin` with client-managed provenance. VALIDATION: Incident recorded on #584 (comment_id 10650). Live PR #684 head `d302602567a1fb7842fe5486fa5a49509506ec8b`; no formal approval submitted this session. LAST_UPDATED_BY: controller
Owner

Canonical Issue State

STATE:
open — cross-client namespace inventory clarification recorded (distinct from stale-runtime cohort)

WHO_IS_NEXT:
author

NEXT_ACTION:
Implement #672 config-drift diagnostic so each client reports which Gitea role namespaces are present/missing and their provenance; do not conflate missing-namespace drift with post-merge stale-runtime blocks

NEXT_PROMPT:

Role: AUTHOR
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Issue: #672

1. gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind branches/ worktree only.
2. Implement active-client vs expected Gitea role-server drift diagnostic (author, reviewer, merger, reconciler, tools as applicable).
3. Report present/missing per client config path; distinguish offline/global success from live IDE namespace availability.
4. Include explicit namespace inventory + provenance fields in diagnostic output.
5. Document that role availability differs across clients/configurations (observed: one client author+reviewer only; another client has callable reconciler).
6. Do not treat stale-runtime-after-master-advance as config-drift; that class is #685 / reconnect.
7. Sanctioned repair: backup → patch active config → IDE reconnect → live whoami per role. Forbid pkill/mtime/source/session edits.
8. PR with Closes #672; stop for independent review.

WHAT_HAPPENED:
Cross-client namespace discrepancy clarified during PR #684 / issue #683 post-merge reconciliation (2026-07-12):

Client surface Callable Gitea role namespaces Notes
One client (prior cohort) author + reviewer only Reconciler not exposed/callable on that surface
This client (Grok Build / this session) Callable gitea-reconciler (client-managed) Live whoami + get_profile succeeded via gitea-reconciler

On this client the real prior blocker was stale runtime after master advanced (cohort booted at 22698c1; master now 56f1230a10a21b16226c792a5bcdc4398c97b09a), not a missing reconciler namespace. After operator reconnect: profile prgs-reconciler, identity sysadmin, client-managed provenance (probe_source=client_namespace, ide_namespace_proven=true), startup_head=current_head=56f1230a…, stale=false, restart_required=false.

Do not conflate: (1) cross-client namespace gap = #672 inventory/config drift; (2) stale-runtime cohort = #685 / IDE reconnect only.

WHY:
Role availability differs across clients/configurations. Offline test_mcp_conn green is not live client proof. Durable separation of failure modes prevents wrong repair (install missing role vs reconnect for fresh SHA).

RELATED_PRS:
PR #684 merged (Closes #683); #685 #686 remain open product defects

BLOCKERS:
none for this clarification; product implementation still required on #672

VALIDATION:

  • Live gitea-reconciler: prgs-reconciler / sysadmin; parity fresh at 56f1230a; restart_required=false
  • Namespace health: healthy; client_namespace; blocks_merge_workflow=false

LAST_UPDATED_BY:
sysadmin / prgs-reconciler / RECONCILER / 2026-07-12

## Canonical Issue State STATE: open — cross-client namespace inventory clarification recorded (distinct from stale-runtime cohort) WHO_IS_NEXT: author NEXT_ACTION: Implement #672 config-drift diagnostic so each client reports which Gitea role namespaces are present/missing and their provenance; do not conflate missing-namespace drift with post-merge stale-runtime blocks NEXT_PROMPT: ```text Role: AUTHOR Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Issue: #672 1. gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind branches/ worktree only. 2. Implement active-client vs expected Gitea role-server drift diagnostic (author, reviewer, merger, reconciler, tools as applicable). 3. Report present/missing per client config path; distinguish offline/global success from live IDE namespace availability. 4. Include explicit namespace inventory + provenance fields in diagnostic output. 5. Document that role availability differs across clients/configurations (observed: one client author+reviewer only; another client has callable reconciler). 6. Do not treat stale-runtime-after-master-advance as config-drift; that class is #685 / reconnect. 7. Sanctioned repair: backup → patch active config → IDE reconnect → live whoami per role. Forbid pkill/mtime/source/session edits. 8. PR with Closes #672; stop for independent review. ``` WHAT_HAPPENED: Cross-client namespace discrepancy clarified during PR #684 / issue #683 post-merge reconciliation (2026-07-12): | Client surface | Callable Gitea role namespaces | Notes | |----------------|--------------------------------|-------| | One client (prior cohort) | author + reviewer only | Reconciler not exposed/callable on that surface | | This client (Grok Build / this session) | Callable gitea-reconciler (client-managed) | Live whoami + get_profile succeeded via gitea-reconciler | On this client the real prior blocker was **stale runtime after master advanced** (cohort booted at `22698c1`; master now `56f1230a10a21b16226c792a5bcdc4398c97b09a`), not a missing reconciler namespace. After operator reconnect: profile `prgs-reconciler`, identity `sysadmin`, client-managed provenance (`probe_source=client_namespace`, ide_namespace_proven=true), startup_head=current_head=`56f1230a…`, stale=false, restart_required=false. Do not conflate: (1) cross-client namespace gap = #672 inventory/config drift; (2) stale-runtime cohort = #685 / IDE reconnect only. WHY: Role availability differs across clients/configurations. Offline test_mcp_conn green is not live client proof. Durable separation of failure modes prevents wrong repair (install missing role vs reconnect for fresh SHA). RELATED_PRS: PR #684 merged (Closes #683); #685 #686 remain open product defects BLOCKERS: none for this clarification; product implementation still required on #672 VALIDATION: - Live gitea-reconciler: prgs-reconciler / sysadmin; parity fresh at 56f1230a; restart_required=false - Namespace health: healthy; client_namespace; blocks_merge_workflow=false LAST_UPDATED_BY: sysadmin / prgs-reconciler / RECONCILER / 2026-07-12
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Scaled-Tech-Consulting/Gitea-Tools#672