Final-report validator crashes on non-dict action_log and demands forbidden legacy fields #698

Closed
opened 2026-07-13 09:28:21 -05:00 by jcwalker3 · 7 comments
Owner

The final-report validator suffered from several regressions when validating blocked or error-state reports:

  1. It iterated action_log inline without checking types. When passed strings (e.g. malformed JSON or LLM mistakes), it crashed with AttributeError: 'str' object has no attribute 'get'.
  2. HANDOFF_ROLE_FIELDS["review"] demanded legacy fields (Pinned reviewed head, Scratch worktree used, Worktree path, Worktree dirty, Mutations, Next) which are explicitly forbidden by review_final_report_schema.py.
  3. The validator misclassified blocked runs (with Candidate head SHA: none) and required approval/merge live-head fields although validation never began.

I've fixed this locally by validating isinstance(e, dict) and removing the legacy fields from review_proofs.py.

The final-report validator suffered from several regressions when validating blocked or error-state reports: 1. It iterated `action_log` inline without checking types. When passed strings (e.g. malformed JSON or LLM mistakes), it crashed with `AttributeError: 'str' object has no attribute 'get'`. 2. `HANDOFF_ROLE_FIELDS["review"]` demanded legacy fields (`Pinned reviewed head`, `Scratch worktree used`, `Worktree path`, `Worktree dirty`, `Mutations`, `Next`) which are explicitly forbidden by `review_final_report_schema.py`. 3. The validator misclassified blocked runs (with `Candidate head SHA: none`) and required approval/merge live-head fields although validation never began. I've fixed this locally by validating `isinstance(e, dict)` and removing the legacy fields from `review_proofs.py`.
Author
Owner

[THREAD STATE LEDGER] Issue #698 — provenance classification: diagnostic lead only; contaminated implementation was reverted and must be recreated

What is true now:

  • Server-side decision state: no server-side review or merge state changed by this comment; #698 remains in open state with no branch, no PR, no review, and no native-MCP-proven implementation attached.
  • Local verdict/state: #698 originated from the contaminated controller run recorded in incident #700 (INC-695-P1-CRED-2026-07-13). Its described changes correspond to contaminated root-checkout edits to final_report_validator.py (isinstance guards for non-dict action_log) and review_proofs.py (HANDOFF_ROLE_FIELDS legacy-field removal) that were reverted to master 2376567 during containment. The diagnostic observation itself is treated as a valid lead: validator crash behavior and legacy-field demands are worth fixing — but nothing here is proven, and no implementation exists.
  • Latest known validation: root checkout clean at master 2376567; no trace of the contaminated edits remains in the working tree.

What changed:

  • Provenance classification recorded: this issue is a diagnostic lead only, not native MCP proof; the prior implementation content was reverted and is retained only as an out-of-tree forensic patch under incident #700's containment record.
  • Canonical order recorded in #700 places this issue third: #699#697#698 (this issue) → fresh independent review of PR #696.

What is blocked:

  • Blocker classification: process/rule blocker
  • Implementation is deferred until #699 and #697 land through the canonical workflow; the reverted contaminated edits must not be restored or copied — the fix must be recreated from the issue statement with its own tests.

Who/what acts next:

  • Next actor: author
  • Required action: after #699 and #697 land, a fresh author session recreates this fix in its own issue-backed branches/ worktree (validator robustness for malformed action_log plus schema/field consistency, with a regression matrix), then hands off to an independent reviewer and the canonical merger with proof the merge-committed code is active in managed namespaces.
  • Do not do: do not restore or cherry-pick the reverted contaminated edits; do not work in the root checkout; do not use offline runners or direct API calls; do not start before #699 and #697 land.

Canonical Issue State

STATE:
diagnostic-lead-reimplementation-required

WHO_IS_NEXT:
author

NEXT_ACTION:
Recreate the final-report validator/schema consistency fix from scratch through the canonical workflow after #699 and #697 land; treat the prior implementation as forensic evidence only.

NEXT_PROMPT:

Role: AUTHOR (prgs-author)
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Issue: #698 — final-report validator crashes on non-dict action_log and demands forbidden legacy fields
Precondition: #699 and #697 fixes merge-committed to master and proven active in managed namespaces.

1. gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind a fresh issue-backed worktree under branches/ (never the root checkout).
2. Recreate the fix from the issue statement — do NOT restore the reverted contaminated edits: validator must fail gracefully (structured error, no crash) on malformed/non-dict action_log entries, and its required-field schema must match the canonical final-report schema (no demands for removed legacy fields).
3. Regression matrix: non-dict action_log, missing/extra fields, legacy-field absence accepted, canonical report accepted; cross-check against skills/llm-project-workflow/schemas/review-merge-final-report.md.
4. Focused + related + full validation; PR with Closes #698; independent reviewer; canonical merger; prove merge-committed code active in managed namespaces.

WHAT_HAPPENED:
The contaminated controller run edited the root checkout directly to patch the validator and proof fields; containment reverted those edits; this issue survives as the diagnostic lead for a clean reimplementation.

WHY:
Contaminated edits carry no trustworthy provenance and were never proven by native-MCP validation, so the observation is kept but the implementation must be recreated through the canonical workflow.

RELATED_PRS:
none yet — no PR exists for this issue; PR #696 is a separate track (security hold per its comment 11071).

BLOCKERS:
Process/rule blocker — #699 and #697 must land first per the canonical order in incident #700.

VALIDATION:
Root checkout confirmed clean at 2376567 (git status --porcelain empty); no branch or PR references this issue; incident #700 records the containment.

LAST_UPDATED_BY:
controller / prgs-author (jcwalker3)

[THREAD STATE LEDGER] Issue #698 — provenance classification: diagnostic lead only; contaminated implementation was reverted and must be recreated What is true now: - Server-side decision state: no server-side review or merge state changed by this comment; #698 remains in open state with no branch, no PR, no review, and no native-MCP-proven implementation attached. - Local verdict/state: #698 originated from the contaminated controller run recorded in incident #700 (INC-695-P1-CRED-2026-07-13). Its described changes correspond to contaminated root-checkout edits to `final_report_validator.py` (isinstance guards for non-dict `action_log`) and `review_proofs.py` (HANDOFF_ROLE_FIELDS legacy-field removal) that were reverted to master `2376567` during containment. The diagnostic observation itself is treated as a valid lead: validator crash behavior and legacy-field demands are worth fixing — but nothing here is proven, and no implementation exists. - Latest known validation: root checkout clean at master `2376567`; no trace of the contaminated edits remains in the working tree. What changed: - Provenance classification recorded: this issue is a diagnostic lead only, not native MCP proof; the prior implementation content was reverted and is retained only as an out-of-tree forensic patch under incident #700's containment record. - Canonical order recorded in #700 places this issue third: #699 → #697 → #698 (this issue) → fresh independent review of PR #696. What is blocked: - Blocker classification: process/rule blocker - Implementation is deferred until #699 and #697 land through the canonical workflow; the reverted contaminated edits must not be restored or copied — the fix must be recreated from the issue statement with its own tests. Who/what acts next: - Next actor: author - Required action: after #699 and #697 land, a fresh author session recreates this fix in its own issue-backed `branches/` worktree (validator robustness for malformed action_log plus schema/field consistency, with a regression matrix), then hands off to an independent reviewer and the canonical merger with proof the merge-committed code is active in managed namespaces. - Do not do: do not restore or cherry-pick the reverted contaminated edits; do not work in the root checkout; do not use offline runners or direct API calls; do not start before #699 and #697 land. ## Canonical Issue State STATE: diagnostic-lead-reimplementation-required WHO_IS_NEXT: author NEXT_ACTION: Recreate the final-report validator/schema consistency fix from scratch through the canonical workflow after #699 and #697 land; treat the prior implementation as forensic evidence only. NEXT_PROMPT: ```text Role: AUTHOR (prgs-author) Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Issue: #698 — final-report validator crashes on non-dict action_log and demands forbidden legacy fields Precondition: #699 and #697 fixes merge-committed to master and proven active in managed namespaces. 1. gitea_whoami + gitea_resolve_task_capability(work_issue) on prgs-author; bind a fresh issue-backed worktree under branches/ (never the root checkout). 2. Recreate the fix from the issue statement — do NOT restore the reverted contaminated edits: validator must fail gracefully (structured error, no crash) on malformed/non-dict action_log entries, and its required-field schema must match the canonical final-report schema (no demands for removed legacy fields). 3. Regression matrix: non-dict action_log, missing/extra fields, legacy-field absence accepted, canonical report accepted; cross-check against skills/llm-project-workflow/schemas/review-merge-final-report.md. 4. Focused + related + full validation; PR with Closes #698; independent reviewer; canonical merger; prove merge-committed code active in managed namespaces. ``` WHAT_HAPPENED: The contaminated controller run edited the root checkout directly to patch the validator and proof fields; containment reverted those edits; this issue survives as the diagnostic lead for a clean reimplementation. WHY: Contaminated edits carry no trustworthy provenance and were never proven by native-MCP validation, so the observation is kept but the implementation must be recreated through the canonical workflow. RELATED_PRS: none yet — no PR exists for this issue; PR #696 is a separate track (security hold per its comment 11071). BLOCKERS: Process/rule blocker — #699 and #697 must land first per the canonical order in incident #700. VALIDATION: Root checkout confirmed clean at 2376567 (git status --porcelain empty); no branch or PR references this issue; incident #700 records the containment. LAST_UPDATED_BY: controller / prgs-author (jcwalker3)
Author
Owner

CTH: Controller Decision — additional independent reproduction evidence (from PR #703 review)

Status: additional_#698_evidence_recorded; not_pr_703_scope; formal_review_succeeded_final_report_validation_inconsistent
Next owner: author
Current blocker: unchanged process order — reimplementation still deferred until #699 and #697 land; this comment only adds independent evidence
Decision: Record the independent PR #703 review reproduction as additional Issue #698 evidence only. Do not expand PR #703 / Issue #702 implementation scope to fix final-report validator defects.
Proof: Independent leased PR #703 review handoffs — Issue #702 comment 11234; PR #703 comment 11239; formal REQUEST_CHANGES at head 889931d5532b32a46a181e03c1345946c7516aac for #702 AC defects only.
Next action: Keep #698 as diagnostic-lead reimplementation track; absorb the new reproduction points into the future #698 fix matrix; leave PR #703 authors to address only #702 F1–F6 scope.
Ready-to-paste prompt: see NEXT_PROMPT.

New independent reproduction (PR #703 review session)

Observed during the independent formal review of PR #703 (Issue #702), after the formal review workflow itself completed successfully:

  1. Schema vs validator legacy-field contradiction
    The loaded final-report schema prohibits legacy fields that the final-report validator still requires (same class of defect as the original #698 lead: required-field set out of sync with the canonical schema).

  2. Misclassification of canonical reviewer lease release
    The validator misclassifies canonical reviewer lease release as post-merge cleanup, producing incorrect validation demands for a pre-merge / post-review lease-release path.

  3. Scope of impact on that review
    The formal review itself succeeded (native formal verdict submitted and read back). Only final-report validation remained inconsistent with the completed review outcome — i.e. this is a reporting/validator consistency defect, not a failure of the PR #703 formal review API path.

Explicit non-scope

Item In #698? In PR #703 / #702?
Final-report schema forbids legacy fields validator still requires Yes (additional evidence) No
Validator treats canonical reviewer lease release as post-merge cleanup Yes (additional evidence) No
PR #703 REQUEST_CHANGES F1–F6 / #702 AC2–AC3 recovery defects No Yes (author on #703)
Dotenv load-path prevention No No (#704)

Do not treat this evidence as a reason to block or widen PR #703 beyond Issue #702 acceptance criteria.

Cross-links

  • PR #703 — formal independent review workstream (implementation of #702)
  • Issue #702 — tracked defect for stale binding / crash-orphan lease recovery
  • Handoff comment 11234 — Issue #702 CTH: Reviewer Handoff — PR #703 REQUEST_CHANGES at pinned head
  • Handoff comment 11239 — PR #703 CTH: Reviewer Handoff — formal REQUEST_CHANGES read back

Canonical Issue State

STATE:
diagnostic-lead-reimplementation-required; additional-independent-reproduction-from-pr-703-review

WHO_IS_NEXT:
author

NEXT_ACTION:
After #699 and #697 land, recreate the #698 fix from scratch including this additional evidence: schema/validator legacy-field consistency; graceful non-dict action_log handling; correct classification of canonical reviewer lease release (not post-merge cleanup). Do not fix these on PR #703.

NEXT_PROMPT:

Role: AUTHOR (prgs-author) — Issue #698 only
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Precondition: #699 and #697 merge-committed and proven active (canonical order from #700).

Recreate #698 from the issue statement plus additional independent evidence from PR #703 review:
1. Validator must not require legacy fields prohibited by the loaded final-report schema.
2. Canonical reviewer lease release must not be misclassified as post-merge cleanup.
3. Non-dict action_log must fail structured (no crash) — original lead.
4. Regression matrix covering the above; independent reviewer; do not absorb into PR #703/#702.

Cross-links for evidence only: PR #703, Issue #702, handoffs 11234 and 11239.

WHAT_HAPPENED:
Controller recorded independent reproduction from the PR #703 formal review path: final-report schema/validator legacy-field mismatch and lease-release misclassification as post-merge cleanup, while the formal review verdict itself succeeded. Evidence attached to #698 only.

WHY:
Final-report validator defects must not be silently folded into the #702 recovery PR; they belong on the existing #698 diagnostic-lead reimplementation track.

RELATED_PRS:
PR #703 (source of independent observation; not the fix vehicle for this issue). No PR yet for #698.

BLOCKERS:
Process/rule blocker unchanged — #699 and #697 must land first per incident #700 order. This evidence does not change that order and does not block PR #703 remediation of #702 findings.

VALIDATION:

  • Issue #698 prior CTH 11089: diagnostic lead only; contaminated implementation reverted
  • Issue #702 comment 11234 and PR #703 comment 11239: formal REQUEST_CHANGES for #702 at pinned head 889931d; formal review path completed
  • This controller comment: no source edits; evidence-only update

LAST_UPDATED_BY:
controller (jcwalker3 / prgs-author)

## CTH: Controller Decision — additional independent reproduction evidence (from PR #703 review) Status: additional_#698_evidence_recorded; not_pr_703_scope; formal_review_succeeded_final_report_validation_inconsistent Next owner: author Current blocker: unchanged process order — reimplementation still deferred until #699 and #697 land; this comment only adds independent evidence Decision: Record the independent PR #703 review reproduction as **additional Issue #698 evidence only**. Do **not** expand PR #703 / Issue #702 implementation scope to fix final-report validator defects. Proof: Independent leased PR #703 review handoffs — Issue #702 comment 11234; PR #703 comment 11239; formal REQUEST_CHANGES at head `889931d5532b32a46a181e03c1345946c7516aac` for #702 AC defects only. Next action: Keep #698 as diagnostic-lead reimplementation track; absorb the new reproduction points into the future #698 fix matrix; leave PR #703 authors to address only #702 F1–F6 scope. Ready-to-paste prompt: see NEXT_PROMPT. ### New independent reproduction (PR #703 review session) Observed during the independent formal review of **PR #703** (Issue **#702**), after the formal review workflow itself completed successfully: 1. **Schema vs validator legacy-field contradiction** The loaded final-report schema **prohibits** legacy fields that the final-report **validator still requires** (same class of defect as the original #698 lead: required-field set out of sync with the canonical schema). 2. **Misclassification of canonical reviewer lease release** The validator **misclassifies canonical reviewer lease release** as **post-merge cleanup**, producing incorrect validation demands for a pre-merge / post-review lease-release path. 3. **Scope of impact on that review** The **formal review itself succeeded** (native formal verdict submitted and read back). **Only final-report validation remained inconsistent** with the completed review outcome — i.e. this is a reporting/validator consistency defect, not a failure of the PR #703 formal review API path. ### Explicit non-scope | Item | In #698? | In PR #703 / #702? | |------|----------|-------------------| | Final-report schema forbids legacy fields validator still requires | **Yes** (additional evidence) | **No** | | Validator treats canonical reviewer lease release as post-merge cleanup | **Yes** (additional evidence) | **No** | | PR #703 REQUEST_CHANGES F1–F6 / #702 AC2–AC3 recovery defects | No | **Yes** (author on #703) | | Dotenv load-path prevention | No | No (#704) | Do **not** treat this evidence as a reason to block or widen PR #703 beyond Issue #702 acceptance criteria. ### Cross-links - **PR #703** — formal independent review workstream (implementation of #702) - **Issue #702** — tracked defect for stale binding / crash-orphan lease recovery - **Handoff comment 11234** — Issue #702 CTH: Reviewer Handoff — PR #703 REQUEST_CHANGES at pinned head - **Handoff comment 11239** — PR #703 CTH: Reviewer Handoff — formal REQUEST_CHANGES read back ## Canonical Issue State STATE: diagnostic-lead-reimplementation-required; additional-independent-reproduction-from-pr-703-review WHO_IS_NEXT: author NEXT_ACTION: After #699 and #697 land, recreate the #698 fix from scratch including this additional evidence: schema/validator legacy-field consistency; graceful non-dict action_log handling; correct classification of canonical reviewer lease release (not post-merge cleanup). Do not fix these on PR #703. NEXT_PROMPT: ```text Role: AUTHOR (prgs-author) — Issue #698 only Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Precondition: #699 and #697 merge-committed and proven active (canonical order from #700). Recreate #698 from the issue statement plus additional independent evidence from PR #703 review: 1. Validator must not require legacy fields prohibited by the loaded final-report schema. 2. Canonical reviewer lease release must not be misclassified as post-merge cleanup. 3. Non-dict action_log must fail structured (no crash) — original lead. 4. Regression matrix covering the above; independent reviewer; do not absorb into PR #703/#702. Cross-links for evidence only: PR #703, Issue #702, handoffs 11234 and 11239. ``` WHAT_HAPPENED: Controller recorded independent reproduction from the PR #703 formal review path: final-report schema/validator legacy-field mismatch and lease-release misclassification as post-merge cleanup, while the formal review verdict itself succeeded. Evidence attached to #698 only. WHY: Final-report validator defects must not be silently folded into the #702 recovery PR; they belong on the existing #698 diagnostic-lead reimplementation track. RELATED_PRS: PR #703 (source of independent observation; not the fix vehicle for this issue). No PR yet for #698. BLOCKERS: Process/rule blocker unchanged — #699 and #697 must land first per incident #700 order. This evidence does not change that order and does not block PR #703 remediation of #702 findings. VALIDATION: - Issue #698 prior CTH 11089: diagnostic lead only; contaminated implementation reverted - Issue #702 comment 11234 and PR #703 comment 11239: formal REQUEST_CHANGES for #702 at pinned head 889931d; formal review path completed - This controller comment: no source edits; evidence-only update LAST_UPDATED_BY: controller (jcwalker3 / prgs-author)
Author
Owner

CTH: Controller Decision — #698 elevated to IMMEDIATE implementation priority (PR #703 re-review tooling stop)

Status: immediate_implementation_priority; independent_reproduction_at_c2fc268; blocks_fresh_pr_703_formal_verdict
Next owner: author
Current blocker: final-report validator/schema drift blocks formal review submission after successful leased validation
Decision: Issue #698 is now the immediate implementation priority. Prior ordering (#699#697#698) is superseded for this tooling-hold path because the live PR #703 re-review at head c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc completed code validation under a proper lease and was stopped only by gitea_validate_review_final_report (grade=blocked). No formal verdict exists at the current head; no bypass was attempted.
Proof: Issue #702 blocker comment 11277; PR #703 lease release comment 11282 (phase=released, session 48311-bc9067f4c07f); live review API: current_head_sha=c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc, only prior REQUEST_CHANGES is at stale head 889931d… (review_feedback_stale=true); gitea_assess_reviewer_pr_lease(703) active_lease=null / session_lease=null; gitea_list_workflow_leases(role=reviewer) count=0.
Next action: Author implements #698 immediately in an issue-backed branches/ worktree; land through independent review + merge; prove repaired validator active in managed namespaces before any new PR #703 reviewer starts.
Ready-to-paste prompt: see NEXT_PROMPT.

Exact independent reproduction (mandatory evidence matrix)

# Reproduction (exact)
1 Loaded review schema hash a7634e7b8689
2 Validator demands prohibited legacy fields (including Pinned reviewed head, Scratch worktree used, and generic Mutations) that the loaded schema forbids
3 Structured workflow-load and validation proof present in the draft are not recognized
4 Validator falsely infers a prior review mutation even though none occurred
5 Canonical lease release is liable to incorrect lifecycle classification (e.g. post-merge cleanup path)
6 No bypass was attempted — formal submission stopped at the mandatory gate

Cross-links

  • Issue #702 — parent recovery track; re-review stopped at tooling gate
  • PR #703 — live head c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc
  • Comment 11277 — Issue #702 CTH: Blocker — re-review stopped by final-report tooling
  • Comment 11282 — PR #703 lease release (session 48311-bc9067f4c07f, phase=released)
  • Prior #698 evidence: comments 11089, 11246

Explicit non-scope

This is not PR #703 / #702 product-scope work. Do not fold the validator fix into PR #703. Do not start a new PR #703 reviewer until this fix is merged and active.

Canonical Issue State

STATE:
immediate-implementation-priority; diagnostic-lead-plus-live-reproduction; blocks-pr-703-formal-re-review

WHO_IS_NEXT:
author

NEXT_ACTION:
Implement #698 now (schema/validator consistency + lease-release classification + non-dict action_log robustness); PR with Closes #698; independent review; merge; prove active in managed namespaces.

NEXT_PROMPT:

Role: AUTHOR (prgs-author) — Issue #698 IMMEDIATE PRIORITY
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools

1. gitea_whoami + gitea_resolve_task_capability on prgs-author; claim #698; fresh issue-backed worktree under branches/ only (never root).
2. Fix final-report validator/schema drift so schema hash a7634e7b8689 validates without forbidden legacy fields.
3. Accept structured workflow-load and exact validation proof; do not falsely infer prior review mutation when none occurred.
4. Classify canonical reviewer lease release correctly (not post-merge cleanup).
5. Preserve original lead: non-dict action_log → structured error, no crash.
6. Regression matrix covering the reproduction table in comment (this CTH); focused + related + full suite.
7. PR with Closes #698; independent reviewer; merger; prove merge-committed validator active in managed namespaces.
8. Do NOT implement on PR #703; do NOT start PR #703 re-review until this lands and is active.

Evidence: Issue #702 comment 11277; PR #703 head c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc; lease release 11282.

WHAT_HAPPENED:
Controller confirmed PR #703 re-review under lease completed validation at c2fc268, then hit final-report validator grade=blocked; elevated #698 to immediate priority with exact reproduction from 11277.

WHY:
Without the repaired validator, no formal current-head verdict can be recorded; continuing would require an unauthorized bypass.

RELATED_PRS:
PR #703 (tooling hold — not the fix vehicle). No #698 PR yet.

BLOCKERS:
None for starting #698 implementation. #698 itself blocks fresh PR #703 formal re-review until merged and active.

VALIDATION:

  • current_head_sha=c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc; no formal review at that head (only stale REQUEST_CHANGES at 889931d)
  • active_lease=null; session_lease=null; workflow leases (reviewer)=0
  • 11277: focused 80, related 41, full 2695 passed under lease; formal verdict not submitted; no bypass
  • 11282: lease released

LAST_UPDATED_BY:
controller (jcwalker3 / prgs-author)

## CTH: Controller Decision — #698 elevated to IMMEDIATE implementation priority (PR #703 re-review tooling stop) Status: immediate_implementation_priority; independent_reproduction_at_c2fc268; blocks_fresh_pr_703_formal_verdict Next owner: author Current blocker: final-report validator/schema drift blocks formal review submission after successful leased validation Decision: Issue **#698 is now the immediate implementation priority**. Prior ordering (#699 → #697 → #698) is **superseded for this tooling-hold path** because the live PR #703 re-review at head `c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc` completed code validation under a proper lease and was stopped **only** by `gitea_validate_review_final_report` (`grade=blocked`). No formal verdict exists at the current head; no bypass was attempted. Proof: Issue #702 blocker comment **11277**; PR #703 lease release comment **11282** (phase=released, session `48311-bc9067f4c07f`); live review API: current_head_sha=`c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc`, only prior REQUEST_CHANGES is at stale head `889931d…` (`review_feedback_stale=true`); `gitea_assess_reviewer_pr_lease(703)` active_lease=null / session_lease=null; `gitea_list_workflow_leases(role=reviewer)` count=0. Next action: Author implements #698 immediately in an issue-backed `branches/` worktree; land through independent review + merge; prove repaired validator active in managed namespaces before any new PR #703 reviewer starts. Ready-to-paste prompt: see NEXT_PROMPT. ### Exact independent reproduction (mandatory evidence matrix) | # | Reproduction (exact) | |---|----------------------| | 1 | Loaded review schema hash **`a7634e7b8689`** | | 2 | Validator **demands prohibited legacy fields** (including `Pinned reviewed head`, `Scratch worktree used`, and generic `Mutations`) that the loaded schema forbids | | 3 | Structured **workflow-load** and **validation proof** present in the draft are **not recognized** | | 4 | Validator **falsely infers a prior review mutation** even though none occurred | | 5 | Canonical **lease release** is liable to **incorrect lifecycle classification** (e.g. post-merge cleanup path) | | 6 | **No bypass was attempted** — formal submission stopped at the mandatory gate | ### Cross-links - **Issue #702** — parent recovery track; re-review stopped at tooling gate - **PR #703** — live head `c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc` - **Comment 11277** — Issue #702 CTH: Blocker — re-review stopped by final-report tooling - **Comment 11282** — PR #703 lease release (session `48311-bc9067f4c07f`, phase=released) - Prior #698 evidence: comments 11089, 11246 ### Explicit non-scope This is **not** PR #703 / #702 product-scope work. Do not fold the validator fix into PR #703. Do not start a new PR #703 reviewer until this fix is **merged and active**. ## Canonical Issue State STATE: immediate-implementation-priority; diagnostic-lead-plus-live-reproduction; blocks-pr-703-formal-re-review WHO_IS_NEXT: author NEXT_ACTION: Implement #698 now (schema/validator consistency + lease-release classification + non-dict action_log robustness); PR with Closes #698; independent review; merge; prove active in managed namespaces. NEXT_PROMPT: ```text Role: AUTHOR (prgs-author) — Issue #698 IMMEDIATE PRIORITY Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools 1. gitea_whoami + gitea_resolve_task_capability on prgs-author; claim #698; fresh issue-backed worktree under branches/ only (never root). 2. Fix final-report validator/schema drift so schema hash a7634e7b8689 validates without forbidden legacy fields. 3. Accept structured workflow-load and exact validation proof; do not falsely infer prior review mutation when none occurred. 4. Classify canonical reviewer lease release correctly (not post-merge cleanup). 5. Preserve original lead: non-dict action_log → structured error, no crash. 6. Regression matrix covering the reproduction table in comment (this CTH); focused + related + full suite. 7. PR with Closes #698; independent reviewer; merger; prove merge-committed validator active in managed namespaces. 8. Do NOT implement on PR #703; do NOT start PR #703 re-review until this lands and is active. Evidence: Issue #702 comment 11277; PR #703 head c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc; lease release 11282. ``` WHAT_HAPPENED: Controller confirmed PR #703 re-review under lease completed validation at c2fc268, then hit final-report validator grade=blocked; elevated #698 to immediate priority with exact reproduction from 11277. WHY: Without the repaired validator, no formal current-head verdict can be recorded; continuing would require an unauthorized bypass. RELATED_PRS: PR #703 (tooling hold — not the fix vehicle). No #698 PR yet. BLOCKERS: None for starting #698 implementation. #698 itself blocks fresh PR #703 formal re-review until merged and active. VALIDATION: - current_head_sha=c2fc2683b97e3ba5dc7eaf4ac9798af76bd08dfc; no formal review at that head (only stale REQUEST_CHANGES at 889931d) - active_lease=null; session_lease=null; workflow leases (reviewer)=0 - 11277: focused 80, related 41, full 2695 passed under lease; formal verdict not submitted; no bypass - 11282: lease released LAST_UPDATED_BY: controller (jcwalker3 / prgs-author)
jcwalker3 added the status:in-progress label 2026-07-13 16:19:49 -05:00
Author
Owner

Issue claim heartbeat

<!-- gitea-issue-claim-heartbeat:v1 --> **Issue claim heartbeat** - kind: claim - issue: #698 - branch: fix/issue-698-report-validator-schema - phase: claimed - profile: prgs-author - pr: none - blocker: none - next_action: create worktree and begin implementation
jcwalker3 added status:pr-open and removed status:in-progress labels 2026-07-13 16:37:57 -05:00
Author
Owner

[THREAD STATE LEDGER] Issue #698 — implementation recreated from scratch; PR #705 opened at head ee90a5e7a2b5; awaiting independent review

What is true now:

  • Server-side decision state: PR #705 is open against master with head ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e and body "Closes #698"; this issue carries status:pr-open; no review verdict has been recorded via the review API and no merge was attempted.
  • Local verdict/state: the fix was recreated from the issue statement plus the PR #703-review reproduction evidence (comment 11246), written fresh in the issue-backed worktree branches/fix-issue-698-report-validator; the reverted contaminated edits were not restored or copied.
  • Latest known validation: at ee90a5e — focused 27 passed (new regression file); companion suites for the touched modules 408 passed; full suite 2663 passed, 6 skipped, 161 subtests passed with -q -s in the project venv.

What changed:

  • Legacy-field requirements removed: review/merger required-field tables no longer demand the schema-forbidden names (Pinned reviewed head, Scratch worktree used, Worktree path, Worktree dirty, Mutations, Next); canonical names required instead.
  • Structured workflow-load and validation proof recognized in colon, key=value, and JSON renderings, and pass counts accepted inside the Validation field value.
  • Review mutations inferred only from authoritative evidence (performed=true, not gated); read-only diagnostics and pre-API rejections no longer imply mutations.
  • Canonical reviewer lease release is classified as lease lifecycle, never as post-merge cleanup; genuine branch/worktree removal claims still demand the full proof checklist.
  • Blocked reports with an explicit Reviewed/Candidate head SHA: none and no verdict/merge/validation owe no head proofs; phase-specific head proofs are demanded only after the corresponding phase begins; a report stating no head at all still fails closed.
  • Malformed action_log data (non-dict entries, non-list logs) produces clear sanitized findings instead of AttributeError; a defective validator rule fails closed with a sanitized finding instead of raising.
  • Regression fixtures added modeling the PR #703 formal-review handoff and the prior blocked-preflight reproduction (tests/test_issue_698_report_validator_schema_alignment.py, 27 tests); two legacy-field fixtures updated to the canonical schema.

What is blocked:

  • Blocker classification: no blocker
  • The independent review of PR #705 has not started; it requires a fresh reviewer session with its own worktree and lease.

Who/what acts next:

  • Next actor: reviewer
  • Required action: independent prgs-reviewer session — own PR #705 worktree, own lease acquired before any reading or validation, re-pin live head ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e, formal review against this issue's acceptance criteria including the comment 11246 evidence.
  • Do not do: do not treat this author validation as review authority; do not merge; do not touch PR #703, #702, #704, #701, or #696 in that session; do not restore the reverted contaminated edits for comparison.

Canonical Issue State

STATE:
pr-705-open-awaiting-independent-review

WHO_IS_NEXT:
reviewer

NEXT_ACTION:
Independent prgs-reviewer session: own worktree + own lease first, re-pin live head ee90a5e7a2, formal review of PR #705 against Issue #698 acceptance criteria (original lead + comment 11246 evidence).

NEXT_PROMPT:

Act as REVIEWER for PR #705 (prgs / Scaled-Tech-Consulting / Gitea-Tools), Issue #698.
1. Verify neutral runtime binding and zero active reviewer leases.
2. Create a fresh PR #705 worktree and acquire the reviewer lease BEFORE any reading or validation.
3. Re-pin the live head (expect ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e) and review against Issue #698: legacy-field removal, structured proof recognition, authoritative mutation inference, lease-release vs post-merge cleanup, blocked-report acceptance, action_log robustness, sanitized errors.
4. Record exactly one formal verdict via the native review API under the held lease. Do not merge; do not touch PR #703/#702/#704/#701/#696.

WHAT_HAPPENED:
Author session claimed and locked #698, created the issue-backed worktree from master 2376567, recreated the validator/schema alignment fix from scratch with 27 regression tests, ran focused/companion/full validation (2663 passed, 6 skipped, 161 subtests), pushed branch fix/issue-698-report-validator-schema, and opened PR #705.

WHY:
The prior implementation was contaminated and reverted; the canonical order gate recorded in comment 11089 was superseded by an explicit operator instruction to take #698 through the canonical workflow now, and the fix must land through an issue-backed branch with independent review.

RELATED_PRS:
PR #705 (implementation of this issue, open, head ee90a5e, zero reviews). PR #703 remains the separate #702 remediation track at its own head; PR #704, #701, #696 untouched.

BLOCKERS:
None — no blocker for the review path.

VALIDATION:
At ee90a5e in branches/fix-issue-698-report-validator: focused 27 passed; companion suites 408 passed; full suite 2663 passed, 6 skipped, 161 subtests passed. Issue label transitioned to status:pr-open by the PR-create tool.

LAST_UPDATED_BY:
author session 2026-07-13 (jcwalker3 / prgs-author)

[THREAD STATE LEDGER] Issue #698 — implementation recreated from scratch; PR #705 opened at head ee90a5e7a2b5; awaiting independent review What is true now: - Server-side decision state: PR #705 is open against master with head `ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e` and body "Closes #698"; this issue carries `status:pr-open`; no review verdict has been recorded via the review API and no merge was attempted. - Local verdict/state: the fix was recreated from the issue statement plus the PR #703-review reproduction evidence (comment 11246), written fresh in the issue-backed worktree `branches/fix-issue-698-report-validator`; the reverted contaminated edits were not restored or copied. - Latest known validation: at `ee90a5e` — focused 27 passed (new regression file); companion suites for the touched modules 408 passed; full suite 2663 passed, 6 skipped, 161 subtests passed with `-q -s` in the project venv. What changed: - Legacy-field requirements removed: review/merger required-field tables no longer demand the schema-forbidden names (`Pinned reviewed head`, `Scratch worktree used`, `Worktree path`, `Worktree dirty`, `Mutations`, `Next`); canonical names required instead. - Structured workflow-load and validation proof recognized in colon, key=value, and JSON renderings, and pass counts accepted inside the Validation field value. - Review mutations inferred only from authoritative evidence (`performed=true`, not gated); read-only diagnostics and pre-API rejections no longer imply mutations. - Canonical reviewer lease release is classified as lease lifecycle, never as post-merge cleanup; genuine branch/worktree removal claims still demand the full proof checklist. - Blocked reports with an explicit `Reviewed/Candidate head SHA: none` and no verdict/merge/validation owe no head proofs; phase-specific head proofs are demanded only after the corresponding phase begins; a report stating no head at all still fails closed. - Malformed action_log data (non-dict entries, non-list logs) produces clear sanitized findings instead of AttributeError; a defective validator rule fails closed with a sanitized finding instead of raising. - Regression fixtures added modeling the PR #703 formal-review handoff and the prior blocked-preflight reproduction (tests/test_issue_698_report_validator_schema_alignment.py, 27 tests); two legacy-field fixtures updated to the canonical schema. What is blocked: - Blocker classification: no blocker - The independent review of PR #705 has not started; it requires a fresh reviewer session with its own worktree and lease. Who/what acts next: - Next actor: reviewer - Required action: independent prgs-reviewer session — own PR #705 worktree, own lease acquired before any reading or validation, re-pin live head `ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e`, formal review against this issue's acceptance criteria including the comment 11246 evidence. - Do not do: do not treat this author validation as review authority; do not merge; do not touch PR #703, #702, #704, #701, or #696 in that session; do not restore the reverted contaminated edits for comparison. ## Canonical Issue State STATE: pr-705-open-awaiting-independent-review WHO_IS_NEXT: reviewer NEXT_ACTION: Independent prgs-reviewer session: own worktree + own lease first, re-pin live head ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e, formal review of PR #705 against Issue #698 acceptance criteria (original lead + comment 11246 evidence). NEXT_PROMPT: ```text Act as REVIEWER for PR #705 (prgs / Scaled-Tech-Consulting / Gitea-Tools), Issue #698. 1. Verify neutral runtime binding and zero active reviewer leases. 2. Create a fresh PR #705 worktree and acquire the reviewer lease BEFORE any reading or validation. 3. Re-pin the live head (expect ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e) and review against Issue #698: legacy-field removal, structured proof recognition, authoritative mutation inference, lease-release vs post-merge cleanup, blocked-report acceptance, action_log robustness, sanitized errors. 4. Record exactly one formal verdict via the native review API under the held lease. Do not merge; do not touch PR #703/#702/#704/#701/#696. ``` WHAT_HAPPENED: Author session claimed and locked #698, created the issue-backed worktree from master 2376567, recreated the validator/schema alignment fix from scratch with 27 regression tests, ran focused/companion/full validation (2663 passed, 6 skipped, 161 subtests), pushed branch fix/issue-698-report-validator-schema, and opened PR #705. WHY: The prior implementation was contaminated and reverted; the canonical order gate recorded in comment 11089 was superseded by an explicit operator instruction to take #698 through the canonical workflow now, and the fix must land through an issue-backed branch with independent review. RELATED_PRS: PR #705 (implementation of this issue, open, head ee90a5e, zero reviews). PR #703 remains the separate #702 remediation track at its own head; PR #704, #701, #696 untouched. BLOCKERS: None — no blocker for the review path. VALIDATION: At ee90a5e in branches/fix-issue-698-report-validator: focused 27 passed; companion suites 408 passed; full suite 2663 passed, 6 skipped, 161 subtests passed. Issue label transitioned to status:pr-open by the PR-create tool. LAST_UPDATED_BY: author session 2026-07-13 (jcwalker3 / prgs-author)
Owner

CTH: Merger Handoff — #557 MCP merge of PR #705 not completed; UI merge required

Status: pr_705_open; mcp_merge_blocked_without_formal_approve; authorization_11322_valid
Next owner: user
Current blocker: Live gitea_merge_pr requires formal APPROVED at current head; formal APPROVE path still blocked by unpatched final-report validator (this issue). #557 authorization 11322 permits operator UI merge.
Decision: Mirror of PR #705 comment 11337. No merge mutation. Issue remains open until PR #705 lands.
Proof: PR #705 comment 11337; authorization 11322.
Next action: Operator UI-merges PR #705 at head ee90a5e7a2, managed reconnect, controller activation proof.
Ready-to-paste prompt: see PR #705 comment 11337 NEXT_PROMPT.

Canonical Issue State

STATE:
pr-705-open-awaiting-operator-ui-merge-557

WHO_IS_NEXT:
user

NEXT_ACTION:
UI-merge PR #705 per authorization 11322 while head is ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e; then activation proof.

NEXT_PROMPT:

See PR #705 comment 11337 NEXT_PROMPT (operator UI merge + managed reconnect + controller activation).

WHAT_HAPPENED:
Merger preflight passed; MCP merge fail-closed without formal APPROVE; temporary lease released; no merge.

WHY:
Bootstrap deadlock: cannot formally approve the fix that unblocks formal approve on unpatched master; #557 UI merge is the landing path.

RELATED_PRS:
PR #705 (open). PR #703 remains held.

BLOCKERS:
Operator UI merge of #705.

VALIDATION:
See PR #705/11337.

LAST_UPDATED_BY:
merger (sysadmin / prgs-merger)

## CTH: Merger Handoff — #557 MCP merge of PR #705 not completed; UI merge required Status: pr_705_open; mcp_merge_blocked_without_formal_approve; authorization_11322_valid Next owner: user Current blocker: Live `gitea_merge_pr` requires formal APPROVED at current head; formal APPROVE path still blocked by unpatched final-report validator (this issue). #557 authorization 11322 permits operator UI merge. Decision: Mirror of PR #705 comment **11337**. No merge mutation. Issue remains open until PR #705 lands. Proof: PR #705 comment 11337; authorization 11322. Next action: Operator UI-merges PR #705 at head ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e, managed reconnect, controller activation proof. Ready-to-paste prompt: see PR #705 comment 11337 NEXT_PROMPT. ## Canonical Issue State STATE: pr-705-open-awaiting-operator-ui-merge-557 WHO_IS_NEXT: user NEXT_ACTION: UI-merge PR #705 per authorization 11322 while head is ee90a5e7a2b5f53f402d1f10e05b21005cf6eb6e; then activation proof. NEXT_PROMPT: ```text See PR #705 comment 11337 NEXT_PROMPT (operator UI merge + managed reconnect + controller activation). ``` WHAT_HAPPENED: Merger preflight passed; MCP merge fail-closed without formal APPROVE; temporary lease released; no merge. WHY: Bootstrap deadlock: cannot formally approve the fix that unblocks formal approve on unpatched master; #557 UI merge is the landing path. RELATED_PRS: PR #705 (open). PR #703 remains held. BLOCKERS: Operator UI merge of #705. VALIDATION: See PR #705/11337. LAST_UPDATED_BY: merger (sysadmin / prgs-merger)
Owner

CTH: Residual defect still reproducible after PR #705_rule_shared_canonical_comment_post_claim nested non-dict crash

Status: residual_#698_reproduced_on_master_cc3ad08; not_a_duplicate; do_not_bypass_validator
Next owner: author
Current blocker: none for filing; residual is residual of #698 action-log robustness (top-level fixed, nested not)
Decision: Update this issue with independent reproduction. Do not open a duplicate issue. Do not fold into PR #703 / #702. Do not bypass gitea_validate_review_final_report.
Proof: master cc3ad0870aab9829cbe28cd869a283beeb37991d (Merge of PR #705); live call of _rule_shared_canonical_comment_post_claim on that tree.

What PR #705 fixed (still true)

  • Top-level non-dict action_log entries are skipped via _iter_action_entries / sanitize_action_log.
  • Legacy-field demand / lease-release-as-post-merge / blocked-preflight head-proof issues from prior evidence are the #705 track.

What remains broken (exact)

_rule_shared_canonical_comment_post_claim still does:

validation = entry.get("canonical_comment_validation") or {}
if validation.get("allowed") is False:  # crashes when validation is non-empty non-dict
    ...
result = entry.get("result") or {}
nested = result.get("canonical_comment_validation") or {}  # crashes when result is non-empty non-dict

Truthiness of a non-empty str/list/int prevents the or {} fallback, then .get raises AttributeError.

Reproduction matrix (master @ cc3ad08, wall time ~2026-07-13T23:13Z)

action_log entry Result
None / [] / ["not-a-dict"] OK (no crash)
[{"canonical_comment_validation": {"allowed": False}}] OK
[{"canonical_comment_validation": "bad"}] CRASH AttributeError: 'str' object has no attribute 'get'
[{"result": "bad"}] CRASH same
[{"canonical_comment_validation": ["x"]}] CRASH list
[{"result": 1}] CRASH int
[{"canonical_comment_validation": None}] OK (None or {})

Crash occurs even when the report text does not claim a comment was posted (rule entry before claim check).

Scope / non-scope

Item Track
Nested non-dict crash in _rule_shared_canonical_comment_post_claim This residual on #698
PR #703 / Issue #702 stale-binding recovery Separate
Bypass final-report validator for #703 formal verdict Forbidden

Canonical Issue State

STATE:
closed_by_705_but_residual_nested_action_log_crash_open_for_followup

WHO_IS_NEXT:
author

NEXT_ACTION:
Author follow-up (issue-backed worktree): harden nested canonical_comment_validation / result reads with isinstance(..., dict) (or equivalent helper); regression cases for str/list/int nested values; land via independent review. Do not reopen product scope of #702/#703 for this.

NEXT_PROMPT:

Role: AUTHOR (prgs-author) — residual of Issue #698 only
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Base: master (includes PR #705 @ cc3ad08+)

1. Claim follow-up work on #698 residual (do not create a duplicate issue).
2. Fix `_rule_shared_canonical_comment_post_claim` so nested non-dict
   `canonical_comment_validation` / `result` values never raise; treat as
   non-rejecting structured entries (or emit sanitized findings), never crash.
3. Regression: str/list/int/None nested values; reject-dict still blocks when
   report claims comment posted; no claim → no block.
4. Focused + full suite; PR closes residual; independent review; no bypass of validator.

WHAT_HAPPENED:
Controller/reconciler reassessing PR #703 lease 11370 independently reproduced residual #698 crash on merged master after #705.

WHY:
#705 hardened top-level action_log iteration but left nested field access unsafe; same defect class as original lead.

RELATED_PRS:
PR #705 merged (partial #698). PR #703 not the fix vehicle.

BLOCKERS:
None for author start. Residual may still fail-closed/crash some final-report paths if nested garbage appears; formal review must still not bypass the validator.

VALIDATION:

  • master = cc3ad0870a
  • live AttributeError on nested non-dict cases listed above
  • PID not used as evidence

LAST_UPDATED_BY:
controller/reconciler (sysadmin / prgs-reconciler)

## CTH: Residual defect still reproducible after PR #705 — `_rule_shared_canonical_comment_post_claim` nested non-dict crash Status: residual_#698_reproduced_on_master_cc3ad08; not_a_duplicate; do_not_bypass_validator Next owner: author Current blocker: none for filing; residual is residual of #698 action-log robustness (top-level fixed, nested not) Decision: Update **this issue** with independent reproduction. Do **not** open a duplicate issue. Do **not** fold into PR #703 / #702. Do **not** bypass `gitea_validate_review_final_report`. Proof: master `cc3ad0870aab9829cbe28cd869a283beeb37991d` (Merge of PR #705); live call of `_rule_shared_canonical_comment_post_claim` on that tree. ### What PR #705 fixed (still true) - Top-level non-dict `action_log` entries are skipped via `_iter_action_entries` / `sanitize_action_log`. - Legacy-field demand / lease-release-as-post-merge / blocked-preflight head-proof issues from prior evidence are the #705 track. ### What remains broken (exact) `_rule_shared_canonical_comment_post_claim` still does: ```python validation = entry.get("canonical_comment_validation") or {} if validation.get("allowed") is False: # crashes when validation is non-empty non-dict ... result = entry.get("result") or {} nested = result.get("canonical_comment_validation") or {} # crashes when result is non-empty non-dict ``` Truthiness of a non-empty `str`/`list`/`int` prevents the `or {}` fallback, then `.get` raises `AttributeError`. ### Reproduction matrix (master @ cc3ad08, wall time ~2026-07-13T23:13Z) | action_log entry | Result | |------------------|--------| | `None` / `[]` / `["not-a-dict"]` | OK (no crash) | | `[{"canonical_comment_validation": {"allowed": False}}]` | OK | | `[{"canonical_comment_validation": "bad"}]` | **CRASH** `AttributeError: 'str' object has no attribute 'get'` | | `[{"result": "bad"}]` | **CRASH** same | | `[{"canonical_comment_validation": ["x"]}]` | **CRASH** `list` | | `[{"result": 1}]` | **CRASH** `int` | | `[{"canonical_comment_validation": None}]` | OK (`None or {}`) | Crash occurs even when the report text does **not** claim a comment was posted (rule entry before claim check). ### Scope / non-scope | Item | Track | |------|--------| | Nested non-dict crash in `_rule_shared_canonical_comment_post_claim` | **This residual on #698** | | PR #703 / Issue #702 stale-binding recovery | Separate | | Bypass final-report validator for #703 formal verdict | **Forbidden** | ## Canonical Issue State STATE: closed_by_705_but_residual_nested_action_log_crash_open_for_followup WHO_IS_NEXT: author NEXT_ACTION: Author follow-up (issue-backed worktree): harden nested `canonical_comment_validation` / `result` reads with `isinstance(..., dict)` (or equivalent helper); regression cases for str/list/int nested values; land via independent review. Do not reopen product scope of #702/#703 for this. NEXT_PROMPT: ```text Role: AUTHOR (prgs-author) — residual of Issue #698 only Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Base: master (includes PR #705 @ cc3ad08+) 1. Claim follow-up work on #698 residual (do not create a duplicate issue). 2. Fix `_rule_shared_canonical_comment_post_claim` so nested non-dict `canonical_comment_validation` / `result` values never raise; treat as non-rejecting structured entries (or emit sanitized findings), never crash. 3. Regression: str/list/int/None nested values; reject-dict still blocks when report claims comment posted; no claim → no block. 4. Focused + full suite; PR closes residual; independent review; no bypass of validator. ``` WHAT_HAPPENED: Controller/reconciler reassessing PR #703 lease 11370 independently reproduced residual #698 crash on merged master after #705. WHY: #705 hardened top-level action_log iteration but left nested field access unsafe; same defect class as original lead. RELATED_PRS: PR #705 merged (partial #698). PR #703 not the fix vehicle. BLOCKERS: None for author start. Residual may still fail-closed/crash some final-report paths if nested garbage appears; formal review must still not bypass the validator. VALIDATION: - master = cc3ad0870aab9829cbe28cd869a283beeb37991d - live AttributeError on nested non-dict cases listed above - PID not used as evidence LAST_UPDATED_BY: controller/reconciler (sysadmin / prgs-reconciler)
Sign in to join this conversation.
No labels status:pr-open
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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