feat: Sentry/GlitchTip incident bridge via incident_links (Closes #612) #623

Merged
sysadmin merged 1 commits from feat/issue-612-incident-bridge into master 2026-07-10 08:36:48 -05:00
Owner

Summary

Implements #612 phase-1 observability incident bridge on top of:

  • #613 control-plane DB / incident_links (PR #619, 10228e1)
  • #600 controller allocator (PR #622, f20c843)

Dependency chain: #613 substrate → #600 allocator → #612 bridge (this PR)

Design (ADR)

  • Gitea owns durable work; Sentry/GlitchTip own incidents; the bridge only links them.
  • Raw provider incidents are never assignable work items.
  • The allocator sees bridge work only as normal Gitea issues after create/link.
  • Dry-run is the default; apply creates/links through sanctioned Gitea issue paths + DB upsert.

Changes

File Purpose
incident_bridge.py Normalize/redact observations, project mappings, reconcile policy
control_plane_db.py get_incident_link_by_provider
gitea_mcp_server.py gitea_observability_list_projects, reconcile_incident, link_issue
task_capability_map.py observability task capabilities
tests/test_incident_bridge.py dedupe, dry-run, secrets, conflicts, non-assignable kinds
docs bridge usage notes

MCP tools (phase-1)

  • gitea_observability_list_projects
  • gitea_observability_reconcile_incident (apply=false|true, JSON observation)
  • gitea_observability_link_issue (explicit link to existing issue)

Config: GITEA_OBSERVABILITY_PROJECTS_JSON or GITEA_OBSERVABILITY_PROJECTS_FILE.

Validation

pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q
→ 49 passed
git diff --check → clean

Closes #612

## Summary Implements **#612** phase-1 observability incident bridge on top of: * **#613** control-plane DB / `incident_links` (PR #619, `10228e1`) * **#600** controller allocator (PR #622, `f20c843`) **Dependency chain:** `#613 substrate → #600 allocator → #612 bridge (this PR)` ## Design (ADR) * Gitea owns durable work; Sentry/GlitchTip own incidents; the bridge only links them. * **Raw provider incidents are never assignable work items.** * The allocator sees bridge work **only as normal Gitea issues** after create/link. * Dry-run is the default; apply creates/links through sanctioned Gitea issue paths + DB upsert. ## Changes | File | Purpose | |------|--------| | `incident_bridge.py` | Normalize/redact observations, project mappings, reconcile policy | | `control_plane_db.py` | `get_incident_link_by_provider` | | `gitea_mcp_server.py` | `gitea_observability_list_projects`, `reconcile_incident`, `link_issue` | | `task_capability_map.py` | observability task capabilities | | `tests/test_incident_bridge.py` | dedupe, dry-run, secrets, conflicts, non-assignable kinds | | docs | bridge usage notes | ### MCP tools (phase-1) * `gitea_observability_list_projects` * `gitea_observability_reconcile_incident` (`apply=false|true`, JSON observation) * `gitea_observability_link_issue` (explicit link to existing issue) Config: `GITEA_OBSERVABILITY_PROJECTS_JSON` or `GITEA_OBSERVABILITY_PROJECTS_FILE`. ## Validation ```text pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q → 49 passed git diff --check → clean ``` Closes #612
jcwalker3 added 1 commit 2026-07-10 02:19:08 -05:00
Add phase-1 observability bridge that turns provider observations into
normal Gitea issues and control-plane incident_links rows. Dry-run is
default; apply creates/links through sanctioned Gitea issue paths only.
Raw incidents remain non-assignable; the #600 allocator sees bridge work
only as ordinary Gitea issues. Builds on #613 substrate and #600 allocator.

Closes #612
Author
Owner

Canonical Issue State

STATE:
awaiting review
WHO_IS_NEXT:
reviewer
NEXT_ACTION:
review PR #623 at head 6a179aeb85 for issue #612 incident bridge on #613 substrate and #600 allocator; do not reopen #600 or #613
NEXT_PROMPT:

You are the REVIEWER for Scaled-Tech-Consulting/Gitea-Tools PR #623 (issue #612).
Pin head 6a179aeb8505e581f34a58e858dc2181039ad020.
Validate incident_bridge + gitea_observability_* tools: dry-run mutates nothing; apply creates/links only normal Gitea issues; incident_links dedupe; fingerprint conflict fail-closed; secrets redacted; raw incidents never work_items; allocator visibility only via Gitea issue kind.
Run pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q and git diff --check.
Do not merge without explicit operator command MERGE PR 623.

WHAT_HAPPENED:
Author implemented phase-1 observability bridge and opened PR #623 with body Closes #612.
WHY:
Dependency chain #613 then #600 is complete; #612 must convert provider observations into durable Gitea issues linked via incident_links without making raw incidents assignable.
RELATED_PRS:
#623 (this PR); #619 closed #613 at 10228e1; #622 closed #600 at f20c843
BLOCKERS:
none that block reviewer validation of PR #623
VALIDATION:
pytest suite for bridge plus control-plane plus allocator reported 49 passed; git diff --check clean; head 6a179aeb8505e581f34a58e858dc2181039ad020; substrates 10228e1 and f20c843 are ancestors
LAST_UPDATED_BY:
jcwalker3 (prgs-author)

[THREAD STATE LEDGER] PR #623 / Issue #612 — author implementation posted for review

What is true now:

  • PR state: open
  • Current head SHA: 6a179aeb85
  • Server-side decision state: no formal review posted
  • Local verdict/state: author implementation finished; automated tests passed
  • Substrate #613 closed at 10228e1c06
  • Allocator #600 closed at f20c8436aa
  • Raw provider incidents: not assignable work items
  • Durable work system: Gitea issues

What changed:

  • Added incident_bridge module and observability MCP tools
  • Opened PR #623 intending to close issue #612 after review and merge

What is blocked:

  • Blocker classification: no blocker

Who/what acts next:

  • Next actor: reviewer
  • Required action: full independent review of PR #623 at the pinned head
  • Do not do: reopen #600 or #613; merge without explicit operator MERGE PR 623; assign raw incidents as work_items
  • Resume from: PR #623 reviewer lease and validation suite
## Canonical Issue State STATE: awaiting review WHO_IS_NEXT: reviewer NEXT_ACTION: review PR #623 at head 6a179aeb8505e581f34a58e858dc2181039ad020 for issue #612 incident bridge on #613 substrate and #600 allocator; do not reopen #600 or #613 NEXT_PROMPT: ```text You are the REVIEWER for Scaled-Tech-Consulting/Gitea-Tools PR #623 (issue #612). Pin head 6a179aeb8505e581f34a58e858dc2181039ad020. Validate incident_bridge + gitea_observability_* tools: dry-run mutates nothing; apply creates/links only normal Gitea issues; incident_links dedupe; fingerprint conflict fail-closed; secrets redacted; raw incidents never work_items; allocator visibility only via Gitea issue kind. Run pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q and git diff --check. Do not merge without explicit operator command MERGE PR 623. ``` WHAT_HAPPENED: Author implemented phase-1 observability bridge and opened PR #623 with body Closes #612. WHY: Dependency chain #613 then #600 is complete; #612 must convert provider observations into durable Gitea issues linked via incident_links without making raw incidents assignable. RELATED_PRS: #623 (this PR); #619 closed #613 at 10228e1; #622 closed #600 at f20c843 BLOCKERS: none that block reviewer validation of PR #623 VALIDATION: pytest suite for bridge plus control-plane plus allocator reported 49 passed; git diff --check clean; head 6a179aeb8505e581f34a58e858dc2181039ad020; substrates 10228e1 and f20c843 are ancestors LAST_UPDATED_BY: jcwalker3 (prgs-author) [THREAD STATE LEDGER] PR #623 / Issue #612 — author implementation posted for review What is true now: - PR state: open - Current head SHA: 6a179aeb8505e581f34a58e858dc2181039ad020 - Server-side decision state: no formal review posted - Local verdict/state: author implementation finished; automated tests passed - Substrate #613 closed at 10228e1c068ade36d08e696b7473bcf0a39d0c0d - Allocator #600 closed at f20c8436aacdaea6ba2448764b43ef05e02d427b - Raw provider incidents: not assignable work items - Durable work system: Gitea issues What changed: - Added incident_bridge module and observability MCP tools - Opened PR #623 intending to close issue #612 after review and merge What is blocked: - Blocker classification: no blocker Who/what acts next: - Next actor: reviewer - Required action: full independent review of PR #623 at the pinned head - Do not do: reopen #600 or #613; merge without explicit operator MERGE PR 623; assign raw incidents as work_items - Resume from: PR #623 reviewer lease and validation suite
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #623
issue: #612
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 83954-7189a6540169
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-623
phase: claimed
candidate_head: 6a179aeb85
target_branch: master
target_branch_sha: f20c8436aa
last_activity: 2026-07-10T12:40:03Z
expires_at: 2026-07-10T14:40:03Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #623 issue: #612 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 83954-7189a6540169 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-623 phase: claimed candidate_head: 6a179aeb8505e581f34a58e858dc2181039ad020 target_branch: master target_branch_sha: f20c8436aacdaea6ba2448764b43ef05e02d427b last_activity: 2026-07-10T12:40:03Z expires_at: 2026-07-10T14:40:03Z blocker: none
sysadmin approved these changes 2026-07-10 07:48:15 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE:
approved awaiting operator merge command
WHO_IS_NEXT:
merger
NEXT_ACTION:
hold PR #623 at head 6a179aeb8505e581f34a58e858dc2181039ad020; merge only on explicit operator command MERGE PR 623 (do not reopen #600 or #613; do not assign raw incidents as work_items)
NEXT_PROMPT:

You are the MERGER for Scaled-Tech-Consulting/Gitea-Tools PR #623 (issue #612).
Pin head 6a179aeb8505e581f34a58e858dc2181039ad020, base master f20c8436.
Reviewer APPROVED at this head; #613 (10228e1) and #600 (f20c8436) are ancestors and closed.
Merge ONLY on explicit operator command MERGE PR 623. Do not reopen #600 or #613. Do not assign raw Sentry/GlitchTip incidents as work_items.

WHAT_HAPPENED:
Reviewer performed full independent review at the pinned head; validated dry-run/apply, dedupe, redaction, fail-closed mapping/fingerprint, non-assignable incident kinds, and allocator/Gitea boundary. All 17 review-focus items pass; 49 + 209 tests pass; git diff --check clean.
WHY:
#612 phase-1 bridge must convert provider observations into durable Gitea issues linked via #613 incident_links, building on the #600 allocator, without making raw incidents assignable work.
ISSUE:
#612
HEAD_SHA:
6a179aeb85
REVIEW_STATUS:
APPROVED
MERGE_READY:
yes (pending explicit operator command MERGE PR 623)
BLOCKERS:
none blocking; three non-blocking phase-2 hardening notes recorded below
VALIDATION:
pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q → 49 passed; pytest tests/test_mcp_server.py -q → 209 passed; git diff --check f20c8436...HEAD → clean; head 6a179aeb8505e581f34a58e858dc2181039ad020; substrates 10228e1 and f20c8436 are ancestors
LAST_UPDATED_BY:
sysadmin (prgs-reviewer)


APPROVE — PR #623 / issue #612 (phase-1 incident bridge)

Reviewed at pinned head 6a179aeb8505e581f34a58e858dc2181039ad020 (base master @ f20c8436). Substrates #613 (10228e1) and #600 (f20c8436) are ancestors; both closed. git diff --check clean; scope = 6 named files only.

Review-focus verdicts (all pass):

  1. Dry-run mutates nothing — apply=false returns before any create/upsert; only a read of the existing link. ✓
  2. Apply creates/links normal Gitea issues (gitea_create_issue, issue_type=bug) + incident_links upsert; never a work_items row. ✓
  3. Duplicates reuse the existing issue/link (OUTCOME_UPDATED, no new issue). ✓
  4. Ambiguous mapping fails closed (resolve_mapping raises → OUTCOME_BLOCKED). ✓
  5. Fingerprint conflict fails closed (_link_conflict → blocked, before mutation). ✓
  6. Secrets redacted on incident-derived fields (title, summary, culprit, env, severity, short_id, fingerprint, permalink) + sanitize_tags drops sensitive keys; body double-redacts summary. ✓
  7. Raw incidents never work_itemsassert_not_raw_incident_work_item + upsert_work_item rejects sentry_incident (InvalidWorkKindError); raw_incident_assignable=False always. ✓
  8. Allocator visibility only via kind=issue (allocator_visible_as). ✓
    9/10. Gitea durable (durable_work_system=gitea_issues), DB coordination (substrate=incident_links). ✓
  9. Uses #613 incident_links via get_incident_link_by_provider + upsert_incident_link. ✓
    12/13. Builds on #600 allocator; no allocator source reopened; #600/#613 stay closed. The _allocator_candidates_from_gitea edit only removes the now-obsolete hard-coded #612→#600 downstream block (correct post-merge). ✓
  10. Config via GITEA_OBSERVABILITY_PROJECTS_JSON/_FILE validated (list shape enforced, non-dict items filtered, JSON errors fail closed). ✓
  11. Failure modes return structured skip/block reasons. ✓ (see note 1)
  12. Capability mapping correct — tool gates gitea.read; apply=true additionally gates create_issue (author) at runtime. ✓
  13. Docs match phase-1 behavior. ✓

Validation run (reviewer, at pinned head):

  • pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q49 passed
  • pytest tests/test_mcp_server.py -q209 passed (server changed beyond bridge)
  • git diff --check f20c8436...HEAD → clean

Non-blocking notes for phase-2 (do not block this merge):

  1. Apply order is create-issue → upsert-link. If the DB upsert fails after the Gitea issue is created, the result correctly surfaces the created issue number and gitea_observability_link_issue(force_gitea_issue_number=N) can repair it — but a blind reconcile retry would create a duplicate. Consider a pre-create marker check or intent record.
  2. provider_base_url / provider_org / provider_project are written to the issue body without passing through redact_text (unlike the other fields). Defense-in-depth: run base_url through redaction to catch a misconfigured user:pass@host.
  3. The modified body-marker dependency logic in _allocator_candidates_from_gitea ("blocked on #" gate) has no direct unit test; add targeted coverage.

Raw Sentry/GlitchTip incidents are not assignable work items. Gitea issues remain the durable work system; the control-plane DB stores incident_links coordination only.

[THREAD STATE LEDGER] PR #623 / Issue #612 — reviewer APPROVED at pinned head

What is true now:

  • PR state: open, mergeable
  • Current head SHA: 6a179aeb85
  • Server-side decision state: reviewer APPROVED (this review) at current head
  • Substrate #613 closed at 10228e1c06 (ancestor)
  • Allocator #600 closed at f20c8436aa (ancestor)
  • Raw provider incidents: not assignable work items
  • Durable work system: Gitea issues; DB stores incident_links only

What changed:

  • Reviewer completed full validation and posted formal APPROVE at head 6a179aeb

What is blocked:

  • Merge is gated on explicit operator command MERGE PR 623

Who/what acts next:

  • Next actor: merger
  • Required action: merge PR #623 only on explicit operator command
  • Do not do: reopen #600 or #613; assign raw incidents as work_items; merge without MERGE PR 623
  • Resume from: PR #623 merger flow at pinned head 6a179aeb
## Canonical PR State STATE: approved awaiting operator merge command WHO_IS_NEXT: merger NEXT_ACTION: hold PR #623 at head 6a179aeb8505e581f34a58e858dc2181039ad020; merge only on explicit operator command MERGE PR 623 (do not reopen #600 or #613; do not assign raw incidents as work_items) NEXT_PROMPT: ```text You are the MERGER for Scaled-Tech-Consulting/Gitea-Tools PR #623 (issue #612). Pin head 6a179aeb8505e581f34a58e858dc2181039ad020, base master f20c8436. Reviewer APPROVED at this head; #613 (10228e1) and #600 (f20c8436) are ancestors and closed. Merge ONLY on explicit operator command MERGE PR 623. Do not reopen #600 or #613. Do not assign raw Sentry/GlitchTip incidents as work_items. ``` WHAT_HAPPENED: Reviewer performed full independent review at the pinned head; validated dry-run/apply, dedupe, redaction, fail-closed mapping/fingerprint, non-assignable incident kinds, and allocator/Gitea boundary. All 17 review-focus items pass; 49 + 209 tests pass; git diff --check clean. WHY: #612 phase-1 bridge must convert provider observations into durable Gitea issues linked via #613 incident_links, building on the #600 allocator, without making raw incidents assignable work. ISSUE: #612 HEAD_SHA: 6a179aeb8505e581f34a58e858dc2181039ad020 REVIEW_STATUS: APPROVED MERGE_READY: yes (pending explicit operator command MERGE PR 623) BLOCKERS: none blocking; three non-blocking phase-2 hardening notes recorded below VALIDATION: pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q → 49 passed; pytest tests/test_mcp_server.py -q → 209 passed; git diff --check f20c8436...HEAD → clean; head 6a179aeb8505e581f34a58e858dc2181039ad020; substrates 10228e1 and f20c8436 are ancestors LAST_UPDATED_BY: sysadmin (prgs-reviewer) --- ## APPROVE — PR #623 / issue #612 (phase-1 incident bridge) Reviewed at pinned head `6a179aeb8505e581f34a58e858dc2181039ad020` (base `master` @ `f20c8436`). Substrates #613 (`10228e1`) and #600 (`f20c8436`) are ancestors; both closed. `git diff --check` clean; scope = 6 named files only. **Review-focus verdicts (all pass):** 1. Dry-run mutates nothing — `apply=false` returns before any create/upsert; only a read of the existing link. ✓ 2. Apply creates/links **normal Gitea issues** (`gitea_create_issue`, issue_type=bug) + `incident_links` upsert; never a `work_items` row. ✓ 3. Duplicates reuse the existing issue/link (`OUTCOME_UPDATED`, no new issue). ✓ 4. Ambiguous mapping fails closed (`resolve_mapping` raises → `OUTCOME_BLOCKED`). ✓ 5. Fingerprint conflict fails closed (`_link_conflict` → blocked, before mutation). ✓ 6. Secrets redacted on incident-derived fields (title, summary, culprit, env, severity, short_id, fingerprint, permalink) + `sanitize_tags` drops sensitive keys; body double-redacts summary. ✓ 7. Raw incidents never `work_items` — `assert_not_raw_incident_work_item` + `upsert_work_item` rejects `sentry_incident` (`InvalidWorkKindError`); `raw_incident_assignable=False` always. ✓ 8. Allocator visibility only via `kind=issue` (`allocator_visible_as`). ✓ 9/10. Gitea durable (`durable_work_system=gitea_issues`), DB coordination (`substrate=incident_links`). ✓ 11. Uses #613 `incident_links` via `get_incident_link_by_provider` + `upsert_incident_link`. ✓ 12/13. Builds on #600 allocator; no allocator **source** reopened; #600/#613 stay closed. The `_allocator_candidates_from_gitea` edit only *removes* the now-obsolete hard-coded `#612→#600` downstream block (correct post-merge). ✓ 14. Config via `GITEA_OBSERVABILITY_PROJECTS_JSON`/`_FILE` validated (list shape enforced, non-dict items filtered, JSON errors fail closed). ✓ 15. Failure modes return structured skip/block reasons. ✓ (see note 1) 16. Capability mapping correct — tool gates `gitea.read`; `apply=true` **additionally** gates `create_issue` (author) at runtime. ✓ 17. Docs match phase-1 behavior. ✓ **Validation run (reviewer, at pinned head):** - `pytest tests/test_incident_bridge.py tests/test_control_plane_db.py tests/test_allocator_service.py -q` → **49 passed** - `pytest tests/test_mcp_server.py -q` → **209 passed** (server changed beyond bridge) - `git diff --check f20c8436...HEAD` → clean **Non-blocking notes for phase-2 (do not block this merge):** 1. Apply order is create-issue → upsert-link. If the DB upsert fails *after* the Gitea issue is created, the result correctly surfaces the created issue number and `gitea_observability_link_issue(force_gitea_issue_number=N)` can repair it — but a blind `reconcile` retry would create a duplicate. Consider a pre-create marker check or intent record. 2. `provider_base_url` / `provider_org` / `provider_project` are written to the issue body without passing through `redact_text` (unlike the other fields). Defense-in-depth: run `base_url` through redaction to catch a misconfigured `user:pass@host`. 3. The modified body-marker dependency logic in `_allocator_candidates_from_gitea` (`"blocked on #"` gate) has no direct unit test; add targeted coverage. Raw Sentry/GlitchTip incidents are **not** assignable work items. Gitea issues remain the durable work system; the control-plane DB stores `incident_links` coordination only. [THREAD STATE LEDGER] PR #623 / Issue #612 — reviewer APPROVED at pinned head What is true now: - PR state: open, mergeable - Current head SHA: 6a179aeb8505e581f34a58e858dc2181039ad020 - Server-side decision state: reviewer APPROVED (this review) at current head - Substrate #613 closed at 10228e1c068ade36d08e696b7473bcf0a39d0c0d (ancestor) - Allocator #600 closed at f20c8436aacdaea6ba2448764b43ef05e02d427b (ancestor) - Raw provider incidents: not assignable work items - Durable work system: Gitea issues; DB stores incident_links only What changed: - Reviewer completed full validation and posted formal APPROVE at head 6a179aeb What is blocked: - Merge is gated on explicit operator command MERGE PR 623 Who/what acts next: - Next actor: merger - Required action: merge PR #623 only on explicit operator command - Do not do: reopen #600 or #613; assign raw incidents as work_items; merge without MERGE PR 623 - Resume from: PR #623 merger flow at pinned head 6a179aeb
Owner

adopted_at: 2026-07-10T13:36:07Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 83954-7189a6540169
adopted_from_profile: prgs-reviewer
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 9362
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #623
issue: #612
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 60591-22c84b555334
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-control
phase: adopted
candidate_head: 6a179aeb85
target_branch: master
target_branch_sha: f20c8436aa
last_activity: 2026-07-10T13:36:07Z
expires_at: 2026-07-10T15:36:07Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-10T13:36:07Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 83954-7189a6540169 adopted_from_profile: prgs-reviewer adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 9362 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #623 issue: #612 reviewer_identity: sysadmin profile: prgs-merger session_id: 60591-22c84b555334 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-control phase: adopted candidate_head: 6a179aeb8505e581f34a58e858dc2181039ad020 target_branch: master target_branch_sha: f20c8436aacdaea6ba2448764b43ef05e02d427b last_activity: 2026-07-10T13:36:07Z expires_at: 2026-07-10T15:36:07Z blocker: none
sysadmin merged commit ab1c2d7973 into master 2026-07-10 08:36:48 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #623
issue: #612
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 60591-22c84b555334
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-control
phase: released
candidate_head: 6a179aeb85
target_branch: master
target_branch_sha: f20c8436aa
last_activity: 2026-07-10T14:15:00Z
expires_at: 2026-07-10T16:15:00Z
blocker: post-merge-moot

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #623 issue: #612 reviewer_identity: sysadmin profile: prgs-merger session_id: 60591-22c84b555334 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-control phase: released candidate_head: 6a179aeb8505e581f34a58e858dc2181039ad020 target_branch: master target_branch_sha: f20c8436aacdaea6ba2448764b43ef05e02d427b last_activity: 2026-07-10T14:15:00Z expires_at: 2026-07-10T16:15:00Z blocker: post-merge-moot
Owner

Stale #332 review-decision lock cleanup (#594)

Status: APPLIED

Manual deletion of session-state files is not the workflow.
This path only clears a lock when the referenced PR is merged/closed.

## Stale #332 review-decision lock cleanup (#594) Status: **APPLIED** - actor: `sysadmin` - profile: `prgs-reviewer` - timestamp: `2026-07-10T15:41:08.142894+00:00` - last terminal: `approve` on PR #623 - PR state: `closed` (merged=True) - merge_commit_sha: `ab1c2d797357614fccf4c94bd1ef36fd2e9f8c70` - prior live_mutations_count: `1` - prior profile_identity: `prgs-reviewer` Manual deletion of session-state files is **not** the workflow. This path only clears a lock when the referenced PR is merged/closed.
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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