Open
jcwalker3
wants to merge 2 commits from
fix/issue-700-durable-walls into master
pull from: fix/issue-700-durable-walls
merge into: :master
:master
:fix/issue-987-native-mcp-bootstrap
:feat/issue-985-project-scoped-launcher-identity
:fix/issue-983-cross-repo-base-ref
:feat/issue-980-stale-worker-retirement
:fix/issue-975-client-identity-heartbeat
:fix/issue-973-cross-repo-canonical-roots
:fix/issue-970-safely-resolve-missing-worktrees
:fix/issue-969-native-mcp-bootstrap
:feat/issue-664-break-glass-restart
:feat/issue-708-mcp-namespace-attachment
:feat/issue-665-restart-audit
:fix/issue-700-durable-walls
:fix/issue-704-prevent-env-workspace-bindings
:feat/issue-707-cross-project-boundaries
:fix/issue-690-review-profile-switch-guard
:fix/issue-953-bootstrap-lock-provenance
:feat/issue-949-native-fleet-inventory
:fix/issue-943-runtime-context-helpers
:fix/issue-945-owning-pr-renewal-evidence
:fix/issue-941-scope-guard-bootstrap-wiring
:docs/issue-930-remote-mcp-coupling-inventory
:fix/issue-892-author-bootstrap-deadlock
:fix/issue-686-detect-reject-manual-mcp
:fix/issue-672-mcp-config-drift
:fix/issue-689-deterministic-mcp-namespace
:feat/issue-666-concurrent-mcp-restart-tests
:feat/issue-659-maintenance-drain-mode
:feat/issue-648-notifications-console
:fix/issue-670-direct-master-incident
:feat/issue-644-console-recovery
:feat/issue-650-providers-insights
:feat/issue-669-scoped-component-recovery
:docs/issue-668-mcp-ha-rolling-restart
:feat/issue-667-console-restart-controls
:feat/issue-645-linkage-console
:feat/issue-643-request-preview-initiate
:fix/issue-897-permission-stale-runtime-classification
:feat/issue-641-runtime-session-view
:feat/issue-663-restart-classes
:feat/issue-661-drain-proof-hard-gate
:fix/issue-854-semantic-container-exclusion
:issue-640
:fix/issue-682-starlette-httpx2
Labels
Clear labels
allocator
anti-stomp
architecture
bug
chore
codex
concurrency
contamination
control-plane
dashboard
database
design
documentation
enhancement
gitea
glitchtip
important
incident
incident-bridge
integration
jenkins
labels
leases
mcp
mcp-health
mcp-menu
multi-project
mutating
nice-to-have
observability
portability
preflight
protected-branch
queue
read-only
reconnect
recovery
refactor
release
reliability
resumable-review
reviewer
roadmap
safety
security
self-hosted
sentry
stale-runtime
status:blocked
status:in-progress
status:pr-open
status:ready
terminal-lock
testing
tracker
type:bug
type:feature
type:feature
type:guardrail
visibility
workflow
workflow-hardening
workflow-hardening
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
Controller-owned work allocator
Prevent concurrent LLM session stomping
Architecture / structural design
OpenAI Codex client / workflow session surface
Concurrent session safety
Workflow or session contamination incident
MCP control-plane coordination and allocation authority
MCP operational dashboard/queue view
Internal coordination storage (SQLite/Postgres)
Design / investigation, no implementation
Docs / runbooks
New feature or improvement
Gitea MCP workflow
GlitchTip integration
Operational or process incident requiring durable audit trail
Sentry-to-Gitea incident bridging
Integration testing
Jenkins integration
Label taxonomy management
Lease adopt/release/expire lifecycle
MCP server / tooling
MCP namespace and runtime health
MCP menu surface
Work spanning multiple monitoring projects or Gitea repos
Mutating action; requires gating
Observability, metrics, traces, error reporting
Cross-platform / portability
Shared preflight gates before mutation
Protected branch / stable-branch policy concern
Work queue visibility and allocation
Read-only, no mutation
MCP client reconnect/reload recovery path
Recovery paths for stale/foreign leases
Code refactor / restructure
Release / versioning
Reliability / failure handling
Persist and resume prepared review verdicts across sessions
Reviewer workflow tooling
Roadmap / umbrella issue
Safety rails and fail-closed mutation guards
Security / trust boundary
Self-hosted infrastructure integration
Sentry error monitoring integration
Stale backend daemon / runtime-vs-master parity failures
Issue is blocked
Issue is being worked on
Issue has an open pull request
Issue is ready for work
Terminal review lock (#332) path
Tests / test coverage
Issue tracker hygiene / meta
Bug or defect
Feature or enhancement
Feature or enhancement
Safety gate or guardrail
Workflow state visibility for LLMs/operators
Cross-tool workflow
LLM workflow coordination hardening
LLM workflow coordination hardening
Something is not working
This issue or pull request already exists
New feature
Need some help
Something is wrong
More information is needed
This won't be fixed
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Scaled-Tech-Consulting/Gitea-Tools#921
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #700
Closes #697
Acceptance Criteria Satisfied
line.startswith("??")exclusion in_parse_porcelain_entriesingitea_mcp_server.pyso untracked files are included in porcelain parsing.tests/test_issue_697_untracked_preflight.py.repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #921
issue: #697
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 18879-0b5d9cf95cf5
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr921-00e5265-s2
phase: claimed
candidate_head:
00e526512atarget_branch: master
target_branch_sha:
c30b381eb2last_activity: 2026-07-27T15:03:42Z
expires_at: 2026-07-27T15:13:42Z
blocker: none
REQUEST_CHANGES — PR #921 at head
00e526512a25b92d2a6caf8724b882f1af386ab4Independent review by
sysadmin/prgs-reviewer; authorjcwalker3, so independence holds. Validated in a fresh session-owned worktreebranches/review-pr921-00e5265-s2, detached at exactly this head, clean before and after. Merge base2b4e43042a34f4e29617378ae79a7f5a3d312688; targetmasterre-fetched atc30b381eb2756c4ba9cbb2bf7c3f2d6f31b701e7, and the head is not an ancestor of it, so the already-landed gate does not fire.The change itself is correct and minimal: removing
line.startswith("??")from_parse_porcelain_entriesdoes make that parser report untracked files, and the two new tests pass. The problem is not what the patch does — it is how much of #697 the patch is claimed to cover, and what it leaves untouched.B1 — BLOCKER: the codebase holds four answers to "is this checkout dirty", and this changes the one wired to reporting while both wired to enforcement keep the old answer
_parse_porcelain_entriesis not the dirty-state authority. Enumerated at this head:gitea_mcp_server._parse_porcelain_entries??gitea_get_runtime_contextreporting, delta wallsreviewer_worktree.parse_dirty_tracked_files:54-56??root_checkout_guard.py:82— the enforced guardgitea_mcp_server.py:19658-19661inline copy??gitea_update_pr_branch_by_mergegatedirty_same_claimant_session_rebind.py:143??Reproduced by direct invocation at this head, not inferred:
So after this change the runtime context reports the untracked file while
assess_root_checkout_guard— the gate that actually refuses the mutation — still returnsproven=True, dirty_files=[]. That is the #913 control-checkout untracked blind spot, and it is unchanged by this fix. Issue #697 is about dirty-state parity; a fix that moves one of four definitions increases the divergence it was filed to remove.reviewer_worktree.parse_dirty_tracked_filesalso still carries the docstring justifying the old behavior ("Untracked entries (??) are ignored — they do not block reviewer work"), so the two definitions now actively disagree in prose as well as in code.B2 — BLOCKER: the porcelain is captured at git's default
-u normal, so an untracked directory collapses and the delta walls stay blind_get_workspace_porcelainruns["git", "status", "--porcelain"](gitea_mcp_server.py:566-571) with no--untracked-files=all. Verified against real git in a throwaway repo:_new_tracked_changes_sincecompares parsed porcelain snapshots, so a byte-identical capture yields an empty delta. Confirmed by driving the real function:All three delta walls consume that function — whoami (
:878), capability (:899), and reviewer/merger (:1526). So writing any number of files beneath an already-untracked directory passes every one of them. The PR closes #697 on the strength of the??filter, but the capture mode silently caps how much the filter can ever see. Without-uall, B1's fix is partial even for the reporting path it does change.B3 — BLOCKER:
Closes #700retires a security-incident umbrella on the strength of one sub-itemThe PR body reads
Closes #700/Closes #697. Issue #700 isincident: contaminated controller run (PR #696/#695) — credential exposed via shell args/curl…, an open incident carrying six required durable walls (secret-redaction, credential-incident escalation, evidence-handling, native-provenance, process-termination guardrail, report-honesty) and a four-item canonical order. This PR delivers order item 2 (#697) only — and per B1/B2, partially.Gitea closes on PR-body keywords, so landing this retires the incident issue with five of six walls unbuilt. The commit message on this very head already gets it right —
fix(mcp): include untracked files in preflight porcelain parsing (Closes #697, Ref #700). The body should match the commit:Ref #700, notCloses #700.B4 — BLOCKER: the guard message now misattributes untracked files as "modifying tracked workspace files"
gitea_mcp_server.py:1528-1532raises:reviewer_deltais now fed by the??-inclusive parser, so this fires on untracked files while still asserting "tracked". In a shared control checkout that means a reviewer session that wrote nothing gets told it modified tracked files because some other session left an untracked artifact — and a reviewer may not clean a shared checkout, so the message names no action the recipient can take. Either the wording drops "tracked", or the wall distinguishes the two cases.Validation
Official PR-head validation status:
baseline-equivalent failure accepted. The ten failures reproduce at the merge base with a byte-identical set of failing test ids, so none originates here; the+2passes are exactly this PR's two new tests. No regression is introduced.Validation failure history: an earlier attempt at the head-vs-base id comparison was run entirely inside the head worktree, because the second
pytestinvocation in that command never changed directory — it compared head against head and was therefore meaningless. It was discarded and the baseline run was re-executed inbranches/baseline-pr921-2b4e430-s2withpwdandgit rev-parse HEADproof. Only the corrected run is reported above.Canonical PR State
STATE: PR #921 is open at head
00e526512aand now carries a formal REQUEST_CHANGES verdict from sysadmin recorded at that exact head. Four blocking findings are open. The two-line production change is correct in isolation and introduces no test regression against merge base2b4e43042a.WHO_IS_NEXT: author
NEXT_ACTION: Author jcwalker3 must bring the enforced dirty-state definitions into parity with the reporting one, capture porcelain with untracked-files=all, correct the PR body to Ref #700, fix the misattributing guard message, add a regression test per blocker, push, and publish a new head-pinned handoff for a fresh independent review.
NEXT_PROMPT:
WHAT_HAPPENED: An independent review at the exact head read the two-line production change, the new test file, and every other dirty-state definition in the tree, then reproduced all four blockers by execution rather than inference. Direct invocation showed the enforced root-checkout guard still returning proven True with empty dirty_files for untracked-only porcelain while the patched reporting parser sees the file. A real-git probe showed the default porcelain capture collapsing an untracked directory so that writes beneath it produce an empty delta at all three walls. Issue #700 was fetched live and confirmed to be a six-wall security incident that this PR would auto-close. Neighbouring suites were run at the head and at the merge base in separate branches/ worktrees; the failing test id sets are identical, so the ten failures are pre-existing and the two extra passes are this PR's own tests.
WHY: #697 asks for native Git and runtime dirty-state parity. This change moves one of four definitions and leaves both enforcement paths on the old answer, so the gap it targets stays open at exactly the layer that refuses mutations, and the capture mode caps what the fix can see even where it applies. The reference and message defects are smaller but both would mislead: one retires an open security incident, the other tells a blameless session it modified files it did not touch.
ISSUE: #697
HEAD_SHA:
00e526512aREVIEW_STATUS: REQUEST_CHANGES recorded at
00e526512aby sysadminMERGE_READY: no
BLOCKERS: code blocker
VALIDATION: Reviewed in /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr921-00e5265-s2, created fresh this session, detached at
00e526512a, verified clean by git status --porcelain --untracked-files=all before and after. Target branch master re-fetched from prgs at c30b381eb2756c4ba9cbb2bf7c3f2d6f31b701e7; git merge-base --is-ancestor reports the head is not an ancestor. Diff against merge base2b4e43042ais 2 files, +34/-2: a two-line change in gitea_mcp_server._parse_porcelain_entries plus tests/test_issue_697_untracked_preflight.py. B1 reproduced by direct invocation of assess_root_checkout_guard at this head: untracked-only porcelain yields proven True with empty dirty_files while the patched parser reports the path, and a tracked edit yields proven False. The other three ??-excluding definitions were located by grep over production sources at this head: reviewer_worktree.py:55, gitea_mcp_server.py:19660, dirty_same_claimant_session_rebind.py:143. B2 reproduced against real git in a throwaway repository outside the project tree: default porcelain renders one collapsed "?? newdir/" line whether one or two files exist beneath it, and _new_tracked_changes_since returns [] for that pair while returning the path for a new root-level untracked file and for a tracked edit. B3 verified by fetching issue #700 live in this session and reading its six acceptance criteria and four-item canonical order. B4 verified by reading gitea_mcp_server.py:1523-1532. Focused suite at head: 2 passed. Neighbouring sweep at head: 10 failed, 533 passed, 4974 deselected, 59 subtests. Same sweep at the merge base in branches/baseline-pr921-2b4e430-s2: 10 failed, 531 passed, 4974 deselected, 59 subtests. Failing test id sets compared with comm in both directions and found identical, so no regression originates from this branch and the +2 passes are its new tests. An earlier head-versus-base comparison was invalid because both runs executed in the head worktree; it was discarded and re-run with explicit cwd and HEAD proof. No full-suite run was performed at this head and none is claimed. No file was edited in either worktree. Pushes during validation: none.LAST_UPDATED_BY: sysadmin / prgs-reviewer / gitea-reviewer namespace, reviewer lease session 18879-0b5d9cf95cf5
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #921
issue: #697
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 18879-0b5d9cf95cf5
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr921-00e5265-s2
phase: released
candidate_head:
00e526512atarget_branch: master
target_branch_sha:
c30b381eb2last_activity: 2026-07-27T15:05:48Z
expires_at: 2026-07-27T15:15:48Z
blocker: manual-release
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.