From 553174cc088b7c3c0b6e00162e1cccf5073975f9 Mon Sep 17 00:00:00 2001 From: POM Date: Fri, 13 Mar 2026 01:55:56 +0100 Subject: [PATCH 01/15] desloppify: update triage and issue semantics --- .../cli_support/parser_groups_plan_impl.py | 3 + ...groups_plan_impl_sections_queue_reorder.py | 31 ++- desloppify/app/commands/next/render.py | 10 +- desloppify/app/commands/next/render_nudges.py | 4 +- .../app/commands/next/render_scoring.py | 6 +- .../app/commands/next/render_support.py | 3 +- desloppify/app/commands/plan/cmd.py | 2 + .../app/commands/plan/reorder_handlers.py | 38 ++- .../plan/triage/confirmations/basic.py | 6 +- .../commands/plan/triage/display/dashboard.py | 9 +- .../commands/plan/triage/display/layout.py | 5 +- .../commands/plan/triage/observe_batches.py | 8 +- .../orchestrator_codex_pipeline_execution.py | 12 +- .../plan/triage/runner/stage_prompts.py | 8 +- .../stage_prompts_instruction_blocks.py | 24 +- .../stage_prompts_instruction_shared.py | 4 + .../plan/triage/runner/stage_validation.py | 12 +- .../commands/plan/triage/stages/helpers.py | 3 +- .../commands/plan/triage/stages/observe.py | 5 +- .../commands/plan/triage/stages/reflect.py | 7 +- .../commands/plan/triage/stages/rendering.py | 3 +- .../triage/validation/completion_policy.py | 3 +- .../plan/triage/validation/stage_policy.py | 5 +- .../app/commands/plan/triage/workflow.py | 6 +- .../commands/review/importing/plan_sync.py | 6 +- .../app/commands/scan/plan_reconcile.py | 6 +- .../app/commands/show/dimension_views.py | 3 +- desloppify/base/output/issues.py | 3 +- desloppify/engine/_plan/cluster_strategy.py | 8 +- desloppify/engine/_plan/policy/stale.py | 6 +- desloppify/engine/_plan/policy/subjective.py | 14 +- .../engine/_plan/reconcile_review_import.py | 15 +- desloppify/engine/_plan/schema/__init__.py | 87 ++++--- desloppify/engine/_plan/triage/apply.py | 3 +- desloppify/engine/_plan/triage/core.py | 4 +- desloppify/engine/_plan/triage/prompt.py | 240 ++++++++++++++++-- desloppify/engine/_scoring/detection.py | 8 +- desloppify/engine/_scoring/policy/core.py | 17 +- desloppify/engine/_scoring/subjective/core.py | 3 +- desloppify/engine/_state/filtering.py | 5 +- desloppify/engine/_state/issue_semantics.py | 184 ++++++++++++++ desloppify/engine/_state/merge_issues.py | 20 +- desloppify/engine/_state/recovery.py | 2 + desloppify/engine/_state/resolution.py | 3 +- desloppify/engine/_state/schema.py | 23 +- .../engine/_state/schema_types_issues.py | 2 + desloppify/engine/_work_queue/helpers.py | 11 +- desloppify/engine/_work_queue/issues.py | 5 +- desloppify/engine/_work_queue/selection.py | 7 +- desloppify/engine/_work_queue/snapshot.py | 97 +++++-- desloppify/engine/_work_queue/synthetic.py | 5 +- desloppify/engine/_work_queue/types.py | 2 + desloppify/intelligence/integrity.py | 8 +- .../narrative/action_engine_routing.py | 10 +- desloppify/intelligence/narrative/signals.py | 10 +- .../plan/test_plan_overrides_direct.py | 35 +++ .../tests/commands/plan/test_triage_runner.py | 4 +- .../commands/test_next_queue_flow_direct.py | 5 +- .../engine/test_sync_split_modules_direct.py | 40 ++- desloppify/tests/plan/test_epic_triage.py | 37 ++- .../plan/test_epic_triage_prompt_direct.py | 59 ++++- .../tests/plan/test_planned_objective_ids.py | 47 ---- .../tests/plan/test_subjective_policy.py | 20 +- .../test_work_queue_plan_order_and_triage.py | 19 +- desloppify/tests/state/test_state.py | 17 +- .../tests/state/test_state_internal_direct.py | 55 ++++ test_release_image.png | Bin 0 -> 852388 bytes 67 files changed, 1104 insertions(+), 268 deletions(-) create mode 100644 desloppify/engine/_state/issue_semantics.py delete mode 100644 desloppify/tests/plan/test_planned_objective_ids.py create mode 100644 test_release_image.png diff --git a/desloppify/app/cli_support/parser_groups_plan_impl.py b/desloppify/app/cli_support/parser_groups_plan_impl.py index 971678fe..8b0042d0 100644 --- a/desloppify/app/cli_support/parser_groups_plan_impl.py +++ b/desloppify/app/cli_support/parser_groups_plan_impl.py @@ -11,6 +11,7 @@ ) from .parser_groups_plan_impl_sections_cluster import _add_cluster_subparser from .parser_groups_plan_impl_sections_queue_reorder import ( + _add_promote_subparser, _add_queue_subparser, _add_reorder_subparser, ) @@ -50,6 +51,7 @@ def add_plan_parser(sub) -> None: show Show plan metadata summary queue Compact table of execution queue items reset Reset plan to empty + promote Promote backlog issues or clusters into the queue reorder Reposition issues or clusters in the queue resolve Mark issues as fixed (score movement + next-step) describe Set augmented description @@ -81,6 +83,7 @@ def add_plan_parser(sub) -> None: # plan reset plan_sub.add_parser("reset", help="Reset plan to empty") + _add_promote_subparser(plan_sub) _add_reorder_subparser(plan_sub) _add_annotation_subparsers(plan_sub) _add_skip_subparsers(plan_sub) diff --git a/desloppify/app/cli_support/parser_groups_plan_impl_sections_queue_reorder.py b/desloppify/app/cli_support/parser_groups_plan_impl_sections_queue_reorder.py index d8524ab3..b09489c0 100644 --- a/desloppify/app/cli_support/parser_groups_plan_impl_sections_queue_reorder.py +++ b/desloppify/app/cli_support/parser_groups_plan_impl_sections_queue_reorder.py @@ -16,6 +16,34 @@ def _add_queue_subparser(plan_sub) -> None: help="Sort order (default: priority)") +def _add_promote_subparser(plan_sub) -> None: + p_promote = plan_sub.add_parser( + "promote", + help="Promote backlog issues or clusters into the queue", + epilog="""\ +patterns accept issue IDs, detector names, file paths, globs, or cluster names. +cluster names expand to all member IDs automatically. + +examples: + desloppify plan promote security top + desloppify plan promote auto/test_coverage bottom + desloppify plan promote my-cluster before -t workflow::run-scan""", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + p_promote.add_argument( + "patterns", nargs="+", metavar="PATTERN", + help="Issue ID(s), detector, file path, glob, or cluster name", + ) + p_promote.add_argument( + "position", nargs="?", choices=["top", "bottom", "before", "after"], default="bottom", + help="Where to insert in the active queue (default: bottom)", + ) + p_promote.add_argument( + "-t", "--target", default=None, + help="Required for before/after (issue ID or cluster name)", + ) + + def _add_reorder_subparser(plan_sub) -> None: p_move = plan_sub.add_parser( "reorder", @@ -48,5 +76,4 @@ def _add_reorder_subparser(plan_sub) -> None: help="Required for before/after (issue ID or cluster name) and up/down (integer offset)", ) - -__all__ = ["_add_queue_subparser", "_add_reorder_subparser"] +__all__ = ["_add_promote_subparser", "_add_queue_subparser", "_add_reorder_subparser"] diff --git a/desloppify/app/commands/next/render.py b/desloppify/app/commands/next/render.py index 9f32a49f..aeb3feef 100644 --- a/desloppify/app/commands/next/render.py +++ b/desloppify/app/commands/next/render.py @@ -10,6 +10,10 @@ compute_score_impact, get_dimension_for_detector, ) +from desloppify.engine._state.issue_semantics import ( + is_review_finding, + is_review_request, +) from desloppify.engine._work_queue.helpers import workflow_stage_name from .render_support import is_auto_fix_command @@ -188,10 +192,12 @@ def _render_score_impact( def _render_item_type(item: dict) -> None: - detector = item.get("detector") - if detector == "review": + if is_review_finding(item): print(colorize(" Type: Design review (requires judgment)", "dim")) return + if is_review_request(item): + print(colorize(" Type: Review request", "dim")) + return if is_auto_fix_command(item.get("primary_command")): print(colorize(" Type: Auto-fixable", "dim")) diff --git a/desloppify/app/commands/next/render_nudges.py b/desloppify/app/commands/next/render_nudges.py index c8da6fd5..6d510661 100644 --- a/desloppify/app/commands/next/render_nudges.py +++ b/desloppify/app/commands/next/render_nudges.py @@ -16,6 +16,7 @@ from desloppify.base.output.terminal import colorize, log from desloppify.base.output.user_message import print_user_message from desloppify.engine._scoring.results.core import compute_health_breakdown +from desloppify.engine._state.issue_semantics import is_review_request from desloppify.engine._work_queue.core import ATTEST_EXAMPLE from desloppify.intelligence.integrity import ( unassessed_subjective_dimensions, @@ -60,8 +61,7 @@ def render_single_item_resolution_hint(items: list[dict]) -> None: if kind != "issue": return item = items[0] - detector_name = item.get("detector", "") - if detector_name == "subjective_review": + if is_review_request(item): dim_key = (item.get("detail") or {}).get("dimension", "") primary = item.get("primary_command", "") if not primary: diff --git a/desloppify/app/commands/next/render_scoring.py b/desloppify/app/commands/next/render_scoring.py index 4e962e5f..9268084c 100644 --- a/desloppify/app/commands/next/render_scoring.py +++ b/desloppify/app/commands/next/render_scoring.py @@ -2,6 +2,8 @@ from __future__ import annotations +from desloppify.engine._state.issue_semantics import is_review_finding + def _normalized_dimension_key(value: str | None) -> str: return str(value or "").lower().replace(" ", "_") @@ -161,7 +163,7 @@ def render_score_impact( get_dimension_for_detector_fn=get_dimension_for_detector_fn, ) return - if detector == "review" and dim_scores: + if is_review_finding(item) and dim_scores: render_review_dimension_drag( item, dim_scores, @@ -198,7 +200,7 @@ def render_item_explain( f"Dimension: {dimension.name} at {ds['score']:.1f}% " f"({ds.get('failing', 0)} open issues)" ) - if item.get("detector") == "review" and dim_scores: + if is_review_finding(item) and dim_scores: entry = _review_dimension_score_entry(item, dim_scores) if entry is not None: ds_name, ds_data = entry diff --git a/desloppify/app/commands/next/render_support.py b/desloppify/app/commands/next/render_support.py index 80bd26e7..ccf49ef9 100644 --- a/desloppify/app/commands/next/render_support.py +++ b/desloppify/app/commands/next/render_support.py @@ -7,6 +7,7 @@ from desloppify.app.commands.helpers.queue_progress import format_plan_delta from desloppify.base.output.terminal import colorize +from desloppify.engine._state.issue_semantics import is_review_finding from desloppify.engine.work_queue import group_queue_items from desloppify.engine.planning.scorecard_projection import ( scorecard_subjective_entries, @@ -65,7 +66,7 @@ def is_auto_fix_command(command: str | None) -> bool: def effort_tag(item: dict) -> str: """Return a short effort/type tag for a queue item.""" - if item.get("detector") == "review": + if is_review_finding(item): return "[review]" if is_auto_fix_command(item.get("primary_command")): return "[auto]" diff --git a/desloppify/app/commands/plan/cmd.py b/desloppify/app/commands/plan/cmd.py index ec081d35..254c7977 100644 --- a/desloppify/app/commands/plan/cmd.py +++ b/desloppify/app/commands/plan/cmd.py @@ -29,6 +29,7 @@ from desloppify.app.commands.plan.queue_render import cmd_plan_queue from desloppify.app.commands.plan.repair_state import cmd_plan_repair_state from desloppify.app.commands.plan.reorder_handlers import cmd_plan_reorder +from desloppify.app.commands.plan.reorder_handlers import cmd_plan_promote from desloppify.app.commands.plan.shared.cluster_membership import cluster_issue_ids from desloppify.app.commands.plan.triage.command import cmd_plan_triage from desloppify.engine.plan_state import ( @@ -212,6 +213,7 @@ def _cmd_plan_reset(args: argparse.Namespace) -> None: "queue": cmd_plan_queue, "reset": _cmd_plan_reset, "reorder": cmd_plan_reorder, + "promote": cmd_plan_promote, "describe": cmd_plan_describe, "resolve": cmd_plan_resolve, "note": cmd_plan_note, diff --git a/desloppify/app/commands/plan/reorder_handlers.py b/desloppify/app/commands/plan/reorder_handlers.py index 7ab91ca6..591eba5c 100644 --- a/desloppify/app/commands/plan/reorder_handlers.py +++ b/desloppify/app/commands/plan/reorder_handlers.py @@ -17,6 +17,7 @@ append_log_entry, move_items, ) +from desloppify.engine._plan.promoted_ids import add_promoted_ids def resolve_target(plan: dict, target: str | None, position: str) -> str | None: @@ -81,4 +82,39 @@ def cmd_plan_reorder(args: argparse.Namespace) -> None: print(colorize(f" Moved {count} item(s) to {position}.", "green")) -__all__ = ["cmd_plan_reorder", "resolve_target"] +def cmd_plan_promote(args: argparse.Namespace) -> None: + """Promote backlog issues or cluster members into the active queue.""" + state = command_runtime(args).state + if not require_issue_inventory(state): + return + + patterns: list[str] = getattr(args, "patterns", []) + position: str = getattr(args, "position", "bottom") + target: str | None = getattr(args, "target", None) + + if position in ("before", "after") and target is None: + print(colorize(f" '{position}' requires --target (-t). Example: plan promote {position} -t ", "red")) + return + + plan = load_plan() + target = resolve_target(plan, target, position) + + issue_ids = resolve_ids_from_patterns(state, patterns, plan=plan) + if not issue_ids: + print(colorize(" No matching issues found.", "yellow")) + return + + count = move_items(plan, issue_ids, position, target=target) + add_promoted_ids(plan, issue_ids) + append_log_entry( + plan, + "promote", + issue_ids=issue_ids, + actor="user", + detail={"position": position, "target": target}, + ) + save_plan(plan) + print(colorize(f" Promoted {count} item(s) into the active queue.", "green")) + + +__all__ = ["cmd_plan_promote", "cmd_plan_reorder", "resolve_target"] diff --git a/desloppify/app/commands/plan/triage/confirmations/basic.py b/desloppify/app/commands/plan/triage/confirmations/basic.py index 9ac11fac..9781d1c2 100644 --- a/desloppify/app/commands/plan/triage/confirmations/basic.py +++ b/desloppify/app/commands/plan/triage/confirmations/basic.py @@ -205,7 +205,8 @@ def confirm_observe( by_dim, dim_names = observe_dimension_breakdown(si) - issue_count = obs.get("issue_count", len(si.open_issues)) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + issue_count = obs.get("issue_count", len(review_issues)) print(f" Your analysis covered {issue_count} issues across {len(by_dim)} dimensions:") for dim in dim_names: print(f" {dim}: {by_dim[dim]} issues") @@ -273,7 +274,8 @@ def confirm_reflect( print(colorize(" Stage: REFLECT — Form strategy & present to user", "bold")) print(colorize(" " + "─" * 50, "dim")) - recurring = resolved_services.detect_recurring_patterns(si.open_issues, si.resolved_issues) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + recurring = resolved_services.detect_recurring_patterns(review_issues, si.resolved_issues) if recurring: print(f" Your strategy identified {len(recurring)} recurring dimension(s):") for dim, info in sorted(recurring.items()): diff --git a/desloppify/app/commands/plan/triage/display/dashboard.py b/desloppify/app/commands/plan/triage/display/dashboard.py index 817f0d5d..e679e05d 100644 --- a/desloppify/app/commands/plan/triage/display/dashboard.py +++ b/desloppify/app/commands/plan/triage/display/dashboard.py @@ -182,12 +182,12 @@ def print_reflect_dashboard( resolved_services = services or default_triage_services() completed = getattr(si, "completed_clusters", []) resolved = getattr(si, "resolved_issues", {}) - open_issues = getattr(si, "open_issues", {}) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) _print_completed_clusters(completed) _print_resolved_issue_deltas(resolved) _print_recurring_or_first_triage( - recurring=resolved_services.detect_recurring_patterns(open_issues, resolved), + recurring=resolved_services.detect_recurring_patterns(review_issues, resolved), completed=completed, resolved=resolved, ) @@ -269,12 +269,13 @@ def cmd_triage_dashboard( print_dashboard_header(si, stages, meta, plan, snapshot=snapshot) print_action_guidance(stages, meta, si, plan, snapshot=snapshot) print_prior_stage_reports(stages) - print_issues_by_dimension(si.open_issues) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + print_issues_by_dimension(review_issues) if "observe" in stages and "reflect" not in stages: print_reflect_dashboard(si, plan, services=resolved_services) - print_progress(plan, si.open_issues) + print_progress(plan, review_issues) __all__ = [ diff --git a/desloppify/app/commands/plan/triage/display/layout.py b/desloppify/app/commands/plan/triage/display/layout.py index 8c71e983..a08ce2fe 100644 --- a/desloppify/app/commands/plan/triage/display/layout.py +++ b/desloppify/app/commands/plan/triage/display/layout.py @@ -56,9 +56,10 @@ def print_dashboard_header( snapshot: TriageSnapshot | None = None, ) -> None: """Print the header section: title, open issues count, stage progress, overall status.""" + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) print(colorize(" Cluster triage", "bold")) print(colorize(" " + "─" * 60, "dim")) - print(f" Open review issues: {len(si.open_issues)}") + print(f" Open review issues: {len(review_issues)}") print(colorize(" Goal: identify contradictions, resolve them, then group the coherent", "cyan")) print(colorize(" remainder into clusters by root cause with action steps and priorities.", "cyan")) print(colorize(" Preferred: staged runner workflow (Codex or Claude).", "cyan")) @@ -74,7 +75,7 @@ def print_dashboard_header( if new_since_last: print(colorize(f" New since last triage: {len(new_since_last)}", "yellow")) for fid in sorted(new_since_last): - issue = si.open_issues.get(fid, {}) + issue = review_issues.get(fid, {}) dim = "" detail = issue.get("detail") if isinstance(detail, dict): diff --git a/desloppify/app/commands/plan/triage/observe_batches.py b/desloppify/app/commands/plan/triage/observe_batches.py index 653423a1..8bec4e5b 100644 --- a/desloppify/app/commands/plan/triage/observe_batches.py +++ b/desloppify/app/commands/plan/triage/observe_batches.py @@ -10,8 +10,9 @@ def observe_dimension_breakdown(si: TriageInput) -> tuple[dict[str, int], list[str]]: """Count open triage issues by review dimension.""" + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) by_dim: dict[str, int] = defaultdict(int) - for issue in si.open_issues.values(): + for issue in review_issues.values(): detail = issue.get("detail", {}) if isinstance(issue.get("detail"), dict) else {} dim = detail.get("dimension", "unknown") by_dim[dim] += 1 @@ -24,9 +25,10 @@ def group_issues_into_observe_batches( max_batches: int = 5, ) -> list[tuple[list[str], dict[str, Issue]]]: """Group observe issues into dimension-balanced batches.""" + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) by_dim, dim_names = observe_dimension_breakdown(si) if len(dim_names) <= 1: - return [(dim_names, dict(si.open_issues))] + return [(dim_names, dict(review_issues))] num_batches = min(max_batches, len(dim_names)) batch_dims: list[list[str]] = [[] for _ in range(num_batches)] @@ -37,7 +39,7 @@ def group_issues_into_observe_batches( batch_counts[lightest] += by_dim[dim] dim_to_issues: dict[str, dict[str, Issue]] = defaultdict(dict) - for fid, issue in si.open_issues.items(): + for fid, issue in review_issues.items(): detail = issue.get("detail", {}) if isinstance(issue.get("detail"), dict) else {} dim = detail.get("dimension", "unknown") dim_to_issues[dim][fid] = issue diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py index 3771cb51..2e9d5862 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py @@ -211,7 +211,9 @@ def preflight_stage( reflect_report = str(stages.get("reflect", {}).get("report", "")) accounting_ok, _cited, missing_ids, duplicate_ids = validate_reflect_issue_accounting( report=reflect_report, - valid_ids=set(getattr(triage_input, "open_issues", {}).keys()), + valid_ids=set( + getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})).keys() + ), ) if not accounting_ok: reason_parts: list[str] = [] @@ -311,7 +313,9 @@ def repair_reflect_report_if_needed( """Retry reflect once with a targeted repair prompt when accounting is invalid.""" _cited, missing_ids, duplicate_ids = dependencies.analyze_reflect_issue_accounting( report=report, - valid_ids=set(getattr(triage_input, "open_issues", {}).keys()), + valid_ids=set( + getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})).keys() + ), ) if not missing_ids and not duplicate_ids: return report, None @@ -354,7 +358,9 @@ def repair_reflect_report_if_needed( _cited, missing_after, duplicates_after = dependencies.analyze_reflect_issue_accounting( report=repaired_report, - valid_ids=set(getattr(triage_input, "open_issues", {}).keys()), + valid_ids=set( + getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})).keys() + ), ) if missing_after or duplicates_after: return None, "reflect_repair_invalid" diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts.py b/desloppify/app/commands/plan/triage/runner/stage_prompts.py index 0586453d..14d5cbae 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts.py @@ -33,19 +33,21 @@ def _required_issue_hashes(triage_input: TriageInput) -> list[str]: """Return sorted short hashes for open review issues.""" - return sorted(issue_id.rsplit("::", 1)[-1] for issue_id in triage_input.open_issues) + review_issues = getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) + return sorted(issue_id.rsplit("::", 1)[-1] for issue_id in review_issues) def _compact_issue_summary(triage_input: TriageInput) -> str: """Return a compact issue summary for later triage stages.""" + review_issues = getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) by_dim: Counter[str] = Counter() - for issue in triage_input.open_issues.values(): + for issue in review_issues.values(): detail = issue.get("detail", {}) if isinstance(issue.get("detail"), dict) else {} by_dim[str(detail.get("dimension", "unknown"))] += 1 dims = ", ".join(f"{name} ({count})" for name, count in sorted(by_dim.items())) parts = [ "## Issue Summary", - f"Open review issues: {len(triage_input.open_issues)}", + f"Open review issues: {len(review_issues)}", ] if dims: parts.append(f"Open dimensions: {dims}") diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py index 14ce2954..2ba83505 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py @@ -134,7 +134,16 @@ def _reflect_instructions(mode: PromptMode = "self_record") -> str: 6. **Check recurring patterns** — compare current issues against resolved history. If the same dimension keeps producing issues, that's a root cause that needs addressing, not just another round of fixes. -7. **Account for every issue exactly once** — every open issue hash must appear in exactly one +7. **Consider mechanical backlog** — the backlog section shows auto-clusters + (pre-grouped detector findings) and unclustered items. For each auto-cluster: + - **promote**: name it in a `## Backlog Promotions` section. Prefer clusters with + `[autofix: ...]` hints because they are lower-risk. + - **leave**: say nothing. Silence means it stays in backlog. + - **supersede**: absorb the underlying work into a review cluster when the same files + or root cause already belong together. + For unclustered items: promote individually or group related ones into a manual cluster. + Mechanical items are NOT part of the Coverage Ledger — that ledger remains review-issues only. +8. **Account for every issue exactly once** — every open issue hash must appear in exactly one cluster line or one skip line. Do not drop hashes, and do not repeat a hash in multiple clusters or in both a cluster and a skip. @@ -150,6 +159,9 @@ def _reflect_instructions(mode: PromptMode = "self_record") -> str: Cluster "media-lightbox-hooks" (all in src/domains/media-lightbox/) Cluster "task-typing" (both touch src/types/database.ts) +## Backlog Promotions +- Promote auto/unused-imports (overlaps with the files in cluster "task-typing") + ## Skip Decisions Skip "false-positive-current-code" (false positive per observe) ``` @@ -203,9 +215,13 @@ def _organize_instructions(mode: PromptMode = "self_record") -> str: 3. Create clusters as specified in the blueprint: `desloppify plan cluster create --description "..."` 4. Add issues: `desloppify plan cluster add ` -5. Add steps that consolidate: one step per file or logical change, NOT one step per issue -6. Set `--effort` on each step individually (trivial/small/medium/large) -7. Set `--depends-on` when clusters touch overlapping files +5. Promote any mechanical backlog items that reflect explicitly selected: + - Auto-clusters: `desloppify plan promote auto/` + - Individual items: `desloppify plan promote ` + - With placement: `desloppify plan promote before -t ` +6. Add steps that consolidate: one step per file or logical change, NOT one step per issue +7. Set `--effort` on each step individually (trivial/small/medium/large) +8. Set `--depends-on` when clusters touch overlapping files """ tail = """\ When done, run: diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py index 8c6e5660..e54a0a8f 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py @@ -156,6 +156,9 @@ {cli_command} plan cluster update --depends-on {cli_command} plan cluster show {cli_command} plan cluster list --verbose +{cli_command} plan promote +{cli_command} plan promote top +{cli_command} plan promote before -t ``` ### Skip/dismiss @@ -169,6 +172,7 @@ ``` {cli_command} show --no-budget # full issue detail with suggestion {cli_command} show review --status open --no-budget # all open review issues +{cli_command} backlog --count 20 # inspect backlog-only detector work ``` ### Effort tags diff --git a/desloppify/app/commands/plan/triage/runner/stage_validation.py b/desloppify/app/commands/plan/triage/runner/stage_validation.py index 30c79391..488ef775 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_validation.py +++ b/desloppify/app/commands/plan/triage/runner/stage_validation.py @@ -87,7 +87,12 @@ def _validate_observe_stage( f"(need {min_citations}+). Reference specific issue " f"hashes to prove you read them." ) - valid_ids = set(triage_input.open_issues.keys()) if triage_input else set() + review_issues = ( + getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) + if triage_input + else {} + ) + valid_ids = set(review_issues.keys()) evidence = parse_observe_evidence(report, valid_ids) ev_failures = validate_observe_evidence(evidence, issue_count) blocking = [failure for failure in ev_failures if failure.blocking] @@ -343,12 +348,13 @@ def build_auto_attestation( triage_input: TriageInput, ) -> str: """Generate valid 80+ char attestation referencing real dimensions/cluster names.""" + review_issues = getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) if stage == "observe": _by_dim, dim_names = observe_dimension_breakdown(triage_input) top_dims = dim_names[:3] dims_str = ", ".join(top_dims) return ( - f"I have thoroughly analysed {len(triage_input.open_issues)} issues " + f"I have thoroughly analysed {len(review_issues)} issues " f"across dimensions including {dims_str}, identifying themes, " f"root causes, and contradictions across the codebase." ) @@ -358,7 +364,7 @@ def build_auto_attestation( top_dims = dim_names[:3] dims_str = ", ".join(top_dims) return ( - f"My strategy accounts for {len(triage_input.open_issues)} issues " + f"My strategy accounts for {len(review_issues)} issues " f"across dimensions including {dims_str}, comparing against " f"resolved history and forming priorities for execution." ) diff --git a/desloppify/app/commands/plan/triage/stages/helpers.py b/desloppify/app/commands/plan/triage/stages/helpers.py index 26d02f08..08dfcc78 100644 --- a/desloppify/app/commands/plan/triage/stages/helpers.py +++ b/desloppify/app/commands/plan/triage/stages/helpers.py @@ -3,6 +3,7 @@ from __future__ import annotations from desloppify.base.output.terminal import colorize +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine.plan_triage import TRIAGE_IDS from ..review_coverage import cluster_issue_ids, live_active_triage_issue_ids @@ -97,7 +98,7 @@ def unclustered_review_issues(plan: dict, state: dict | None = None) -> list[str review_ids = [ fid for fid, finding in state.get("issues", {}).items() if finding.get("status") == "open" - and finding.get("detector") in ("review", "concerns") + and is_triage_finding(finding) ] frozen_ids = (plan.get("epic_triage_meta", {}) or {}).get("active_triage_issue_ids") if isinstance(frozen_ids, list) and frozen_ids: diff --git a/desloppify/app/commands/plan/triage/stages/observe.py b/desloppify/app/commands/plan/triage/stages/observe.py index 88d74fe6..26362bbc 100644 --- a/desloppify/app/commands/plan/triage/stages/observe.py +++ b/desloppify/app/commands/plan/triage/stages/observe.py @@ -61,7 +61,8 @@ def cmd_stage_observe( return si = resolved_services.collect_triage_input(plan, state) - issue_count = len(si.open_issues) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + issue_count = len(review_issues) if issue_count == 0: cleared = record_observe_stage( stages, @@ -93,7 +94,7 @@ def cmd_stage_observe( validate_observe_evidence, ) - valid_ids = set(si.open_issues.keys()) + valid_ids = set(review_issues.keys()) cited = resolved_services.extract_issue_citations(report, valid_ids) evidence = parse_observe_evidence(report, valid_ids) evidence_failures = validate_observe_evidence(evidence, issue_count) diff --git a/desloppify/app/commands/plan/triage/stages/reflect.py b/desloppify/app/commands/plan/triage/stages/reflect.py index 865d902f..02b41157 100644 --- a/desloppify/app/commands/plan/triage/stages/reflect.py +++ b/desloppify/app/commands/plan/triage/stages/reflect.py @@ -46,7 +46,8 @@ def _validate_reflect_submission( ): return None - issue_count = len(triage_input.open_issues) + review_issues = getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) + issue_count = len(review_issues) if not validate_stage_report_length( report=report, issue_count=issue_count, @@ -55,7 +56,7 @@ def _validate_reflect_submission( return None recurring = services.detect_recurring_patterns( - triage_input.open_issues, + review_issues, triage_input.resolved_issues, ) recurring_dims = sorted(recurring.keys()) @@ -66,7 +67,7 @@ def _validate_reflect_submission( ): return None - valid_ids = set(triage_input.open_issues.keys()) + valid_ids = set(review_issues.keys()) # Exclude issues already auto-skipped by observe from reflect accounting meta = plan.get("epic_triage_meta", {}) diff --git a/desloppify/app/commands/plan/triage/stages/rendering.py b/desloppify/app/commands/plan/triage/stages/rendering.py index 53542eca..de644ad4 100644 --- a/desloppify/app/commands/plan/triage/stages/rendering.py +++ b/desloppify/app/commands/plan/triage/stages/rendering.py @@ -56,8 +56,9 @@ def _print_complete_summary(plan: dict, stages: dict) -> None: def _print_new_issues_since_last(si) -> None: print(colorize(f" {len(si.new_since_last)} new issue(s) since last triage:", "cyan")) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) for fid in sorted(si.new_since_last): - issue = si.open_issues.get(fid, {}) + issue = review_issues.get(fid, {}) print(f" * [{short_issue_id(fid)}] {issue.get('summary', '')}") print() diff --git a/desloppify/app/commands/plan/triage/validation/completion_policy.py b/desloppify/app/commands/plan/triage/validation/completion_policy.py index efbb49c3..7897e6b2 100644 --- a/desloppify/app/commands/plan/triage/validation/completion_policy.py +++ b/desloppify/app/commands/plan/triage/validation/completion_policy.py @@ -177,7 +177,8 @@ def _note_cites_new_issues_or_error(note: str, si) -> bool: new_ids = si.new_since_last if not new_ids: return True - valid_ids = set(si.open_issues.keys()) + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + valid_ids = set(review_issues.keys()) cited = extract_issue_citations(note, valid_ids) new_cited = cited & new_ids if new_cited: diff --git a/desloppify/app/commands/plan/triage/validation/stage_policy.py b/desloppify/app/commands/plan/triage/validation/stage_policy.py index 2a506c5c..d3176ee2 100644 --- a/desloppify/app/commands/plan/triage/validation/stage_policy.py +++ b/desloppify/app/commands/plan/triage/validation/stage_policy.py @@ -172,7 +172,8 @@ def auto_confirm_reflect_for_organize( runtime = runtime_factory(args) triage_input = resolved_deps.collect_triage_input_fn(plan, runtime.state) - valid_ids = set(triage_input.open_issues.keys()) + review_issues = getattr(triage_input, "review_issues", getattr(triage_input, "open_issues", {})) + valid_ids = set(review_issues.keys()) accounting_ok, cited_ids, missing_ids, duplicate_ids = validate_reflect_accounting( report=str(reflect_stage.get("report", "")), valid_ids=valid_ids, @@ -184,7 +185,7 @@ def auto_confirm_reflect_for_organize( reflect_stage["duplicate_issue_ids"] = duplicate_ids recurring = resolved_deps.detect_recurring_patterns_fn( - triage_input.open_issues, + review_issues, triage_input.resolved_issues, ) _by_dim, observe_dims = observe_dimension_breakdown(triage_input) diff --git a/desloppify/app/commands/plan/triage/workflow.py b/desloppify/app/commands/plan/triage/workflow.py index eedd478b..1d99046b 100644 --- a/desloppify/app/commands/plan/triage/workflow.py +++ b/desloppify/app/commands/plan/triage/workflow.py @@ -80,7 +80,8 @@ def _cmd_triage_start( return si = services.collect_triage_input(plan, state) - print(f" Open review issues: {len(si.open_issues)}") + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + print(f" Open review issues: {len(review_issues)}") print(colorize(" Begin with observe:", "dim")) print(colorize(f" {TRIAGE_CMD_OBSERVE}", "dim")) @@ -122,7 +123,8 @@ def _run_dry_run( existing_clusters = si.existing_clusters print(colorize(" Cluster triage - dry run", "bold")) print(colorize(" " + "─" * 60, "dim")) - print(f" Open review issues: {len(si.open_issues)}") + review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) + print(f" Open review issues: {len(review_issues)}") print(f" Existing clusters: {len(existing_clusters)}") print(f" New since last: {len(si.new_since_last)}") print(f" Resolved since last: {len(si.resolved_since_last)}") diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index 79fffa98..f9068b2d 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -39,6 +39,10 @@ TRIAGE_CMD_RUN_STAGES_CLAUDE, TRIAGE_CMD_RUN_STAGES_CODEX, ) +from desloppify.engine._state.issue_semantics import ( + is_review_request, + is_triage_finding, +) from desloppify.intelligence.review.importing.contracts_types import ( NormalizedReviewImportPayload, ) @@ -76,7 +80,7 @@ def _has_postflight_review_work(state: dict, *, policy) -> bool: if any( isinstance(issue, dict) and issue.get("status") == "open" - and issue.get("detector") in {"review", "concerns", "subjective_review"} + and (is_triage_finding(issue) or is_review_request(issue)) for issue in issues.values() ): return True diff --git a/desloppify/app/commands/scan/plan_reconcile.py b/desloppify/app/commands/scan/plan_reconcile.py index 653e140c..e21721dd 100644 --- a/desloppify/app/commands/scan/plan_reconcile.py +++ b/desloppify/app/commands/scan/plan_reconcile.py @@ -37,6 +37,10 @@ from desloppify.engine._work_queue.context import queue_context from desloppify.engine._work_queue.snapshot import coarse_phase_name from desloppify.engine.work_queue import build_deferred_disposition_item +from desloppify.engine._state.issue_semantics import ( + is_review_request, + is_triage_finding, +) logger = logging.getLogger(__name__) @@ -403,7 +407,7 @@ def _has_postflight_review_work( has_review_like_issue = any( isinstance(issue, dict) and issue.get("status") == "open" - and issue.get("detector") in {"review", "concerns", "subjective_review"} + and (is_triage_finding(issue) or is_review_request(issue)) for issue in issues.values() ) if has_review_like_issue: diff --git a/desloppify/app/commands/show/dimension_views.py b/desloppify/app/commands/show/dimension_views.py index 0fe58726..ea35430f 100644 --- a/desloppify/app/commands/show/dimension_views.py +++ b/desloppify/app/commands/show/dimension_views.py @@ -5,6 +5,7 @@ from desloppify.app.commands.helpers.query import write_query from desloppify.base.config import target_strict_score_from_config from desloppify.base.output.terminal import colorize +from desloppify.engine._state.issue_semantics import is_triage_finding from .render import show_subjective_followup from .scope import _detector_names_hint, _lookup_dimension_score, load_matches @@ -75,7 +76,7 @@ def _render_subjective_dimension( dim_reviews = [ issue for issue in (state.get("issues") or {}).values() - if issue.get("detector") == "review" + if is_triage_finding(issue) and issue.get("status") == "open" and lowered in str(issue.get("detail", {}).get("dimension", "")).lower().replace(" ", "_") diff --git a/desloppify/base/output/issues.py b/desloppify/base/output/issues.py index 2f4ddd86..1617f0cc 100644 --- a/desloppify/base/output/issues.py +++ b/desloppify/base/output/issues.py @@ -10,6 +10,7 @@ CONFIDENCE_WEIGHTS, HOLISTIC_MULTIPLIER, ) +from desloppify.engine._state.issue_semantics import is_triage_finding logger = logging.getLogger(__name__) @@ -155,7 +156,7 @@ def render_issue_detail( detail = issue.get("detail", {}) detector = issue.get("detector", "") is_holistic = detail.get("holistic", False) - is_review = detector in ("review", "concerns") + is_review = is_triage_finding(issue) # Derive dimension: from detail for review, from registry for mechanical. raw_dimension = detail.get("dimension", "") diff --git a/desloppify/engine/_plan/cluster_strategy.py b/desloppify/engine/_plan/cluster_strategy.py index 8517b75c..09a86e5c 100644 --- a/desloppify/engine/_plan/cluster_strategy.py +++ b/desloppify/engine/_plan/cluster_strategy.py @@ -4,6 +4,10 @@ from desloppify.base.registry import DetectorMeta from desloppify.engine._plan.constants import AUTO_PREFIX +from desloppify.engine._state.issue_semantics import ( + is_review_finding, + is_review_request, +) def grouping_key(issue: dict, meta: DetectorMeta | None) -> str | None: @@ -17,7 +21,7 @@ def grouping_key(issue: dict, meta: DetectorMeta | None) -> str | None: if meta is None: return f"detector::{detector}" - if detector in ("review", "subjective_review"): + if is_review_finding(issue) or is_review_request(issue): detail = issue.get("detail") or {} dimension = detail.get("dimension", "") if dimension: @@ -54,7 +58,7 @@ def generate_description( count = len(members) detector = members[0].get("detector", "") if members else "" - if detector in ("review", "subjective_review"): + if is_review_finding(members[0]) or is_review_request(members[0]): detail = (members[0].get("detail") or {}) if members else {} dimension = detail.get("dimension", detector) return f"Address {count} {dimension} review issues" diff --git a/desloppify/engine/_plan/policy/stale.py b/desloppify/engine/_plan/policy/stale.py index bda281e5..24867d4e 100644 --- a/desloppify/engine/_plan/policy/stale.py +++ b/desloppify/engine/_plan/policy/stale.py @@ -5,19 +5,17 @@ import hashlib from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine._state.schema import StateModel from desloppify.engine._work_queue.helpers import slugify from desloppify.engine.planning.scorecard_projection import all_subjective_entries -_REVIEW_DETECTORS = ("review", "concerns") - - def open_review_ids(state: StateModel) -> set[str]: """Return IDs of open review/concerns issues from state.""" return { fid for fid, f in state.get("issues", {}).items() - if f.get("status") == "open" and f.get("detector") in _REVIEW_DETECTORS + if f.get("status") == "open" and is_triage_finding(f) } diff --git a/desloppify/engine/_plan/policy/subjective.py b/desloppify/engine/_plan/policy/subjective.py index 39f18be8..27ea9ef6 100644 --- a/desloppify/engine/_plan/policy/subjective.py +++ b/desloppify/engine/_plan/policy/subjective.py @@ -12,12 +12,14 @@ from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE from desloppify.base.enums import Status from desloppify.base.registry import DETECTORS -from desloppify.engine._plan.schema import planned_objective_ids as _planned_objective_ids +from desloppify.engine._plan.schema import executable_objective_ids as _executable_objective_ids from desloppify.engine._state.filtering import issue_in_scan_scope +from desloppify.engine._state.issue_semantics import counts_toward_objective_backlog from desloppify.engine._state.schema import StateModel from desloppify.engine.planning.helpers import CONFIDENCE_ORDER -# Detectors whose issues are NOT objective mechanical work. +# Legacy export for modules that still need detector-name display behavior. +# Objective/non-objective semantics should flow through issue_kind helpers. NON_OBJECTIVE_DETECTORS: frozenset[str] = frozenset({ "review", "concerns", "subjective_review", "subjective_assessment", }) @@ -118,16 +120,16 @@ def compute_subjective_visibility( issue_id for issue_id, issue in issues.items() if issue.get("status") == Status.OPEN - and issue.get("detector") not in NON_OBJECTIVE_DETECTORS + and counts_toward_objective_backlog(issue) and not issue.get("suppressed") and not _is_evidence_only(issue) and issue_in_scan_scope(str(issue.get("file", "")), resolved_scan_path) and issue_id not in skipped_ids ] - # When the plan has tracked objectives (post-triage), only count - # planned items — unplanned items are backlog, not blocking work. - objective_count = len(_planned_objective_ids(set(objective_issue_ids), plan)) + # Only explicitly queued objectives count — backlog items don't block + # subjective reruns. + objective_count = len(_executable_objective_ids(set(objective_issue_ids), plan)) unscored = current_unscored_ids(state) stale = current_stale_ids(state) diff --git a/desloppify/engine/_plan/reconcile_review_import.py b/desloppify/engine/_plan/reconcile_review_import.py index e20d26a7..7fb126b8 100644 --- a/desloppify/engine/_plan/reconcile_review_import.py +++ b/desloppify/engine/_plan/reconcile_review_import.py @@ -11,6 +11,7 @@ compute_open_issue_ids, sync_triage_needed, ) +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine._state.schema import StateModel @@ -50,8 +51,14 @@ def _review_issue_ids_for_import_sync( return set(open_review_ids) if open_review_ids is not None else compute_open_issue_ids(state) -def _is_review_queue_id(issue_id: str) -> bool: - """Return True for queue IDs representing review/concerns issues.""" +def _is_review_queue_id(issue_id: str, state: StateModel) -> bool: + """Return True for queue IDs representing triage findings. + + Falls back to legacy ID prefixes only when the issue payload is absent. + """ + issue = state.get("issues", {}).get(issue_id) + if isinstance(issue, dict): + return is_triage_finding(issue) return issue_id.startswith("review::") or issue_id.startswith("concerns::") @@ -92,6 +99,7 @@ def _prune_stale_triage_meta( def _prune_stale_review_ids_from_plan( plan: PlanModel, + state: StateModel, *, live_open_review_ids: set[str], ) -> list[str]: @@ -106,7 +114,7 @@ def _prune_stale_review_ids_from_plan( { issue_id for issue_id in order - if _is_review_queue_id(issue_id) and issue_id not in live_open_review_ids + if _is_review_queue_id(issue_id, state) and issue_id not in live_open_review_ids } ) if not stale_ids: @@ -154,6 +162,7 @@ def sync_plan_after_review_import( open_review_ids = compute_open_issue_ids(state) stale_pruned_from_queue = _prune_stale_review_ids_from_plan( plan, + state, live_open_review_ids=open_review_ids, ) new_ids = _review_issue_ids_for_import_sync( diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 71121ccf..54b0738d 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -216,7 +216,7 @@ class PlanModel(TypedDict, total=False): overrides: dict[str, ItemOverride] clusters: dict[str, Cluster] superseded: dict[str, SupersededEntry] - promoted_ids: list[str] # IDs user explicitly positioned via move_items() + promoted_ids: list[str] # IDs explicitly promoted from backlog into the queue plan_start_scores: PlanStartScores previous_plan_start_scores: PlanStartScores refresh_state: RefreshState @@ -280,49 +280,73 @@ def triage_clusters(plan: dict[str, Any]) -> dict[str, Cluster]: } -def tracked_plan_ids(plan: dict[str, Any] | None) -> set[str]: - """Collect all issue IDs the plan is actively tracking. - - Includes queue_order, skipped, overrides, and cluster members/step refs. - Returns an empty set for None or non-dict plans. - """ +def _tracked_plan_ids(plan: dict[str, Any] | None) -> set[str]: + """Collect live issue IDs the plan is actively tracking.""" if not isinstance(plan, dict): return set() - tracked: set[str] = set(plan.get("queue_order", [])) - tracked.update(plan.get("skipped", {}).keys()) - tracked.update(plan.get("overrides", {}).keys()) + tracked: set[str] = { + str(issue_id) + for issue_id in plan.get("queue_order", []) + if isinstance(issue_id, str) and issue_id + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + } + tracked.update( + str(issue_id) + for issue_id in plan.get("skipped", {}).keys() + if isinstance(issue_id, str) and issue_id + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + ) + tracked.update( + str(issue_id) + for issue_id in plan.get("overrides", {}).keys() + if isinstance(issue_id, str) and issue_id + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + ) for cluster in plan.get("clusters", {}).values(): - tracked.update(cluster.get("issue_ids", [])) + if not isinstance(cluster, dict): + continue + tracked.update( + str(issue_id) + for issue_id in cluster.get("issue_ids", []) + if isinstance(issue_id, str) and issue_id + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + ) for step in cluster.get("action_steps", []): - if isinstance(step, dict): - tracked.update(step.get("issue_refs", [])) + if not isinstance(step, dict): + continue + tracked.update( + str(issue_id) + for issue_id in step.get("issue_refs", []) + if isinstance(issue_id, str) and issue_id + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + ) return tracked -def planned_objective_ids( +def executable_objective_ids( all_objective_ids: set[str], plan: dict[str, Any] | None, ) -> set[str]: - """Return the subset of objective IDs the plan considers active work. - - Pre-triage (plan tracks nothing): all objective IDs are treated as - planned work. + """Return objective IDs eligible for execution. - Once the plan tracks anything, only the intersection with live - objective IDs counts as planned. This lets stale queue_order entries - fail closed into postflight/backlog instead of broadening execution - back out to the entire objective backlog. + Before the plan tracks any live objective work, all objective IDs are + implicitly executable. Once the plan tracks objective IDs, execution + becomes backlog-first and only objective IDs explicitly present in + ``plan["queue_order"]`` remain eligible for ``next``. """ - tracked = tracked_plan_ids(plan) - skipped_ids = set(plan.get("skipped", {}).keys()) if isinstance(plan, dict) else set() - active_tracked = { + if not isinstance(plan, dict): + return set(all_objective_ids) + tracked_ids = _tracked_plan_ids(plan) + if not tracked_ids: + return set(all_objective_ids) + skipped_ids = set(plan.get("skipped", {}).keys()) + queued_ids = { issue_id - for issue_id in tracked - skipped_ids - if not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + for issue_id in plan.get("queue_order", []) + if issue_id not in skipped_ids + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) } - if not active_tracked: - return set(all_objective_ids) - return all_objective_ids & active_tracked + return all_objective_ids & queued_ids def validate_plan(plan: dict[str, Any]) -> None: @@ -374,8 +398,7 @@ def validate_plan(plan: dict[str, Any]) -> None: "VALID_SKIP_KINDS", "empty_plan", "ensure_plan_defaults", - "planned_objective_ids", - "tracked_plan_ids", + "executable_objective_ids", "triage_clusters", "validate_plan", ] diff --git a/desloppify/engine/_plan/triage/apply.py b/desloppify/engine/_plan/triage/apply.py index e8e0953f..893139c1 100644 --- a/desloppify/engine/_plan/triage/apply.py +++ b/desloppify/engine/_plan/triage/apply.py @@ -12,6 +12,7 @@ ensure_plan_defaults, ) from desloppify.engine._plan.skip_policy import skip_kind_state_status +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine._state.schema import StateModel, utc_now from .dismiss import dismiss_triage_issues @@ -171,7 +172,7 @@ def _set_triage_meta( fid for fid, issue in state.get("issues", {}).items() if issue.get("status") == "open" - and issue.get("detector") in ("review", "concerns") + and is_triage_finding(issue) ) plan["epic_triage_meta"] = { diff --git a/desloppify/engine/_plan/triage/core.py b/desloppify/engine/_plan/triage/core.py index a1d659d8..9a2caf76 100644 --- a/desloppify/engine/_plan/triage/core.py +++ b/desloppify/engine/_plan/triage/core.py @@ -117,11 +117,11 @@ def triage_epics( si = collect_triage_input(plan, state) prompt = build_triage_prompt(si) - valid_ids = set(si.open_issues.keys()) + valid_ids = set(si.review_issues.keys()) if dry_run or deps is None or deps.llm_call is None: result = TriageMutationResult(dry_run=True) - result.strategy_summary = f"[dry-run] Prompt built with {len(si.open_issues)} issues" + result.strategy_summary = f"[dry-run] Prompt built with {len(si.review_issues)} issues" return result try: diff --git a/desloppify/engine/_plan/triage/prompt.py b/desloppify/engine/_plan/triage/prompt.py index 29674b95..d32da59c 100644 --- a/desloppify/engine/_plan/triage/prompt.py +++ b/desloppify/engine/_plan/triage/prompt.py @@ -7,20 +7,23 @@ from desloppify.engine._plan.schema import ( Cluster, + EPIC_PREFIX, PlanModel, ensure_plan_defaults, triage_clusters, ) from desloppify.engine._plan.triage.snapshot import build_triage_snapshot +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine._state.schema import StateModel -@dataclass +@dataclass(init=False) class TriageInput: """All data needed to produce/update triage clusters.""" - open_issues: dict[str, dict] # id -> issue (review + concerns) - mechanical_issues: dict[str, dict] # id -> issue (non-review, for context) + review_issues: dict[str, dict] # id -> issue (review + concerns) + objective_backlog_issues: dict[str, dict] # id -> issue (non-review, for context) + auto_clusters: dict[str, dict] # auto/ clusters available for promotion existing_clusters: dict[str, Cluster] dimension_scores: dict[str, Any] # for context new_since_last: set[str] # issue IDs new since last triage @@ -30,6 +33,60 @@ class TriageInput: resolved_issues: dict[str, dict] # full issue objects for resolved IDs completed_clusters: list[dict] # clusters completed since last triage + def __init__( + self, + *, + review_issues: dict[str, dict] | None = None, + objective_backlog_issues: dict[str, dict] | None = None, + auto_clusters: dict[str, dict] | None = None, + existing_clusters: dict[str, Cluster], + dimension_scores: dict[str, Any], + new_since_last: set[str], + resolved_since_last: set[str], + previously_dismissed: list[str], + triage_version: int, + resolved_issues: dict[str, dict], + completed_clusters: list[dict], + open_issues: dict[str, dict] | None = None, + mechanical_issues: dict[str, dict] | None = None, + ) -> None: + if review_issues is not None and open_issues is not None: + raise TypeError("Pass either review_issues or open_issues, not both.") + if objective_backlog_issues is not None and mechanical_issues is not None: + raise TypeError( + "Pass either objective_backlog_issues or mechanical_issues, not both." + ) + + self.review_issues = ( + review_issues + if review_issues is not None + else (open_issues if open_issues is not None else {}) + ) + self.objective_backlog_issues = ( + objective_backlog_issues + if objective_backlog_issues is not None + else (mechanical_issues if mechanical_issues is not None else {}) + ) + self.auto_clusters = auto_clusters if auto_clusters is not None else {} + self.existing_clusters = existing_clusters + self.dimension_scores = dimension_scores + self.new_since_last = new_since_last + self.resolved_since_last = resolved_since_last + self.previously_dismissed = previously_dismissed + self.triage_version = triage_version + self.resolved_issues = resolved_issues + self.completed_clusters = completed_clusters + + @property + def open_issues(self) -> dict[str, dict]: + """Backward-compatible alias for older triage callsites.""" + return self.review_issues + + @property + def mechanical_issues(self) -> dict[str, dict]: + """Backward-compatible alias for older triage callsites.""" + return self.objective_backlog_issues + @dataclass class DismissedIssue: """A issue the LLM says doesn't make sense.""" @@ -71,11 +128,11 @@ def _issue_dimension(issue: dict) -> str: def _recurring_dimensions( - open_issues: dict[str, dict], + review_issues: dict[str, dict], resolved_issues: dict[str, dict], ) -> dict[str, dict[str, list[str]]]: open_by_dim: dict[str, list[str]] = {} - for issue_id, issue in open_issues.items(): + for issue_id, issue in review_issues.items(): dimension = _issue_dimension(issue) if dimension: open_by_dim.setdefault(dimension, []).append(issue_id) @@ -103,7 +160,7 @@ def _split_open_issue_buckets( for issue_id, issue in issues.items(): if issue.get("status") != "open": continue - if issue.get("detector") in ("review", "concerns"): + if is_triage_finding(issue): open_review[issue_id] = issue continue open_mechanical[issue_id] = issue @@ -127,6 +184,11 @@ def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: issues = state.get("issues", {}) meta = plan.get("epic_triage_meta", {}) epics = triage_clusters(plan) + auto_clusters = { + name: cluster + for name, cluster in plan.get("clusters", {}).items() + if cluster.get("auto") and not name.startswith(EPIC_PREFIX) + } open_review, open_mechanical = _split_open_issue_buckets(issues) snapshot = build_triage_snapshot(plan, state) @@ -143,8 +205,9 @@ def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: } return TriageInput( - open_issues=open_review, - mechanical_issues=open_mechanical, + review_issues=open_review, + objective_backlog_issues=open_mechanical, + auto_clusters=auto_clusters, existing_clusters=dict(epics), dimension_scores=state.get("dimension_scores", {}), new_since_last=new_since, @@ -157,7 +220,8 @@ def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: _TRIAGE_SYSTEM_PROMPT = """\ You are maintaining the meta-plan for this codebase. Produce a coherent -prioritized strategy for all open review issues. +prioritized strategy for all open review issues, and decide which mechanical +backlog items should be promoted into the active queue now. Your plan should: - Cluster issues by ROOT CAUSE, not by dimension or detector @@ -171,8 +235,9 @@ def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: Available directions for clusters: delete, merge, flatten, enforce, simplify, decompose, extract, inline. Available plan tools (the agent executing your plan has access to these): -- `desloppify plan queue` — view the execution queue in priority order +- `desloppify plan queue` — view the explicit execution queue in priority order - `desloppify backlog` — inspect broader open work outside the execution queue +- `desloppify plan promote ` — move backlog work into the active queue - `desloppify plan focus ` — focus the queue on one cluster - `desloppify plan skip --permanent --note "why" --attest "..."` — permanently dismiss - `desloppify plan skip --note "revisit later"` — temporarily defer @@ -182,9 +247,10 @@ def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: - `desloppify scan` — re-scan after making changes to verify progress - `desloppify show review --status open` — see all open review issues -Your output defines the ENTIRE work plan. Issues not assigned to any cluster -will remain in the queue as individual items. Dismissed issues will be -removed from the queue with your stated reason. +Your output defines the active work plan for review findings and any explicitly +promoted backlog work. Mechanical backlog items you do not mention remain in +backlog by default. Dismissed issues will be removed from the queue with your +stated reason. Respond with a single JSON object matching this schema: { @@ -302,10 +368,10 @@ def _append_completed_clusters_section(parts: list[str], completed_clusters: lis def _append_recurring_dimensions_section( parts: list[str], - open_issues: dict[str, dict], + review_issues: dict[str, dict], resolved_issues: dict[str, dict], ) -> None: - recurring = _recurring_dimensions(open_issues, resolved_issues) + recurring = _recurring_dimensions(review_issues, resolved_issues) if not recurring: return parts.append( @@ -320,9 +386,9 @@ def _append_recurring_dimensions_section( parts.append("") -def _append_open_review_issues_section(parts: list[str], open_issues: dict[str, dict]) -> None: - parts.append(f"## All open review issues ({len(open_issues)})") - for issue_id, issue in sorted(open_issues.items()): +def _append_open_review_issues_section(parts: list[str], review_issues: dict[str, dict]) -> None: + parts.append(f"## All open review issues ({len(review_issues)})") + for issue_id, issue in sorted(review_issues.items()): detail = issue.get("detail", {}) if isinstance(issue.get("detail"), dict) else {} suggestion = detail.get("suggestion", "") dimension = detail.get("dimension", "") @@ -353,6 +419,133 @@ def _append_dimension_scores_section(parts: list[str], dimension_scores: dict[st parts.append("") +def _append_mechanical_backlog_section( + parts: list[str], + objective_backlog_issues: dict[str, dict], + auto_clusters: dict[str, dict], +) -> None: + if not objective_backlog_issues: + return + + clustered_ids: set[str] = set() + for cluster in auto_clusters.values(): + issue_ids = cluster.get("issue_ids", []) + if isinstance(issue_ids, list): + clustered_ids.update( + issue_id + for issue_id in issue_ids + if isinstance(issue_id, str) and issue_id in objective_backlog_issues + ) + + unclustered = { + issue_id: issue + for issue_id, issue in objective_backlog_issues.items() + if issue_id not in clustered_ids + } + clustered_issue_count = len(clustered_ids) + auto_cluster_count = sum( + 1 for cluster in auto_clusters.values() + if any( + isinstance(issue_id, str) and issue_id in objective_backlog_issues + for issue_id in cluster.get("issue_ids", []) + ) + ) + + parts.append( + "## Mechanical backlog " + f"({len(objective_backlog_issues)} items: {clustered_issue_count} in " + f"{auto_cluster_count} auto-clusters, {len(unclustered)} unclustered)" + ) + parts.append( + "These detector-created items stay in backlog unless you explicitly promote them into the active queue." + ) + parts.append("Silence means leave the item or cluster in backlog.") + + rendered_clusters: list[tuple[str, dict, int]] = [] + for name, cluster in auto_clusters.items(): + raw_issue_ids = cluster.get("issue_ids", []) + if not isinstance(raw_issue_ids, list): + continue + member_count = sum( + 1 for issue_id in raw_issue_ids + if isinstance(issue_id, str) and issue_id in objective_backlog_issues + ) + if member_count <= 0: + continue + rendered_clusters.append((name, cluster, member_count)) + + if rendered_clusters: + parts.append("### Auto-clusters") + parts.append( + "These are pre-grouped detector findings. Promote whole clusters with " + "`desloppify plan promote auto/`." + ) + rendered_clusters.sort(key=lambda item: (-item[2], item[0])) + visible_clusters = rendered_clusters[:15] + for name, cluster, member_count in visible_clusters: + autofix_hint = _cluster_autofix_hint(cluster) + hint_suffix = f" [autofix: {autofix_hint}]" if autofix_hint else "" + summary = _cluster_backlog_summary(name, cluster, member_count) + parts.append(f"- {name} ({member_count} items){hint_suffix}") + parts.append(f" {summary}") + if len(rendered_clusters) > len(visible_clusters): + remaining = rendered_clusters[len(visible_clusters):] + remaining_issues = sum(item[2] for item in remaining) + parts.append( + f"- ... and {len(remaining)} more clusters ({remaining_issues} issues)" + ) + + if unclustered: + parts.append( + f"### Unclustered items ({len(unclustered)} items — needs human judgment or isolated findings)" + ) + parts.append( + "Promote individually with `desloppify plan promote `, or group related items into a manual cluster." + ) + sample_ids = sorted( + unclustered, + key=lambda issue_id: ( + _confidence_sort_key(unclustered[issue_id]), + issue_id, + ), + )[:10] + for issue_id in sample_ids: + issue = unclustered[issue_id] + confidence = str(issue.get("confidence", "medium")) + summary = str(issue.get("summary", "(no summary)")) + parts.append(f"- [{confidence}] {issue_id} — {summary}") + if len(unclustered) > len(sample_ids): + parts.append( + f"- ... and {len(unclustered) - len(sample_ids)} more unclustered items" + ) + + parts.append("Browse full backlog: `desloppify backlog`") + parts.append("Inspect a cluster: `desloppify plan cluster show auto/`") + parts.append("Inspect an issue: `desloppify show `") + parts.append("") + + +def _cluster_autofix_hint(cluster: dict[str, Any]) -> str: + action = str(cluster.get("action", "")) + return action if "desloppify autofix" in action else "" + + +def _cluster_backlog_summary(name: str, cluster: dict[str, Any], member_count: int) -> str: + description = str(cluster.get("description") or "").strip() + if description: + return description + title = name.removeprefix("auto/").replace("-", " ") + if title: + return f"Address {member_count} {title} findings" + return f"Address {member_count} detector findings" + + +def _confidence_sort_key(issue: dict[str, Any]) -> int: + confidence = str(issue.get("confidence", "medium")).lower() + order = {"high": 0, "medium": 1, "low": 2} + return order.get(confidence, 1) + + def _append_previously_dismissed_section(parts: list[str], dismissed_ids: list[str]) -> None: if not dismissed_ids: return @@ -371,7 +564,7 @@ def build_triage_prompt(si: TriageInput) -> str: parts, title="New issues since last triage", issue_ids=si.new_since_last, - issues=si.open_issues, + issues=si.review_issues, ) _append_changed_issue_section( parts, @@ -380,9 +573,14 @@ def build_triage_prompt(si: TriageInput) -> str: ) _append_resolved_issue_context(parts, si.resolved_issues) _append_completed_clusters_section(parts, si.completed_clusters) - _append_recurring_dimensions_section(parts, si.open_issues, si.resolved_issues) - _append_open_review_issues_section(parts, si.open_issues) + _append_recurring_dimensions_section(parts, si.review_issues, si.resolved_issues) + _append_open_review_issues_section(parts, si.review_issues) _append_dimension_scores_section(parts, si.dimension_scores) + _append_mechanical_backlog_section( + parts, + si.objective_backlog_issues, + si.auto_clusters, + ) _append_previously_dismissed_section(parts, si.previously_dismissed) return "\n".join(parts) diff --git a/desloppify/engine/_scoring/detection.py b/desloppify/engine/_scoring/detection.py index c18dfd45..a1249292 100644 --- a/desloppify/engine/_scoring/detection.py +++ b/desloppify/engine/_scoring/detection.py @@ -14,6 +14,7 @@ ScoreMode, detector_policy, ) +from desloppify.engine._state.issue_semantics import is_scoring_excluded_detector from desloppify.engine._state.schema import Issue # Tiered file-count cap thresholds for non-LOC file-based detectors. @@ -141,10 +142,9 @@ def detector_stats_by_mode( if potential <= 0: return {mode: (1.0, 0, 0.0) for mode in SCORING_MODES} - # Review and concern issues are scored via subjective assessments only — - # exclude them from the detection-side scoring pipeline so resolving these - # issues never changes the score directly. - if detector in ("review", "concerns"): + # Some detectors remain queue-visible but are intentionally excluded from + # detector-side scoring. + if is_scoring_excluded_detector(detector): return {mode: (1.0, 0, 0.0) for mode in SCORING_MODES} policy = detector_policy(detector) diff --git a/desloppify/engine/_scoring/policy/core.py b/desloppify/engine/_scoring/policy/core.py index 3e415b6a..cdc17180 100644 --- a/desloppify/engine/_scoring/policy/core.py +++ b/desloppify/engine/_scoring/policy/core.py @@ -11,6 +11,7 @@ CONFIDENCE_WEIGHTS, HOLISTIC_MULTIPLIER, ) +from desloppify.engine._state.issue_semantics import is_scoring_excluded_detector from desloppify.engine.policy.zones import EXCLUDED_ZONE_VALUES ScoreMode = Literal["lenient", "strict", "verified_strict"] @@ -38,20 +39,6 @@ class DetectorScoringPolicy: SECURITY_EXCLUDED_ZONES = frozenset({"test", "config", "generated", "vendor"}) _DEFAULT_EXCLUDED_ZONES = frozenset(EXCLUDED_ZONE_VALUES) -# Non-objective detectors are tracked in state/queue but excluded from -# mechanical dimension scoring. -_NON_OBJECTIVE_DETECTORS = frozenset( - { - "concerns", - "review", - "subjective_review", - "uncalled_functions", - "unused_enums", - "signature", - "stale_wontfix", - } -) - # Keep policy details that are independent of tier/dimension wiring. _FILE_BASED_POLICY_DETECTORS = frozenset( {"smells", "dict_keys", "test_coverage", "security", "concerns", "review"} @@ -66,7 +53,7 @@ def _build_builtin_detector_scoring_policies() -> dict[str, DetectorScoringPolic """Build baseline scoring policies from DetectorMeta plus policy overrides.""" policies: dict[str, DetectorScoringPolicy] = {} for detector, meta in DETECTORS.items(): - if detector in _NON_OBJECTIVE_DETECTORS: + if is_scoring_excluded_detector(detector): dimension: str | None = None tier: int | None = None else: diff --git a/desloppify/engine/_scoring/subjective/core.py b/desloppify/engine/_scoring/subjective/core.py index f0b5e824..87aae68f 100644 --- a/desloppify/engine/_scoring/subjective/core.py +++ b/desloppify/engine/_scoring/subjective/core.py @@ -6,6 +6,7 @@ from desloppify.base.subjective_dimensions import default_dimension_keys from desloppify.base.text_utils import is_numeric from desloppify.engine._scoring.policy.core import SUBJECTIVE_CHECKS +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.intelligence.review.dimensions.metadata import ( dimension_display_name as metadata_dimension_display_name, ) @@ -174,7 +175,7 @@ def _subjective_issue_count( return sum( 1 for issue in issues.values() - if issue.get("detector") in ("review", "concerns") + if is_triage_finding(issue) and issue.get("status") in failure_set and _normalize_dimension_key(issue.get("detail", {}).get("dimension")) == dim_name ) diff --git a/desloppify/engine/_state/filtering.py b/desloppify/engine/_state/filtering.py index 6cc626c2..72866626 100644 --- a/desloppify/engine/_state/filtering.py +++ b/desloppify/engine/_state/filtering.py @@ -17,6 +17,7 @@ ] from desloppify.base.discovery.file_paths import rel +from desloppify.engine._state.issue_semantics import ensure_issue_semantics from desloppify.engine._state.schema import ( Issue, StateModel, @@ -159,7 +160,7 @@ def make_issue( rfile = rel(file) issue_id = f"{detector}::{rfile}::{name}" if name else f"{detector}::{rfile}" now = utc_now() - return { + issue: Issue = { "id": issue_id, "detector": detector, "file": rfile, @@ -174,6 +175,8 @@ def make_issue( "resolved_at": None, "reopen_count": 0, } + ensure_issue_semantics(issue) + return issue _HEX8_RE = re.compile(r'^[0-9a-f]{8}$') diff --git a/desloppify/engine/_state/issue_semantics.py b/desloppify/engine/_state/issue_semantics.py new file mode 100644 index 00000000..5cceaa50 --- /dev/null +++ b/desloppify/engine/_state/issue_semantics.py @@ -0,0 +1,184 @@ +"""Canonical issue taxonomy and semantic helpers. + +This module owns the semantic meaning of persisted issues. Callers should use +these helpers instead of branching on detector strings or ID prefixes. +""" + +from __future__ import annotations + +from typing import Any, Mapping, TypeAlias + +IssueKind: TypeAlias = str +IssueOrigin: TypeAlias = str + +MECHANICAL_FINDING = "mechanical_finding" +REVIEW_FINDING = "review_finding" +CONCERN_FINDING = "concern_finding" +REVIEW_REQUEST = "review_request" + +SCAN_ORIGIN = "scan" +REVIEW_IMPORT_ORIGIN = "review_import" +SYNTHETIC_REQUEST_ORIGIN = "synthetic_request" + +ISSUE_KINDS: frozenset[str] = frozenset( + { + MECHANICAL_FINDING, + REVIEW_FINDING, + CONCERN_FINDING, + REVIEW_REQUEST, + } +) +ISSUE_ORIGINS: frozenset[str] = frozenset( + { + SCAN_ORIGIN, + REVIEW_IMPORT_ORIGIN, + SYNTHETIC_REQUEST_ORIGIN, + } +) + +# Mechanical detectors that remain actionable work but stay excluded from +# detector-side scoring rules. +SCORING_EXCLUDED_DETECTORS: frozenset[str] = frozenset( + { + "concerns", + "review", + "subjective_review", + "uncalled_functions", + "unused_enums", + "signature", + "stale_wontfix", + } +) + + +def infer_issue_kind( + detector: object, + *, + detail: Mapping[str, Any] | None = None, +) -> IssueKind: + """Infer a persisted issue kind from legacy detector/detail fields.""" + detector_name = str(detector or "").strip() + detail_dict = detail if isinstance(detail, Mapping) else {} + + if detector_name == "review": + return REVIEW_FINDING + if detector_name == "concerns": + return CONCERN_FINDING + if detector_name in {"subjective_review", "subjective_assessment", "holistic_review"}: + return REVIEW_REQUEST + # Legacy imported confirmed concerns sometimes carried review-like detail; + # keep explicit concern markers mapped to concern findings. + if str(detail_dict.get("concern_verdict", "")).strip().lower() == "confirmed": + return CONCERN_FINDING + return MECHANICAL_FINDING + + +def infer_issue_origin( + detector: object, + *, + detail: Mapping[str, Any] | None = None, +) -> IssueOrigin: + """Infer provenance for a persisted issue.""" + detector_name = str(detector or "").strip() + detail_dict = detail if isinstance(detail, Mapping) else {} + + if detector_name == "review": + return REVIEW_IMPORT_ORIGIN + if detector_name == "concerns": + verdict = str(detail_dict.get("concern_verdict", "")).strip().lower() + return REVIEW_IMPORT_ORIGIN if verdict == "confirmed" else SCAN_ORIGIN + if detector_name in {"subjective_review", "subjective_assessment", "holistic_review"}: + return SYNTHETIC_REQUEST_ORIGIN + return SCAN_ORIGIN + + +def normalized_issue_kind(issue: Mapping[str, Any]) -> IssueKind: + """Return the canonical issue kind, inferring from legacy data when needed.""" + raw_kind = str(issue.get("issue_kind", "")).strip() + if raw_kind in ISSUE_KINDS: + return raw_kind + return infer_issue_kind(issue.get("detector", ""), detail=_detail_dict(issue)) + + +def normalized_issue_origin(issue: Mapping[str, Any]) -> IssueOrigin: + """Return the canonical issue origin, inferring from legacy data when needed.""" + raw_origin = str(issue.get("origin", "")).strip() + if raw_origin in ISSUE_ORIGINS: + return raw_origin + return infer_issue_origin(issue.get("detector", ""), detail=_detail_dict(issue)) + + +def ensure_issue_semantics(issue: dict[str, Any]) -> None: + """Populate canonical semantic fields in-place.""" + issue["issue_kind"] = normalized_issue_kind(issue) + issue["origin"] = normalized_issue_origin(issue) + + +def is_objective_finding(issue: Mapping[str, Any]) -> bool: + return normalized_issue_kind(issue) == MECHANICAL_FINDING + + +def is_triage_finding(issue: Mapping[str, Any]) -> bool: + return normalized_issue_kind(issue) in {REVIEW_FINDING, CONCERN_FINDING} + + +def is_review_finding(issue: Mapping[str, Any]) -> bool: + return normalized_issue_kind(issue) == REVIEW_FINDING + + +def is_concern_finding(issue: Mapping[str, Any]) -> bool: + return normalized_issue_kind(issue) == CONCERN_FINDING + + +def is_review_request(issue: Mapping[str, Any]) -> bool: + return normalized_issue_kind(issue) == REVIEW_REQUEST + + +def is_non_objective_issue(issue: Mapping[str, Any]) -> bool: + return not is_objective_finding(issue) + + +def counts_toward_objective_backlog(issue: Mapping[str, Any]) -> bool: + return is_objective_finding(issue) + + +def is_import_only_issue(issue: Mapping[str, Any]) -> bool: + return normalized_issue_origin(issue) == REVIEW_IMPORT_ORIGIN + + +def is_scoring_excluded_detector(detector: object) -> bool: + detector_name = str(detector or "").strip() + return detector_name in SCORING_EXCLUDED_DETECTORS + + +def _detail_dict(issue: Mapping[str, Any]) -> Mapping[str, Any]: + detail = issue.get("detail", {}) + return detail if isinstance(detail, Mapping) else {} + + +__all__ = [ + "CONCERN_FINDING", + "ISSUE_KINDS", + "ISSUE_ORIGINS", + "MECHANICAL_FINDING", + "REVIEW_FINDING", + "REVIEW_IMPORT_ORIGIN", + "REVIEW_REQUEST", + "SCAN_ORIGIN", + "SCORING_EXCLUDED_DETECTORS", + "SYNTHETIC_REQUEST_ORIGIN", + "counts_toward_objective_backlog", + "ensure_issue_semantics", + "infer_issue_kind", + "infer_issue_origin", + "is_concern_finding", + "is_import_only_issue", + "is_non_objective_issue", + "is_objective_finding", + "is_review_finding", + "is_review_request", + "is_scoring_excluded_detector", + "is_triage_finding", + "normalized_issue_kind", + "normalized_issue_origin", +] diff --git a/desloppify/engine/_state/merge_issues.py b/desloppify/engine/_state/merge_issues.py index 61c1acc8..5459250c 100644 --- a/desloppify/engine/_state/merge_issues.py +++ b/desloppify/engine/_state/merge_issues.py @@ -4,6 +4,10 @@ from desloppify.base.discovery.file_paths import matches_exclusion from desloppify.engine._state.filtering import matched_ignore_pattern +from desloppify.engine._state.issue_semantics import ( + is_import_only_issue, + is_review_request, +) def find_suspect_detectors( @@ -25,14 +29,14 @@ def find_suspect_detectors( previous_open_by_detector.get(detector, 0) + 1 ) - # 'review' issues enter via `desloppify review --import`, not via scan phases. - # They are always suspect so the scan never auto-resolves them — regardless - # of current issue status (open, wontfix, etc.). - import_only_detectors = {"review"} - suspect: set[str] = set(import_only_detectors) + suspect: set[str] = { + str(issue.get("detector", "unknown")) + for issue in existing.values() + if isinstance(issue, dict) and is_import_only_issue(issue) + } for detector, previous_count in previous_open_by_detector.items(): - if detector in import_only_detectors: + if detector in suspect: continue if current_by_detector.get(detector, 0) > 0: continue @@ -213,11 +217,11 @@ def upsert_issues( previous["suppression_pattern"] = None if previous["status"] in ("fixed", "auto_resolved", "false_positive"): - # subjective_review issues are condition-based. When just + # Review-request issues are condition-based. When just # completed by an agent import, skip reopening to avoid a # resolve-then-reopen loop on the same scan cycle. if ( - detector == "subjective_review" + is_review_request(previous) and previous["status"] in {"fixed", "auto_resolved"} and (previous.get("resolution_attestation") or {}).get("kind") == "agent_import" ): diff --git a/desloppify/engine/_state/recovery.py b/desloppify/engine/_state/recovery.py index 6373de70..64dc9f16 100644 --- a/desloppify/engine/_state/recovery.py +++ b/desloppify/engine/_state/recovery.py @@ -2,6 +2,7 @@ from __future__ import annotations +from desloppify.engine._state.issue_semantics import ensure_issue_semantics from desloppify.engine._state.schema import ensure_state_defaults, scan_source @@ -114,6 +115,7 @@ def _hydrate_saved_issue_ids( "recovered_from_plan": True, }, } + ensure_issue_semantics(recovered_issues[issue_id]) recovered["issues"] = recovered_issues recovered["scan_metadata"] = { diff --git a/desloppify/engine/_state/resolution.py b/desloppify/engine/_state/resolution.py index af13f3e2..bb19d54c 100644 --- a/desloppify/engine/_state/resolution.py +++ b/desloppify/engine/_state/resolution.py @@ -12,6 +12,7 @@ from desloppify.base.text_utils import is_numeric from desloppify.engine._state.filtering import _matches_pattern +from desloppify.engine._state.issue_semantics import is_review_finding from desloppify.engine._state.schema import ( StateModel, ensure_state_defaults, @@ -72,7 +73,7 @@ def _mark_stale_assessments_on_review_resolve( touched_dimensions: set[str] = set() for issue in resolved_issues: - if issue.get("detector") != "review": + if not is_review_finding(issue): continue dimension = str(issue.get("detail", {}).get("dimension", "")).strip() if dimension: diff --git a/desloppify/engine/_state/schema.py b/desloppify/engine/_state/schema.py index c31b4934..27306811 100644 --- a/desloppify/engine/_state/schema.py +++ b/desloppify/engine/_state/schema.py @@ -8,6 +8,11 @@ from desloppify.base.discovery.paths import get_project_root from desloppify.base.enums import Status, canonical_issue_status, issue_status_tokens +from desloppify.engine._state.issue_semantics import ( + ISSUE_KINDS, + ISSUE_ORIGINS, + ensure_issue_semantics, +) from desloppify.engine._state.schema_scores import ( json_default, ) @@ -85,7 +90,7 @@ def get_state_file() -> Path: return get_state_dir() / "state.json" -CURRENT_VERSION = 1 +CURRENT_VERSION = 2 def utc_now() -> str: @@ -175,6 +180,11 @@ def ensure_state_defaults(state: StateModel | dict) -> None: mutable_state = cast(dict[str, Any], state) for key, value in empty_state().items(): mutable_state.setdefault(key, value) + version = mutable_state.get("version") + if not isinstance(version, int): + mutable_state["version"] = CURRENT_VERSION + elif version < CURRENT_VERSION: + mutable_state["version"] = CURRENT_VERSION if not isinstance(state.get("issues"), dict): state["issues"] = {} @@ -199,6 +209,7 @@ def ensure_state_defaults(state: StateModel | dict) -> None: issue.setdefault("id", issue_id) issue.setdefault("detector", "unknown") + ensure_issue_semantics(issue) issue.setdefault("file", "") issue.setdefault("tier", 3) issue.setdefault("confidence", "low") @@ -259,6 +270,16 @@ def validate_state_invariants(state: StateModel) -> None: raise ValueError(f"issue {issue_id!r} must be a dict") if issue.get("id") != issue_id: raise ValueError(f"issue id mismatch for {issue_id!r}") + issue_kind = issue.get("issue_kind") + if issue_kind not in ISSUE_KINDS: + raise ValueError( + f"issue {issue_id!r} has invalid issue_kind {issue_kind!r}" + ) + origin = issue.get("origin") + if origin not in ISSUE_ORIGINS: + raise ValueError( + f"issue {issue_id!r} has invalid origin {origin!r}" + ) if issue.get("status") not in _ALLOWED_ISSUE_STATUSES: raise ValueError( f"issue {issue_id!r} has invalid status {issue.get('status')!r}" diff --git a/desloppify/engine/_state/schema_types_issues.py b/desloppify/engine/_state/schema_types_issues.py index dfb06654..5d03d2bb 100644 --- a/desloppify/engine/_state/schema_types_issues.py +++ b/desloppify/engine/_state/schema_types_issues.py @@ -12,6 +12,8 @@ class Issue(TypedDict): id: str detector: str + issue_kind: str + origin: str file: str tier: int confidence: str diff --git a/desloppify/engine/_work_queue/helpers.py b/desloppify/engine/_work_queue/helpers.py index 6d180257..a8863e85 100644 --- a/desloppify/engine/_work_queue/helpers.py +++ b/desloppify/engine/_work_queue/helpers.py @@ -8,6 +8,10 @@ from desloppify.base.enums import issue_status_tokens from desloppify.base.registry import DETECTORS +from desloppify.engine._state.issue_semantics import ( + is_review_finding, + is_review_request, +) from desloppify.engine._state.schema import StateModel from desloppify.engine._work_queue.types import WorkQueueItem @@ -30,12 +34,11 @@ def status_matches(item_status: str, status_filter: str) -> bool: def is_subjective_issue(item: WorkQueueItem | dict[str, Any]) -> bool: - detector = item.get("detector") - return detector in {"subjective_assessment", "holistic_review", "subjective_review"} + return is_review_request(item) def is_review_issue(item: WorkQueueItem | dict[str, Any]) -> bool: - return item.get("detector") == "review" + return is_review_finding(item) def is_subjective_queue_item(item: WorkQueueItem | dict[str, Any]) -> bool: @@ -158,7 +161,7 @@ def primary_command_for_issue( ] if available_fixers: return f"desloppify autofix {available_fixers[0]} --dry-run" - if detector == "subjective_review": + if is_review_request(item): dim_key = (item.get("detail") or {}).get("dimension", "") if dim_key: return f"desloppify review --prepare --dimensions {dim_key}" diff --git a/desloppify/engine/_work_queue/issues.py b/desloppify/engine/_work_queue/issues.py index 17151df2..648296a3 100644 --- a/desloppify/engine/_work_queue/issues.py +++ b/desloppify/engine/_work_queue/issues.py @@ -12,6 +12,7 @@ from datetime import UTC, datetime from desloppify.base.output.issues import issue_weight +from desloppify.engine._state.issue_semantics import is_review_finding from desloppify.engine._work_queue.helpers import detail_dict logger = logging.getLogger(__name__) @@ -43,7 +44,7 @@ def list_open_review_issues(state: dict) -> list[dict]: review = [ issue for issue in issues.values() - if issue.get("status") == "open" and issue.get("detector") == "review" + if issue.get("status") == "open" and is_review_finding(issue) ] def _sort_key(issue: dict) -> tuple[float, str]: @@ -74,7 +75,7 @@ def mark_stale_holistic(state: dict, max_age_days: int = 30) -> list[str]: expired: list[str] = [] for issue_id, issue in state.get("issues", {}).items(): - if issue.get("detector") != "review": + if not is_review_finding(issue): continue if issue.get("status") != "open": continue diff --git a/desloppify/engine/_work_queue/selection.py b/desloppify/engine/_work_queue/selection.py index 5c832b22..41888bfc 100644 --- a/desloppify/engine/_work_queue/selection.py +++ b/desloppify/engine/_work_queue/selection.py @@ -49,7 +49,12 @@ def select_queue_items( def items_for_visibility(*, snapshot, visibility: str) -> list[WorkQueueItem]: """Select the snapshot partition for one queue surface.""" if visibility == QueueVisibility.BACKLOG: - return [dict(item) for item in snapshot.backlog_items] + source_items = snapshot.backlog_items or snapshot.execution_items + return [ + dict(item) + for item in source_items + if item.get("kind") not in {"workflow_stage", "workflow_action"} + ] return [dict(item) for item in snapshot.execution_items] diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index 216d3437..a1db8d94 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -11,12 +11,16 @@ WORKFLOW_DEFERRED_DISPOSITION_ID, WORKFLOW_RUN_SCAN_ID, ) -from desloppify.engine._plan.policy.subjective import NON_OBJECTIVE_DETECTORS from desloppify.engine._plan.schema import ( - planned_objective_ids as _planned_objective_ids, + executable_objective_ids as _executable_objective_ids, ) from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._state.filtering import path_scoped_issues +from desloppify.engine._state.issue_semantics import ( + counts_toward_objective_backlog, + is_review_request, + is_triage_finding, +) from desloppify.engine._state.schema import StateModel from desloppify.engine._work_queue.ranking import build_issue_items from desloppify.engine._work_queue.synthetic import ( @@ -90,7 +94,7 @@ def _is_fresh_boundary(plan: dict | None) -> bool: def _is_objective_item(item: WorkQueueItem, *, skipped_ids: set[str]) -> bool: return ( item.get("kind") in {"issue", "cluster"} - and item.get("detector", "") not in NON_OBJECTIVE_DETECTORS + and counts_toward_objective_backlog(item) and item.get("id", "") not in skipped_ids ) @@ -98,10 +102,35 @@ def _is_objective_item(item: WorkQueueItem, *, skipped_ids: set[str]) -> bool: def _review_issue_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueItem]: return [ item for item in items - if item.get("detector", "") in {"review", "concerns", "subjective_review"} + if is_triage_finding(item) ] +def _review_request_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueItem]: + return [ + item for item in items + if is_review_request(item) + ] + + +def _auto_promoted_autofix_ids(plan: dict | None) -> set[str]: + """Return auto-cluster member IDs eligible to execute without manual promotion.""" + if not isinstance(plan, dict): + return set() + autofix_ids: set[str] = set() + skipped_ids = set(plan.get("skipped", {}).keys()) + for cluster in plan.get("clusters", {}).values(): + if not isinstance(cluster, dict) or not cluster.get("auto"): + continue + action = str(cluster.get("action", "")) + if "desloppify autofix" not in action: + continue + for issue_id in cluster.get("issue_ids", []): + if isinstance(issue_id, str) and issue_id and issue_id not in skipped_ids: + autofix_ids.add(issue_id) + return autofix_ids + + def _executable_review_issue_items( plan: dict | None, state: StateModel, @@ -165,7 +194,7 @@ def _phase_for_snapshot( *, fresh_boundary: bool, initial_review_items: list[WorkQueueItem], - objective_items: list[WorkQueueItem], + explicit_queue_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], postflight_workflow_items: list[WorkQueueItem], @@ -173,7 +202,7 @@ def _phase_for_snapshot( ) -> str: if fresh_boundary and initial_review_items: return PHASE_REVIEW_INITIAL - if objective_items: + if explicit_queue_items: return PHASE_EXECUTE if scan_items: return PHASE_SCAN @@ -189,7 +218,7 @@ def _phase_for_snapshot( def _execution_items_for_phase( phase: str, *, - objective_items: list[WorkQueueItem], + explicit_queue_items: list[WorkQueueItem], initial_review_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], @@ -199,7 +228,7 @@ def _execution_items_for_phase( if phase == PHASE_REVIEW_INITIAL: return initial_review_items if phase == PHASE_EXECUTE: - return objective_items + return explicit_queue_items if phase == PHASE_SCAN: deferred_items = [ item for item in scan_items @@ -249,26 +278,55 @@ def build_queue_snapshot( item for item in all_issue_items if _is_objective_item(item, skipped_ids=skipped_ids) ] - planned_ids = _planned_objective_ids( + executable_objective_ids = _executable_objective_ids( {item.get("id", "") for item in objective_items}, effective_plan, ) - planned_objective_items = [ + explicit_objective_items = [ item for item in objective_items - if item.get("id", "") in planned_ids + if item.get("id", "") in executable_objective_ids ] review_issue_items = _review_issue_items(all_issue_items) + review_request_items = _review_request_items(all_issue_items) executable_review_items = _executable_review_issue_items( effective_plan, state, review_issue_items, ) + review_issue_ids = {item.get("id", "") for item in review_issue_items} + executable_review_ids = {item.get("id", "") for item in executable_review_items} + explicit_queue_ids = { + str(issue_id) + for issue_id in (effective_plan or {}).get("queue_order", []) + if isinstance(issue_id, str) and issue_id + } - skipped_ids + explicit_queue_ids |= _auto_promoted_autofix_ids(effective_plan) + queued_extra_items = [ + item for item in all_issue_items + if item.get("id", "") in explicit_queue_ids + and ( + item.get("id", "") not in review_issue_ids + or item.get("id", "") in executable_review_ids + ) + ] + explicit_queue_items: list[WorkQueueItem] = [] + seen_execution_ids: set[str] = set() + for item in [*explicit_objective_items, *queued_extra_items]: + item_id = str(item.get("id", "")) + if not item_id or item_id in seen_execution_ids: + continue + seen_execution_ids.add(item_id) + explicit_queue_items.append(item) initial_review_items, subjective_postflight_items = _subjective_partitions( state, scoped_issues=scoped_issues, threshold=target_strict, ) - postflight_review_items = [*subjective_postflight_items, *executable_review_items] + postflight_review_items = [ + *subjective_postflight_items, + *review_request_items, + *executable_review_items, + ] scan_items, postflight_workflow_items, triage_items = _workflow_partitions( effective_plan, state, @@ -278,7 +336,7 @@ def build_queue_snapshot( phase = _phase_for_snapshot( fresh_boundary=fresh_boundary, initial_review_items=initial_review_items, - objective_items=planned_objective_items, + explicit_queue_items=explicit_queue_items, scan_items=scan_items, postflight_review_items=postflight_review_items, postflight_workflow_items=postflight_workflow_items, @@ -286,7 +344,7 @@ def build_queue_snapshot( ) execution_items = _execution_items_for_phase( phase, - objective_items=planned_objective_items, + explicit_queue_items=explicit_queue_items, initial_review_items=initial_review_items, scan_items=scan_items, postflight_review_items=postflight_review_items, @@ -298,9 +356,10 @@ def build_queue_snapshot( backlog_items = [ item for item in ( [ - *planned_objective_items, + *objective_items, *initial_review_items, *subjective_postflight_items, + *review_request_items, *review_issue_items, *scan_items, *postflight_workflow_items, @@ -310,9 +369,9 @@ def build_queue_snapshot( if item.get("id", "") not in execution_ids ] objective_backlog_count = sum( - 1 for item in planned_objective_items if item.get("id", "") not in execution_ids + 1 for item in objective_items if item.get("id", "") not in execution_ids ) - has_unplanned_objective_blockers = len(planned_objective_items) < len(objective_items) + has_unplanned_objective_blockers = len(explicit_objective_items) < len(objective_items) return QueueSnapshot( phase=phase, @@ -325,12 +384,12 @@ def build_queue_snapshot( execution_items=tuple(execution_items), backlog_items=tuple(backlog_items), objective_in_scope_count=len(objective_items), - planned_objective_count=len(planned_objective_items), + planned_objective_count=len(explicit_objective_items), objective_execution_count=sum( 1 for item in execution_items if item.get("kind") in {"issue", "cluster"} - and item.get("detector", "") not in NON_OBJECTIVE_DETECTORS + and counts_toward_objective_backlog(item) ), objective_backlog_count=objective_backlog_count, subjective_initial_count=len(initial_review_items), diff --git a/desloppify/engine/_work_queue/synthetic.py b/desloppify/engine/_work_queue/synthetic.py index 829ad3bb..d426ac3f 100644 --- a/desloppify/engine/_work_queue/synthetic.py +++ b/desloppify/engine/_work_queue/synthetic.py @@ -10,6 +10,7 @@ from desloppify.engine.plan_triage import TRIAGE_STAGE_SPECS from desloppify.engine._scoring.subjective.core import DISPLAY_NAMES +from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine._state.schema import StateModel from desloppify.engine._work_queue.helpers import ( detail_dict, @@ -130,7 +131,7 @@ def build_triage_stage_items(plan: dict, state: dict) -> list[WorkQueueItem]: open_review_count = sum( 1 for f in issues.values() if f.get("status") == "open" - and f.get("detector") in ("review", "concerns") + and is_triage_finding(f) ) label_map = dict(TRIAGE_STAGE_LABELS) @@ -200,7 +201,7 @@ def build_subjective_items( for issue in issues.values(): if issue.get("status") != "open": continue - if issue.get("detector") == "review": + if is_triage_finding(issue): dim_key = str(detail_dict(issue).get("dimension", "")).strip().lower() if dim_key: review_open_by_dim[dim_key] = review_open_by_dim.get(dim_key, 0) + 1 diff --git a/desloppify/engine/_work_queue/types.py b/desloppify/engine/_work_queue/types.py index b0650cfa..88070f2d 100644 --- a/desloppify/engine/_work_queue/types.py +++ b/desloppify/engine/_work_queue/types.py @@ -34,6 +34,8 @@ class QueueItemCommon(QueueItemBase, total=False): """Optional fields shared across multiple queue item variants.""" detector: str + issue_kind: str + origin: str file: str confidence: str detail: dict[str, Any] diff --git a/desloppify/intelligence/integrity.py b/desloppify/intelligence/integrity.py index 17bb2377..d2b654a2 100644 --- a/desloppify/intelligence/integrity.py +++ b/desloppify/intelligence/integrity.py @@ -8,6 +8,7 @@ from collections.abc import Iterable, Mapping +from desloppify.engine._state.issue_semantics import is_review_request from desloppify.engine._scoring.policy.core import ( SUBJECTIVE_TARGET_MATCH_TOLERANCE, matches_target_score, @@ -50,10 +51,7 @@ def _iter_issues( def is_subjective_review_open(issue: dict) -> bool: """Return True when a issue is an open subjective-review signal.""" - return ( - issue.get("status") == "open" - and issue.get("detector") == "subjective_review" - ) + return issue.get("status") == "open" and is_review_request(issue) def is_holistic_subjective_issue(issue: dict, *, issue_id: str = "") -> bool: @@ -76,7 +74,7 @@ def is_holistic_subjective_issue(issue: dict, *, issue_id: str = "") -> bool: return True # Dimension-level issues are codebase-wide by nature - if issue.get("detector") == "subjective_review" and detail.get("dimension"): + if is_review_request(issue) and detail.get("dimension"): return True return False diff --git a/desloppify/intelligence/narrative/action_engine_routing.py b/desloppify/intelligence/narrative/action_engine_routing.py index dc123b50..44380dbd 100644 --- a/desloppify/intelligence/narrative/action_engine_routing.py +++ b/desloppify/intelligence/narrative/action_engine_routing.py @@ -6,6 +6,11 @@ from typing import Any from desloppify.engine._scoring.results.core import get_dimension_for_detector +from desloppify.engine._state.issue_semantics import ( + REVIEW_FINDING, + REVIEW_REQUEST, + infer_issue_kind, +) from desloppify.intelligence.narrative._constants import DETECTOR_TOOLS from desloppify.intelligence.narrative.action_models import ActionItem @@ -53,14 +58,15 @@ def _build_refactor_entry( guidance = tool_info.get("guidance", "manual fix") adjusted_info = {**tool_info, "guidance": guidance} - if detector == "subjective_review": + issue_kind = infer_issue_kind(detector) + if issue_kind == REVIEW_REQUEST: command = "desloppify review --prepare" suffix = "s" if count != 1 else "" description = ( f"{count} subjective dimension{suffix} need review — run holistic " "review to refresh subjective scores" ) - elif detector == "review": + elif issue_kind == REVIEW_FINDING: command = "desloppify show review --status open" suffix = "s" if count != 1 else "" description = ( diff --git a/desloppify/intelligence/narrative/signals.py b/desloppify/intelligence/narrative/signals.py index 92d0a8f7..67488e48 100644 --- a/desloppify/intelligence/narrative/signals.py +++ b/desloppify/intelligence/narrative/signals.py @@ -13,6 +13,10 @@ load_config as _load_config, ) from desloppify.base.discovery.paths import get_project_root +from desloppify.engine._state.issue_semantics import ( + is_review_finding, + is_review_request, +) from desloppify.intelligence.narrative._constants import STRUCTURAL_MERGE from desloppify.intelligence.narrative.types import ( BadgeStatus, @@ -102,15 +106,17 @@ def count_open_by_detector(issues: dict) -> dict[str, int]: if detector in STRUCTURAL_MERGE: detector = "structural" by_detector[detector] = by_detector.get(detector, 0) + 1 - if detector == "review" and issue.get("detail", {}).get("holistic"): + if is_review_finding(issue) and issue.get("detail", {}).get("holistic"): by_detector["review_holistic"] = by_detector.get("review_holistic", 0) + 1 + if is_review_request(issue): + by_detector["review_request"] = by_detector.get("review_request", 0) + 1 if by_detector.get("review", 0) > 0: by_detector["review_uninvestigated"] = sum( 1 for issue in issues.values() if issue.get("status") == "open" and not issue.get("suppressed") - and issue.get("detector") == "review" + and is_review_finding(issue) and not issue.get("detail", {}).get("investigation") ) return by_detector diff --git a/desloppify/tests/commands/plan/test_plan_overrides_direct.py b/desloppify/tests/commands/plan/test_plan_overrides_direct.py index ef7e8a71..069db22d 100644 --- a/desloppify/tests/commands/plan/test_plan_overrides_direct.py +++ b/desloppify/tests/commands/plan/test_plan_overrides_direct.py @@ -14,6 +14,7 @@ import desloppify.app.commands.plan.override_resolve_helpers as resolve_helpers_mod import desloppify.app.commands.plan.override_resolve_workflow as resolve_workflow_mod import desloppify.app.commands.plan.override_skip as override_skip_mod +import desloppify.app.commands.plan.reorder_handlers as reorder_handlers_mod from desloppify.base.exception_sets import CommandError @@ -374,6 +375,40 @@ def test_override_misc_focus_and_scan_gate_paths(monkeypatch, capsys) -> None: assert plan["scan_gate_skipped"] is True +def test_plan_promote_moves_backlog_items_into_queue(monkeypatch, capsys) -> None: + plan = {"queue_order": [], "clusters": {}} + runtime = SimpleNamespace(state={"issues": {"unused::a": {"status": "open"}}}) + moved: list[tuple[list[str], str, str | None]] = [] + + monkeypatch.setattr(reorder_handlers_mod, "command_runtime", lambda _args: runtime) + monkeypatch.setattr(reorder_handlers_mod, "require_issue_inventory", lambda _state: True) + monkeypatch.setattr(reorder_handlers_mod, "load_plan", lambda: plan) + monkeypatch.setattr(reorder_handlers_mod, "save_plan", lambda *_a, **_k: None) + monkeypatch.setattr(reorder_handlers_mod, "append_log_entry", lambda *_a, **_k: None) + monkeypatch.setattr( + reorder_handlers_mod, + "resolve_ids_from_patterns", + lambda *_a, **_k: ["unused::a"], + ) + + def _move_items(plan_obj, issue_ids, position, target=None, offset=None): + moved.append((list(issue_ids), position, target)) + plan_obj["queue_order"].extend(issue_ids) + return len(issue_ids) + + monkeypatch.setattr(reorder_handlers_mod, "move_items", _move_items) + + reorder_handlers_mod.cmd_plan_promote( + argparse.Namespace(patterns=["unused"], position="top", target=None) + ) + out = capsys.readouterr().out + + assert "Promoted 1 item(s)" in out + assert moved == [(["unused::a"], "top", None)] + assert plan["queue_order"] == ["unused::a"] + assert plan["promoted_ids"] == ["unused::a"] + + def test_override_skip_helpers_and_commands(monkeypatch, capsys) -> None: monkeypatch.setattr(override_skip_mod, "skip_kind_requires_attestation", lambda _kind: True) monkeypatch.setattr( diff --git a/desloppify/tests/commands/plan/test_triage_runner.py b/desloppify/tests/commands/plan/test_triage_runner.py index f78dd42b..c8487e28 100644 --- a/desloppify/tests/commands/plan/test_triage_runner.py +++ b/desloppify/tests/commands/plan/test_triage_runner.py @@ -32,8 +32,8 @@ def _make_triage_input(n_issues: int = 5) -> TriageInput: "detail": {"dimension": f"dim_{i % 3}", "suggestion": "Fix it"}, } return TriageInput( - open_issues=issues, - mechanical_issues={}, + review_issues=issues, + objective_backlog_issues={}, existing_clusters={}, dimension_scores={"dim_0": {"score": 70, "strict": 65, "failing": 2}}, new_since_last=set(), diff --git a/desloppify/tests/commands/test_next_queue_flow_direct.py b/desloppify/tests/commands/test_next_queue_flow_direct.py index 20bf8eef..6dadb559 100644 --- a/desloppify/tests/commands/test_next_queue_flow_direct.py +++ b/desloppify/tests/commands/test_next_queue_flow_direct.py @@ -273,10 +273,9 @@ def test_build_and_render_backlog_queue_uses_real_backlog_policy(capsys) -> None ) out = capsys.readouterr().out - assert "Run post-flight scan" in out + assert "Unplanned issue" in out assert "Planned issue" not in out - assert "Unplanned issue" not in out - assert written[0]["items"][0]["id"] == "workflow::run-scan" + assert written[0]["items"][0]["id"] == unplanned["id"] def test_build_and_render_backlog_queue_hides_execution_prompt(capsys) -> None: diff --git a/desloppify/tests/engine/test_sync_split_modules_direct.py b/desloppify/tests/engine/test_sync_split_modules_direct.py index e1f1b323..630318b0 100644 --- a/desloppify/tests/engine/test_sync_split_modules_direct.py +++ b/desloppify/tests/engine/test_sync_split_modules_direct.py @@ -710,11 +710,45 @@ def test_queue_snapshot_enforces_phase_boundaries() -> None: }, plan={"queue_order": ["triage::observe"], "plan_start_scores": {"strict": 75.0}}, ) - assert execute.phase == snapshot_mod.PHASE_EXECUTE - assert [item["id"] for item in execute.execution_items] == ["unused::a"] + assert execute.phase == snapshot_mod.PHASE_SCAN + assert [item["id"] for item in execute.execution_items] == ["workflow::run-scan"] backlog_ids = {item["id"] for item in execute.backlog_items} assert "triage::observe" in backlog_ids - assert "subjective::naming_quality" in backlog_ids + assert "unused::a" in backlog_ids + + +def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queueing() -> None: + state = { + "issues": { + "unused::a": { + "id": "unused::a", + "detector": "unused", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "unused import", + "detail": {}, + } + } + } + plan = { + "queue_order": [], + "clusters": { + "auto/unused": { + "issue_ids": ["unused::a"], + "auto": True, + "action": "desloppify autofix unused-imports --dry-run", + } + }, + "plan_start_scores": {"strict": 80.0}, + } + + snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == snapshot_mod.PHASE_EXECUTE + assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] + assert "unused::a" not in {item["id"] for item in snapshot.backlog_items} def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: diff --git a/desloppify/tests/plan/test_epic_triage.py b/desloppify/tests/plan/test_epic_triage.py index 5ca2ae61..4d67f717 100644 --- a/desloppify/tests/plan/test_epic_triage.py +++ b/desloppify/tests/plan/test_epic_triage.py @@ -551,10 +551,10 @@ def test_collects_open_review_issues(self): state = _state_with_review_issues("r1", "r2") state["issues"]["u1"] = {"status": "open", "detector": "unused"} si = collect_triage_input(plan, state) - assert len(si.open_issues) == 2 - assert "r1" in si.open_issues - assert len(si.mechanical_issues) == 1 - assert "u1" in si.mechanical_issues + assert len(si.review_issues) == 2 + assert "r1" in si.review_issues + assert len(si.objective_backlog_issues) == 1 + assert "u1" in si.objective_backlog_issues def test_includes_existing_clusters(self): plan = empty_plan() @@ -566,6 +566,35 @@ def test_includes_existing_clusters(self): si = collect_triage_input(plan, state) assert "epic/test" in si.existing_clusters + def test_collects_non_epic_auto_clusters_separately(self): + plan = empty_plan() + plan["clusters"]["epic/test"] = { + "name": "epic/test", + "thesis": "test", + "direction": "delete", + "issue_ids": [], + "auto": True, + "cluster_key": "epic::epic/test", + } + plan["clusters"]["auto/unused-imports"] = { + "name": "auto/unused-imports", + "issue_ids": ["u1"], + "auto": True, + "description": "Remove unused imports", + "action": "desloppify autofix import-cleanup --dry-run", + } + state = _state_with_review_issues("r1") + state["issues"]["u1"] = {"status": "open", "detector": "unused"} + + si = collect_triage_input(plan, state) + + assert "epic/test" in si.existing_clusters + assert "auto/unused-imports" not in si.existing_clusters + assert "auto/unused-imports" in si.auto_clusters + assert si.auto_clusters["auto/unused-imports"]["action"] == ( + "desloppify autofix import-cleanup --dry-run" + ) + def test_tracks_new_since_last(self): plan = empty_plan() plan["epic_triage_meta"] = {"triaged_ids": ["r1"]} diff --git a/desloppify/tests/plan/test_epic_triage_prompt_direct.py b/desloppify/tests/plan/test_epic_triage_prompt_direct.py index fe06832e..c8e8647d 100644 --- a/desloppify/tests/plan/test_epic_triage_prompt_direct.py +++ b/desloppify/tests/plan/test_epic_triage_prompt_direct.py @@ -26,8 +26,8 @@ def test_build_triage_prompt_includes_completed_clusters_and_resolved_issue_cont dimension="abstraction_fitness", ) triage_input = TriageInput( - open_issues={open_id: open_issue}, - mechanical_issues={}, + review_issues={open_id: open_issue}, + objective_backlog_issues={}, existing_clusters={}, dimension_scores={}, new_since_last={open_id}, @@ -70,8 +70,8 @@ def test_build_triage_prompt_renders_recurring_dimension_summary() -> None: dimension="naming_quality", ) triage_input = TriageInput( - open_issues={open_id: open_issue}, - mechanical_issues={}, + review_issues={open_id: open_issue}, + objective_backlog_issues={}, existing_clusters={}, dimension_scores={}, new_since_last=set(), @@ -90,3 +90,54 @@ def test_build_triage_prompt_renders_recurring_dimension_summary() -> None: assert "## Potential recurring dimensions (resolved issues still have open peers)" in prompt assert "- api_surface_coherence: 1 open / 1 recently resolved" in prompt assert "naming_quality: 1 open" not in prompt + + +def test_build_triage_prompt_includes_mechanical_backlog_context() -> None: + open_id, open_issue = _issue( + "review::open::1111aaaa", + summary="Open API drift", + dimension="api_surface_coherence", + ) + triage_input = TriageInput( + review_issues={open_id: open_issue}, + objective_backlog_issues={ + "unused::src/a.py::dead": { + "detector": "unused", + "summary": "Unused export", + "file": "src/a.py", + "confidence": "high", + }, + "test_coverage::src/b.py::miss": { + "detector": "test_coverage", + "summary": "Missing behavioral coverage", + "file": "src/b.py", + "confidence": "medium", + }, + }, + auto_clusters={ + "auto/unused-imports": { + "auto": True, + "issue_ids": ["unused::src/a.py::dead"], + "description": "Remove 1 unused import issue", + "action": "desloppify autofix import-cleanup --dry-run", + } + }, + existing_clusters={}, + dimension_scores={}, + new_since_last=set(), + resolved_since_last=set(), + previously_dismissed=[], + triage_version=1, + resolved_issues={}, + completed_clusters=[], + ) + + prompt = build_triage_prompt(triage_input) + + assert "## Mechanical backlog (2 items: 1 in 1 auto-clusters, 1 unclustered)" in prompt + assert "### Auto-clusters" in prompt + assert "- auto/unused-imports (1 items) [autofix: desloppify autofix import-cleanup --dry-run]" in prompt + assert "Remove 1 unused import issue" in prompt + assert "### Unclustered items (1 items — needs human judgment or isolated findings)" in prompt + assert "- [medium] test_coverage::src/b.py::miss — Missing behavioral coverage" in prompt + assert "Inspect a cluster: `desloppify plan cluster show auto/`" in prompt diff --git a/desloppify/tests/plan/test_planned_objective_ids.py b/desloppify/tests/plan/test_planned_objective_ids.py deleted file mode 100644 index cb5a0746..00000000 --- a/desloppify/tests/plan/test_planned_objective_ids.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Tests for plan-tracked objective ID selection.""" - -from __future__ import annotations - -from desloppify.engine._plan.schema import planned_objective_ids - - -def test_planned_objective_ids_returns_all_when_plan_tracks_nothing() -> None: - all_ids = {"issue-1", "issue-2"} - - assert planned_objective_ids(all_ids, {"queue_order": [], "clusters": {}}) == all_ids - - -def test_planned_objective_ids_returns_overlap_when_live_tracked_ids_exist() -> None: - all_ids = {"issue-1", "issue-2", "issue-3"} - plan = { - "queue_order": ["issue-2"], - "clusters": {"c1": {"issue_ids": ["issue-3"], "action_steps": []}}, - "skipped": {}, - "overrides": {}, - } - - assert planned_objective_ids(all_ids, plan) == {"issue-2", "issue-3"} - - -def test_planned_objective_ids_returns_empty_when_tracked_ids_are_stale() -> None: - all_ids = {"issue-1", "issue-2"} - plan = { - "queue_order": ["missing-issue"], - "clusters": {"c1": {"issue_ids": ["missing-cluster-issue"], "action_steps": []}}, - "skipped": {}, - "overrides": {}, - } - - assert planned_objective_ids(all_ids, plan) == set() - - -def test_planned_objective_ids_ignores_synthetic_and_skipped_tracking() -> None: - all_ids = {"issue-1", "issue-2"} - plan = { - "queue_order": ["workflow::create-plan"], - "clusters": {}, - "skipped": {"issue-1": {"kind": "temporary"}}, - "overrides": {}, - } - - assert planned_objective_ids(all_ids, plan) == all_ids diff --git a/desloppify/tests/plan/test_subjective_policy.py b/desloppify/tests/plan/test_subjective_policy.py index 90655a81..2dab3184 100644 --- a/desloppify/tests/plan/test_subjective_policy.py +++ b/desloppify/tests/plan/test_subjective_policy.py @@ -106,7 +106,10 @@ def test_objective_issues_counted(): _issue("u2", "unused"), _issue("r1", "review"), # non-objective ) - policy = compute_subjective_visibility(state) + policy = compute_subjective_visibility( + state, + plan={"queue_order": ["u1", "u2", "r1"], "skipped": {}}, + ) assert policy.has_objective_backlog is True assert policy.objective_count == 2 @@ -115,7 +118,10 @@ def test_suppressed_issues_excluded(): state = _state_with_issues( _issue("u1", "unused", suppressed=True), ) - policy = compute_subjective_visibility(state) + policy = compute_subjective_visibility( + state, + plan={"queue_order": ["u1"], "skipped": {}}, + ) assert policy.has_objective_backlog is False assert policy.objective_count == 0 @@ -124,7 +130,10 @@ def test_closed_issues_excluded(): state = _state_with_issues( _issue("u1", "unused", status="resolved"), ) - policy = compute_subjective_visibility(state) + policy = compute_subjective_visibility( + state, + plan={"queue_order": ["u1"], "skipped": {}}, + ) assert policy.has_objective_backlog is False @@ -135,7 +144,10 @@ def test_non_objective_detectors_excluded(): _issue("sr1", "subjective_review"), _issue("sa1", "subjective_assessment"), ) - policy = compute_subjective_visibility(state) + policy = compute_subjective_visibility( + state, + plan={"queue_order": ["r1", "c1", "sr1", "sa1"], "skipped": {}}, + ) assert policy.has_objective_backlog is False assert policy.objective_count == 0 diff --git a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py index d26d3ae8..a611ca5d 100644 --- a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py +++ b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py @@ -120,12 +120,13 @@ def test_plan_ordered_stale_subjective_gated_with_objective_backlog(): } } - # Without plan: stale subjective item is gated + # Without an explicit queue, pre-triage objective work still blocks stale + # subjective review items from surfacing. queue_no_plan = build_work_queue(state, count=None, include_subjective=True) subj_no_plan = [ i["id"] for i in queue_no_plan["items"] if i["id"].startswith("subjective::") ] - assert len(subj_no_plan) == 0 + assert subj_no_plan == [] # With plan that includes the stale dim in queue_order: still gated plan = empty_plan() @@ -282,7 +283,7 @@ def test_execution_queue_excludes_unplanned_objective_items(): def test_backlog_queue_excludes_execution_objective_items(): - """Backlog should exclude objective work already admitted to execution.""" + """Backlog should exclude execution items and synthetic workflow helpers.""" from desloppify.engine._plan.schema import empty_plan state = _state( @@ -304,8 +305,8 @@ def test_backlog_queue_excludes_execution_objective_items(): ) ids = [item["id"] for item in queue["items"]] assert "smells::src/a.py::planned" not in ids - assert "smells::src/b.py::unplanned" not in ids - assert "workflow::run-scan" in ids + assert "smells::src/b.py::unplanned" in ids + assert "workflow::run-scan" not in ids def test_unplanned_objective_items_dont_block_postflight(): @@ -444,7 +445,13 @@ def test_wontfixed_issues_excluded_from_queue(): ] ) - queue = build_work_queue(state, count=None, include_subjective=False) + queue = build_backlog_queue( + state, + options=QueueBuildOptions( + count=None, + include_subjective=False, + ), + ) ids = {item["id"] for item in queue["items"]} assert "a" in ids assert "d" in ids diff --git a/desloppify/tests/state/test_state.py b/desloppify/tests/state/test_state.py index dbe157e7..15e6605f 100644 --- a/desloppify/tests/state/test_state.py +++ b/desloppify/tests/state/test_state.py @@ -5,6 +5,8 @@ from desloppify.engine._state import filtering as state_query_mod +from desloppify.engine._state.issue_semantics import MECHANICAL_FINDING, SCAN_ORIGIN +from desloppify.engine._state.schema import CURRENT_VERSION from desloppify.state import ( MergeScanOptions, apply_issue_noise_budget, @@ -238,6 +240,8 @@ def test_default_field_values(self, monkeypatch): assert f["tier"] == 2 assert f["confidence"] == "medium" assert f["summary"] == "sum" + assert f["issue_kind"] == MECHANICAL_FINDING + assert f["origin"] == SCAN_ORIGIN # --------------------------------------------------------------------------- @@ -248,7 +252,7 @@ def test_default_field_values(self, monkeypatch): class TestEmptyState: def test_structure(self): s = empty_state() - assert s["version"] == 1 + assert s["version"] == CURRENT_VERSION assert s["last_scan"] is None assert s["scan_count"] == 0 assert "config" not in s # config moved to config.json @@ -269,7 +273,7 @@ def test_structure(self): class TestLoadState: def test_nonexistent_file_returns_empty_state(self, tmp_path): s = load_state(tmp_path / "missing.json") - assert s["version"] == 1 + assert s["version"] == CURRENT_VERSION assert s["issues"] == {} def test_valid_json_returns_parsed_data(self, tmp_path): @@ -290,6 +294,8 @@ def test_legacy_payload_gets_normalized(self, tmp_path): assert s["scan_count"] == 0 assert s["stats"] == {} assert s["issues"]["x"]["status"] == "open" + assert s["issues"]["x"]["issue_kind"] == MECHANICAL_FINDING + assert s["issues"]["x"]["origin"] == SCAN_ORIGIN validate_state_invariants(s) def test_corrupt_json_tries_backup(self, tmp_path): @@ -306,7 +312,7 @@ def test_corrupt_json_no_backup_returns_empty(self, tmp_path): p = tmp_path / "state.json" p.write_text("{bad json!!") s = load_state(p) - assert s["version"] == 1 + assert s["version"] == CURRENT_VERSION assert s["issues"] == {} def test_corrupt_json_renames_file(self, tmp_path): @@ -322,7 +328,7 @@ def test_corrupt_json_and_corrupt_backup_returns_empty(self, tmp_path): backup.write_text("{also bad") s = load_state(p) - assert s["version"] == 1 + assert s["version"] == CURRENT_VERSION assert s["issues"] == {} @@ -338,7 +344,7 @@ def test_creates_file_and_writes_valid_json(self, tmp_path): save_state(st, p) assert p.exists() loaded = json.loads(p.read_text()) - assert loaded["version"] == 1 + assert loaded["version"] == CURRENT_VERSION def test_creates_backup_of_previous(self, tmp_path): p = tmp_path / "state.json" @@ -852,4 +858,3 @@ def test_zero_active_checks_with_assessments_keeps_subjective_scoring(self): # Overall/strict are dragged down by the low assessment score. assert st["overall_score"] < 100.0 assert st["strict_score"] < 100.0 - diff --git a/desloppify/tests/state/test_state_internal_direct.py b/desloppify/tests/state/test_state_internal_direct.py index 547ee288..9434f156 100644 --- a/desloppify/tests/state/test_state_internal_direct.py +++ b/desloppify/tests/state/test_state_internal_direct.py @@ -5,6 +5,7 @@ import json import desloppify.engine._state.filtering as filtering_mod +import desloppify.engine._state.issue_semantics as issue_semantics_mod import desloppify.engine._state.noise as noise_mod import desloppify.engine._state.persistence as persistence_mod import desloppify.engine._state.resolution as resolution_mod @@ -74,6 +75,60 @@ def test_load_state_missing_and_backup_fallback(tmp_path): assert recovered["strict_score"] == 0 +def test_issue_semantics_normalize_legacy_detector_rows(): + review_issue = {"id": "review::src/a.py::naming", "detector": "review", "detail": {}} + concern_issue = {"id": "concerns::src/a.py::dup", "detector": "concerns", "detail": {}} + request_issue = { + "id": "subjective_review::.::holistic_unreviewed", + "detector": "subjective_review", + "detail": {}, + } + mechanical_issue = {"id": "unused::src/a.py::x", "detector": "unused", "detail": {}} + + issue_semantics_mod.ensure_issue_semantics(review_issue) + issue_semantics_mod.ensure_issue_semantics(concern_issue) + issue_semantics_mod.ensure_issue_semantics(request_issue) + issue_semantics_mod.ensure_issue_semantics(mechanical_issue) + + assert review_issue["issue_kind"] == issue_semantics_mod.REVIEW_FINDING + assert review_issue["origin"] == issue_semantics_mod.REVIEW_IMPORT_ORIGIN + assert concern_issue["issue_kind"] == issue_semantics_mod.CONCERN_FINDING + assert request_issue["issue_kind"] == issue_semantics_mod.REVIEW_REQUEST + assert request_issue["origin"] == issue_semantics_mod.SYNTHETIC_REQUEST_ORIGIN + assert mechanical_issue["issue_kind"] == issue_semantics_mod.MECHANICAL_FINDING + assert mechanical_issue["origin"] == issue_semantics_mod.SCAN_ORIGIN + + +def test_validate_state_invariants_rejects_invalid_issue_semantics(): + state = schema_mod.empty_state() + state["issues"] = { + "bad": { + "id": "bad", + "detector": "unused", + "file": "src/a.py", + "tier": 2, + "confidence": "high", + "summary": "bad", + "detail": {}, + "status": "open", + "note": None, + "first_seen": "2025-01-01T00:00:00+00:00", + "last_seen": "2025-01-01T00:00:00+00:00", + "resolved_at": None, + "reopen_count": 0, + "issue_kind": "not_real", + "origin": issue_semantics_mod.SCAN_ORIGIN, + } + } + + try: + schema_mod.validate_state_invariants(state) + except ValueError as exc: + assert "issue_kind" in str(exc) + else: + raise AssertionError("validate_state_invariants should reject invalid issue_kind") + + def test_state_persistence_defaults_follow_runtime_project_root(tmp_path): from desloppify.base.runtime_state import RuntimeContext, runtime_scope diff --git a/test_release_image.png b/test_release_image.png new file mode 100644 index 0000000000000000000000000000000000000000..6658c5b7adbb6946569f22b2fa7ed2d9def9a6b5 GIT binary patch literal 852388 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

@bQi!T^I}PpIBX^k~^G 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�DBMn~}tzXQG8~ow*B_+G%s=wOR<` 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 f`&AxDralA6M4jRtm|V67SwdC9s5Ham7pNFq!x1 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

-+~#+vVz^C{t`a|yesW7T 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

-UjQ~@2A6rbCK?D70XG=B);(bS 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 g5FVm`B9wNt^RiYJP__^Z1zP^%;+Jcg;Y0Da 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≶eEb8hX;xxj=Tol2unF8E8e6; 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 XyJaOMW@LfM00000NkvXXu0mjfn<4D< literal 0 HcmV?d00001 From f0b00123cdbb90746acd78f6475599afd65473d1 Mon Sep 17 00:00:00 2001 From: POM Date: Fri, 13 Mar 2026 02:40:02 +0100 Subject: [PATCH 02/15] chore: update local changes --- assets/scorecard.png | Bin 89162 -> 90768 bytes .../app/commands/autofix/apply_retro.py | 9 +- desloppify/app/commands/exclude.py | 9 +- desloppify/app/commands/helpers/guardrails.py | 2 +- .../app/commands/helpers/queue_progress.py | 2 +- desloppify/app/commands/next/queue_flow.py | 2 +- .../app/commands/plan/cluster/dispatch.py | 2 +- .../app/commands/plan/cluster_ops_display.py | 2 +- .../commands/plan/override_resolve_helpers.py | 4 +- desloppify/app/commands/plan/override_skip.py | 2 +- .../app/commands/plan/shared/patterns.py | 2 +- .../commands/plan/triage/display/layout.py | 2 +- .../commands/plan/triage/stages/helpers.py | 2 +- .../app/commands/resolve/queue_guard.py | 2 +- desloppify/app/commands/resolve/render.py | 15 +- .../app/commands/review/batch/core_models.py | 1 - .../commands/review/batch/core_normalize.py | 21 +- .../app/commands/review/importing/cmd.py | 21 +- .../app/commands/review/importing/output.py | 4 +- .../commands/review/importing/plan_sync.py | 4 +- .../app/commands/review/importing/results.py | 2 - desloppify/app/commands/scan/artifacts.py | 2 +- .../app/commands/scan/plan_reconcile.py | 2 +- .../app/commands/scan/reporting/dimensions.py | 2 +- .../commands/scan/reporting/presentation.py | 3 +- .../app/commands/scan/reporting/subjective.py | 2 +- desloppify/app/commands/scan/wontfix.py | 2 +- desloppify/app/commands/scan/workflow.py | 2 +- .../app/commands/show/dimension_views.py | 8 +- desloppify/app/commands/status/cmd.py | 2 +- desloppify/app/commands/status/render.py | 2 +- .../app/commands/status/render_dimensions.py | 2 +- desloppify/app/commands/status/render_io.py | 2 +- .../app/commands/status/render_structural.py | 2 +- desloppify/app/commands/status/summary.py | 2 +- desloppify/app/commands/zone.py | 4 +- desloppify/app/output/visualize_data.py | 5 +- desloppify/base/output/issues.py | 10 +- desloppify/engine/_concerns/state.py | 2 +- desloppify/engine/_plan/auto_cluster.py | 2 +- desloppify/engine/_plan/commit_tracking.py | 2 +- desloppify/engine/_plan/policy/stale.py | 2 +- desloppify/engine/_plan/policy/subjective.py | 2 +- desloppify/engine/_plan/reconcile.py | 13 +- .../engine/_plan/reconcile_review_import.py | 2 +- desloppify/engine/_plan/schema/__init__.py | 16 +- desloppify/engine/_plan/sync/context.py | 7 +- desloppify/engine/_plan/sync/workflow.py | 8 +- desloppify/engine/_plan/triage/apply.py | 7 +- desloppify/engine/_plan/triage/prompt.py | 2 +- desloppify/engine/_scoring/policy/core.py | 6 + .../engine/_scoring/state_integration.py | 2 +- desloppify/engine/_state/filtering.py | 4 +- desloppify/engine/_state/issue_semantics.py | 199 +++++++++++++----- desloppify/engine/_state/merge.py | 6 +- desloppify/engine/_state/persistence.py | 8 +- desloppify/engine/_state/recovery.py | 3 +- desloppify/engine/_state/resolution.py | 4 +- desloppify/engine/_state/schema.py | 51 +++-- desloppify/engine/_state/schema_types.py | 5 +- .../engine/_state/schema_types_issues.py | 15 +- .../engine/_state/schema_types_review.py | 2 +- desloppify/engine/_work_queue/inputs.py | 2 +- desloppify/engine/_work_queue/issues.py | 36 +++- desloppify/engine/_work_queue/plan_order.py | 2 +- desloppify/engine/_work_queue/ranking.py | 2 +- desloppify/engine/_work_queue/snapshot.py | 20 +- desloppify/engine/_work_queue/synthetic.py | 2 +- desloppify/engine/_work_queue/types.py | 13 +- desloppify/engine/planning/render.py | 2 +- .../engine/planning/scorecard_dimensions.py | 2 +- .../intelligence/narrative/action_engine.py | 2 +- .../narrative/action_engine_routing.py | 19 +- .../intelligence/narrative/dimensions.py | 2 +- .../intelligence/narrative/reminders.py | 2 +- .../narrative/reminders_rules_followup.py | 3 +- .../narrative/reminders_rules_primary.py | 2 +- desloppify/intelligence/narrative/signals.py | 2 +- .../review/_prepare/issue_history.py | 2 +- .../review/_prepare/remediation_engine.py | 2 +- .../intelligence/review/context_builder.py | 2 +- .../review/context_holistic/mechanical.py | 2 +- .../context_holistic/selection/contexts.py | 4 +- .../review/importing/assessments.py | 14 +- .../review/importing/holistic_cache.py | 5 +- .../review/importing/resolution.py | 5 +- .../review/prepare_batches_builders.py | 2 +- .../review/prepare_holistic_scope.py | 5 +- desloppify/intelligence/review/selection.py | 2 +- .../intelligence/review/selection_cache.py | 2 +- .../languages/python/detectors/unused.py | 37 +++- .../autofix/test_apply_retro_direct.py | 2 +- .../plan/test_plan_override_transactions.py | 2 +- .../commands/plan/test_saved_plan_recovery.py | 8 +- .../review/test_review_batch_core_direct.py | 14 +- .../test_review_importing_support_direct.py | 2 +- .../test_review_merge_command_direct.py | 12 +- .../commands/review/test_review_preflight.py | 6 +- .../test_review_runner_batch_split_direct.py | 17 +- desloppify/tests/commands/test_cmd_autofix.py | 13 +- desloppify/tests/commands/test_cmd_exclude.py | 4 +- .../commands/test_lifecycle_transitions.py | 32 +-- .../commands/test_queue_count_consistency.py | 38 ++-- .../tests/commands/test_queue_order_guard.py | 8 +- .../tests/commands/test_transitive_engine.py | 8 +- .../engine/test_sync_split_modules_direct.py | 2 + ...test_review_import_prepare_split_direct.py | 6 +- .../test_action_engine_routing_direct.py | 6 +- .../tests/narrative/test_narrative_actions.py | 6 +- .../test_narrative_strategy_and_review.py | 20 +- .../test_recovered_state_headline.py | 2 +- desloppify/tests/plan/test_auto_cluster.py | 6 +- desloppify/tests/plan/test_epic_triage.py | 15 +- .../tests/plan/test_stale_dimensions.py | 31 +-- ..._stale_dimensions_cycle_and_queue_order.py | 17 +- .../plan/test_unified_status_lifecycle.py | 16 +- .../review/context/test_holistic_review.py | 16 +- ...olistic_review_dimensions_and_structure.py | 4 +- .../context/test_issue_history_context.py | 12 +- .../context/test_mechanical_evidence.py | 2 +- .../test_review_import_scoring.py | 32 +-- .../tests/review/review_commands_cases.py | 48 ++--- .../tests/review/review_coverage_cases.py | 8 +- .../tests/review/review_submodules_cases.py | 2 +- ...submodules_import_and_remediation_cases.py | 12 +- .../tests/review/shared_review_fixtures.py | 2 +- .../review/test_work_queue_issues_direct.py | 8 +- desloppify/tests/review/work_queue_cases.py | 6 +- desloppify/tests/state/test_state.py | 15 +- .../tests/state/test_state_internal_direct.py | 34 +-- .../tests/state/test_suppression_scoring.py | 22 +- 131 files changed, 762 insertions(+), 485 deletions(-) diff --git a/assets/scorecard.png b/assets/scorecard.png index d8046760b05dd026898f3456608cec821bfc3fbf..5b4bd9957846a86bd636c10ef38eea2f5b749104 100644 GIT binary patch literal 90768 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

-HNmK=cA$inCo8a5z7$PXY-d*uB!-+xrq!C_S7?_$0V@Fht0p z-b?k|J4MJ}4;1M((^Vh!Lc3F0p8bMc>R)Ae`Sb39mFt zA`OUOsBa(ONU7gFPV+?zlIN*MnP^Y8TQ1gOV$#s_^;R}Jvk4tqCSy;I3We!d!qeZ& zRZx>zJxcLg+T6nryx0^5(gW(R3aG)Jv^4A3t-k8&u9nhkv=L&3Gm>E)%c2(xw(>uduw_i2nalOXFOKc)@-QIM4#su*r8Dy zA&q=S8tO&dOL+5{3r1}#fkFZ#g*)JvYo~=06#LD&Pu3QeGa9G0wBjJRrPY$ISth?k z(5cn4Nk?N0*`X}4@)Bra(u|PKRSa6@jsw2J;yh}Im&dl}+Ulx_0ZmsE390JmhTZM6 zGmnPIC`TfUEE@WAjraPQ=%H2ya{SS)mM&=2rgGb77pZ-hTEKkIvtbo>F;P(WZ72#F zDGaGotZ6OKjms=m8y|m%U)mG`%=n@Pk*dXE8(3#hW!`7OIAy|&4v=}OW9Qd$jD(=K zB2q?y%X}Z+HbQf=vQ}~1>04Xs@FI_c7aP*+lW>0aXVeNTw*Q~r7 zZr^Gz10pTJJ*j0CI=Df|VI_u@mTn`1-m&g<24>OerdwW;?bS=;- z{WN5tF2U-1q(}IxKjQ;4`7CaFL5r;lrs??+oNycwN)9e+XIXqXAmYU}9d|fUcRgm8 zWd15FghpLbf1?+{V*>{BfF|yze(ifu!J5r+oKhgTbIz5%7aIE4SEppr&!Q6(6H$!> zgGfe%WI=QP+PnW8L_?a`XA-@=y-)1)->nEl)mJu@uQn%? zaNTd`?`$qmEl}2MUU-V&zpmcTTy(M|`Fb3r#;{q)QI4_8Z2%fT)}1Y-!TeB3Z2orT z{Bf}f^n{_F`_tvV6O?nC=etpmX&4b6z^!Tky*`a}#3e(8cta`+$&I1Ja<-fK(F z5!`h+UW^NR5U&W8{;)bhfG}}Eyk%L1;NJE-KhM`Iss*MDp4VSfrqf}rBy3>4@p62- z_UXHB*@4M=o1Rz}?YY@tTWb`CXgM?+d)qQx-3`$Q-SaGTm=YQn4`>^i(QMt`7cIYA zsq3q$=??f0GB6_h`nj#M@3oSSBtz(!86Q7C=@e)8->c7#Fw|Q(z_~0`eOg$*)sF!u zGgFa$%Grk^NJ5u)53f)C!>=eU3A9ueI>>>bM5W#sHNml>;%60CIz+j6Sl1r-!`avR ztKMk-NK73|eh4mevfQX`tb}wHk7k)N2E|;6j8EXg0RC6&261 zuXIuN-YM;#LU2t~B!w}(X}%On(rlYQz2y|GTJd{rb-ZDpQl0;OpLgpDRGRiDy?3ZkEJD8>sQCk7@aCSGgCri>f{)Nr9h!2*Tc<2A8=g+g=I?OrD*bsi}{P?dVUO)m!`cI)-S59y+XLE z9U=FB0((P)rddG1-NGJG!*5q5x@SijG2#C{lWcr|^I|DC%2mZj7!|{tCPSf{pe)%c zK>g)vXoqP2{a}^Jl$HW=d{R}N)#>RT_>VU-cK&N}u#ii8o|)|lHu90RkI&y&=_{xv zehGS*es};nsLmupUXux8o9r*VLSuUQauk*lm2?E8)L5Gdj~(qq_)~F*2lZxJnGlu1 z%4V|%LrMNGi7;S!|lfeo(dd1l+LVBwXVL)Iu-NO#MmNqu# zsnNJrDbg~$*PpTwC?8+Kid7uei<&Co=?oG5D-o?Kn4PU(TU(P&u4|r9UUc)3l|8sT zMwhIzW?^AbQHh`s_JD8C1_A--mk8l3eZ?2Jj~-p@&(;)_ma2m8Py4jz18x=>+eNd@ z2iI-v>=e+t5HUr`!$U*P3r)?)Zac?VD@$`6KkUk}mxQ6$xze;}3iCX?={UZ#6QyQm zVY#XL>^ZzeH4R*|o@GPy1oD@A<$-SU)6j2$y^yws04_6{7mx}MUOWlCHYE*=*j7q* zT3J2ZHc+PqI2gvzO z8#EpslUMKW_mb;`g@h{b+e{Br18?SXM<{Jy_Om+a^MESh{H_8p?;q;SHl&`K5;NVP9;U&i<0#%UAtTYgV?rv_rhVjpVica706asg?bRYv$TqG-_d??8>Rp47zikoiUkUICxrznc&mPOq%wDM=#1>v4BhHhygp{- zU@0jmP^pWTMw3%es{DzICoyRsXB4Iz!rC5Ac6|*F9G?JH*VT=UjZuj>aS93f`09E` zC;)^5IbZjFmGOOUZtls^(TY>Ge3r!d7m3^Ht&UW$og$ES)M@mnD2RCqNwXU z^0r+w`~%Oy+|eCmwmR&JwT>~nCJKHl)(>i*1!Xt>iFy1L0%!vp zSZhnG5BV*lfH_vO^6z4|GPhEXCEtBS$?bIkN8`|4gYUjFZQS1C;$5SPIP#~-NP8IU zxl2$%K~E@0;|pll*$%S6cYOefyz40$cbqD7xJNwf>ti#ZoCrMG7#I)OT3WI{2__R5 zkbLsg4jd79KNpcGPENklcz-C|Kq7YA8%@^N2k`5_rnpBKoXmXt(qPWOIN>X;F;@KWvHlPp!S7K9gy1en$0fN*m7{+} z&Cof8!juQAMO|{Iw|u85go*gYoK8{YyTzMps_K%CNu-Py=+8`YAH2c~Np6@UGA^Dg z^WFx?4}CqoH#9@>T(5hyS$VdFiqGCA=`O%6+pFrq?LAC2hmQ%M>}#pnYBrXBJwV*{ zI;FItm{upXYt~pxKT~+s`skD=rcwXb=wMduem|D6_eBeXMCZ2<0s-Uqgn;yD;&{AV zdqdoX6Wf=ReE`UYlL_7x9u}%g~}=xkA+k&RC{t>uKvBHc^luvE?37 zOxB0L`v$<+?>~4QUP1#5&tZGdYYYNTI#mPjhpKx~P+oaGL3!~fRfeMHy54tt2HOXs z?sT(^OTPdIrQJnI8B$VGBd zO%*55)>M_w8Zwv_NpDwvSEh5DD5<1rA-{AvoybfYYq`EbOexy0@q+VanIx}E&Prul zDM`pKrQkE;8SomvkKe#|FnXR;8Ms3Wq*5~ZC3@B6GRV~mXMc{*v&#h|$aI06xm!MB zXP)929$!E=Z;(V}awOchC-@D^{@S4uc9P_09TAf)MIz60c4HBthrYil1K>ad94r=< zt_@Ki8!OPag+ryjUN(k-q!A=i&o686Krl(%pPRqpLUD{rQb-VlauXF*>w7Lm`qu@mt>JMk^Kz6tU;X^1 zeXHVOdR0}WMW%t1J1AFQSLSndURv{rXUv`yxN(RPXP@y_mafvwsu}Ha5%rGlb-=8crH9c(4jBA_SX}mp3|SwVOkm^ACzYNl-XU;`q$J2zIG@E zkYq}vb;{Sp$EIv;Em|y)19v0@Sx+Zj-o2(?Bcu_2(qU7+4#RkqNA#@p`mg5R|F9zi z+S^(4xcU`29!IGD;T1a+3VkjUmYnMkmCgYI27SHootf3Gy}Zq%?6=G|6#?XDe>A5( z$5`#{GGoNqwc<<|=l8&37?}`nYKj=KK6wlfEU=ArD!0X(gj{F*pHKdhj{TNZIYr|b z3$?b*E!&y|ypz@09HWVh<(nVXxGqNjtbjIka}MUhXNbT+8&=%02CpAnfy5&3<8kk~ zsFNuuY}1i7hx0#kb@*q@UljC#_;xpN&CdT;9loC6M{!a2t-3U1>ZFAjF!i1fZca#} zrHyO?{+9#nK==h$O<&!Cx{TZOH3PZw@RWMC1dsUrt5)%`(LpD-d&-6{rp|R=zM!8` z{53AW7nUP~uT0Jv9G)E<{B>BZ%2ARi3_Wy^LQg;K?ejH5kJE!umbfIRvwe4QgKpVf zv)5VLB?fHFNu2INK@yvHj$qe?!%G4S`m8o>cg8hC#LCK6xc@(^;S1e+n9n2iJVzsB zPB<03w93lUZf#kdAu|mjwy5amt8b@n*7`;Ax<&+1P!~YMBus0_9BI(sz2U&bop*B5 zWwtnEru4Xl67z)r32HRSGZNRM&JV!qawsYa!#>SXp)4pV!bXp1LHw<^{QWxoPdQSj z6Kw~IZ>M=D?W1c#p?n~IN5lIGqytRX{_I-~W*vy>2oue;bP|!_OCfQ6vnlZ5ZSKsQ z{sX~B-_XC1hzl~Zm~A%(QchMXWofV*Aijnb|H(r-&B)6u`rIX~pYP8^pB>ZvONR2NUiJNqva9-Wer$oMsTr`}_EBOQR68xsjqTeS z4_osB?7cI7JDYK7QlI5^ToRwZR)nj7*UAFt)a23EBkX&}crG*4XL9c#AIo}w?JQR+ zt@4u24GoL(JHab!B+pHEliAj}pAyAcxy#OYGdxgva&LW4Le8&p?5L}>Si0h%3Hy)}L6S52f;1q1G5G;`!O^ zz`%Je$C$0A?Oj4)dS?5$9&?bbg(cOF=y-=9@gl{aBqV1#9UUEjgT<^oPta&L=kjGa zJ1XG7eDnYy2^d&9IVP*X^FSSlU87FHbtIsHc#j(eg;w3Ao=zX3cm`M8@W@2LF9agc z4=HorcJqWjyA!NGE6y93*00?pw6ibL4P0TtC*&|4eJ&<5IjRMX!cWzY@)+oaJ~D7k zkf=Q#1&>>vsb=J)c1)8 z@VC#hC|12vUu%M?vjGS(LzD%v7u-&Q4VIv$xPe(u(_%ur}3}ssDNP zqlH0I8c|deJ2Jb`UN#W;t{w=pBVYHC-TkRDe7rS|*25@1wtTXZR6U)IF~=mIWxCx( z#j;h5>LVo+o|vz}gwb8*k$OivNNZ&|nm@x{zwUT#95Lb_hbX=-D^E)oyH>Q4qz{r` z))CZytoY6;2yOq*$wR!@pDMh+y$*v#!x9roNeHI&OPiWr?M95|ZsZ=~cZeUa@aR|B zH(Vp@DlLHO8Z>J8ShW(7rd{Ri@9kN8=ttiY@M_d}+U7-%=39*^6_5e@AikvkYvhD&IE~$inOj)Fbj&o(<)eCVG+`J%fb~JABM3f0Q16 zb(A_S=kcX2PCclc2;9;t+Z)kBl zMtq+D6nRoZ`c@!UiZ2U0wemEd={})`^zhR|4ipv9Rqe8^M|tDGf`_fdC6n>*6I!ii z2$FYqHQ#vP9V@c#Y}!*!wD$>F%c~DnhGJLBkHy2R$%LZqmgPZtP~d)_h_+(e%(7-&MPf- zK5p-m`yvOlMo36F#5KgCU9{p-<8$o2m#~g;gvlFt4=k}SQf1yFYlXdqS64o<@~6A! z^FCfaCw9Tp${1~JZT=-`i>GD_>5J{+ch*>QP%P4D+;j%p-RD{Ig57Mr@NElJYRCYW zdV%IMn)8?#oGYf*rsJT+AsvQjib>Cf$x<_b2_whpnCZAK*7U6Lt=^7P&C_tT^dQlz+wZpy z?p60RXz|sWle{8N9Q=;o{3G?ft(_fJ_4$XKRDYi}*4v$~5fu>!JFDyQt*YR~a|vc> z=1TkLYo&1q6^(f{dUe^kT^Ub~{mq5Ig&QB{AP+#JX6Qh0X`9tD+AJgdh8j;nf4kB! zmhTb!UF;WMHopwqzY4P>Sr!diHij|)b}=I(UCk79$HuuxhWV9^LSW&O#EyA+~m4!=l zxo4(lKge0x_>laIQ22FpFvAN zG8*dPBXbLj)&2cI=DQdpn!Nh@o9vvn~ii2k#xu(j_6@J%aVgyjz%I%`ZiSpEvf5{@G+4D3KqoQ2yAD-h&?Ck6& zB_;JIi&}ZnsdYWs;Aa#*l)Z}=`s&Ez6DL|XOCp7_%7BEjo+5-g;gO3*)EsQ z#kq;Uff03D+}zCE+(JhQjHy%g&d0Y;k@Noj|Dkv*nPZ2EnO%*jh&7npqVATgP$8~A z46Fy<&P^nmlTe!j`k)B$tBW`#{S(WL?QMlSGD6$dE9_804n2g6_c=Z3zb&qa>g%$x zWY#r9%p3gqQ=?i|=SzW9c{p<@C0MX`otb`@AJkMkgFCIQ zg9We28`~vDc2z#1HPCc}Z}N$yyDHi!dicKikQbfmVXE&<8EqB(ca^3AkvhA4)^O*B z9T7y8OH~Gk${Wz*xpDCL-1bouQVDszWZ<_983&43m_*rb4;iT@9J~gW4=KG*A}cD` zXFu0lnB$~+UV7C9?3SFpVkxT`_cgY&CuFPBHn{e%kncSX-tR)#^+4C zZvmNGmO#PXk#2D%=1gz4?_%u^51-h2P|8TZ_Czg$L-9<4p>hI-e#)|zuZ&+icl?^w9H4MvI_$YMh_ z{ft)U<_1b}%sn{ivdZUsDPz?;zGrao+!gLqba9q0oYiIf)_XhVCdF@03|8ue4&&4C ziSlysi=D+uZVOjx4fm6gb;rd{GGtsjV&slXy5@5;ht7k9~!M+>3)!_g4((AEgbR17*#<(N_KjhQsH9(u>oc`IO@vC{z4A0kKM%Sa$Y4mC< zD!3$qfwKg8uoJwq6a0RLiFldVx_YX2TA?(jHWFK&-RVWq+C8pvNyw%(rj?x8Ice+m z`gNdQaZPpQXk(Itg@v}hKFhc6L`Cz+O`vN$pvoiXY-_&SqB*_vKe&){naobM6l^GT zL?!_thz&BJ!#1;1VQ$kc~5I>K+?xLa`Jk!V5mc(*-C7Ec_z%pE6K@n~{jm1f{& zWm7C(jr9Ie(7g1v^`v7=$Xg+yo)df5qYY~FQgiS6$KmI8Mtnr~y{qLl{f|>6|GXQr z3l3k&;z?k_sy4U=TC(+(^a;!hxOtiliIr4`xehE%ef`F3)wxBxy14d)_HS$04{?#G zIH;z>vUk|qAX0AHC*;kDSAu4^C&!-%7Etr{G!;kN6^AN4Gk|$j7gcQm-3N8h?2|w>zxln8mywoujbFybxaqVn zoR7j<@JrGNMBu-AfcKvy-YiXdw)9Ppqz?lkV%{LTvKca^wo1@gb*c{@dcd0k4yt@b zgd~((iFFJ3mIi!rTmN8~p!CK%kQNQDd~Qnn^r`9HrQpG>NV?!BqQ#vmX2kSqeIh*k7(?M` z1+2U9v+a~f-_BJWQYDW7f{N8Y)Sx*FE?LUCTOz4dp2tghL2W@SW@(hw^cYox+rhl9 zdxeTqh1zOUYT9W&1MJq#<{zF7Ek_Scf~P~#Sv-JSz9h0v_2io!ibyx9?9P|5fn5v+ zm0kL6p777kJ83DCwglnld0$_N8xerf2IdR3@6j@;5z-%ijzXa>u3r#F6K0>wsONWx zFM7XUot!25^)~H86@yZGmHA;ZkT)o>C`fbx;Vn>H^URQcN%_+npls#+`v;R~Gt0v% zB>#S#Nw>ax#)bO+i|g*Esv;5jH{b@Pt{ZlQ$m$K}{uIvuwRO=vraoBfA6V<7hnzGy zM-$XpgNv4mL;>zsGPJh=J%73$)rPs-&X${;;?1nD!qfeM@+wt&y zl60I;lAi)4=GTYwNI7&BaRe#-y@q1t+TM#7X!QKvGPyuS`$Ux0a*_PCNvxi}9$Qme z#qXq~IJ^gsA0=VSI6DA`SZT4Hx~qk6y}@q;`I6WK0vytbBF@}tE3*Hpl%LX-8l`}b zYlFAY)q5)snro-ilKG=d7ERWcbID(ON7h-t4jiG*H!ATVcvwBTUUqumE5o6I7`9M5 zIsA{wZnhSQA|@AY`#27N!|HX@+PaV~ATbH^W)!Sm<$N95%>j`#nZla){ilNi+3(<28qb$maz%=faV z6ZC4Tk+tiPdu`EZ_ERbjQgAMFRcBkXQ#l43Wc3LF8#Hc784ZUja&Rg!!;?3WX5oLx_|>tJnUS?2(H*G8>Ms+ z-ER^?#Qr@%nJ_lyc683JMh_9%*nDW)!T(%%jENX6d|KOhzV;NJIL+HcL~CPbS<1fQ zhyOBCjXl5FV`9kvug~tq#U!o5e~)0Kzo+&J_9^wL4yt+$ue*5ZcuY)IS~wg(Nlr?- zb^Dh6Yz-_sTT)mR!G2*k;}HHJyn+5djxcr-qf1W%J-sLHT=qlHOi-Tp0$Z=lWcsx> zC{-JE2k=yuPi>I=3(+i}#lXGG;yH=vU%EK9wydcO>R31VY1h2*S`DKvLBT0DNG$_> zMSn4)|5EY}=~w^YDLVrDK(%JjYr~V9?qPzjiD6}&-5XvbWO1yl9KNglpy2aQv~AAM zF7+MxR8xT{l=0^fJT9%OMtTm3vd#l|gxR)I_^s}tv6EKc*=6*F{C??MIDfK9pO{;D zNY^WVHZy8LBZ%wrMzqoBz52t%e1Qhkv(HrFcf_CJ{dz(*;XjvoO3lo{F`njeyk|y4 zL`0I}O0<%1MG~7H?>F54Dk$T7H3BgMffy_-F2Ga8xIvfG*yF(5NXg3HX3g%W@X+v2 zPv$r$Ezpz`YT{pFz)6)JRI)DjgSjFJzWpuej!FeP%#XqBh8ALC zN>}C!4PD)&m3WgDh+@4g4ioG1X91?Brj{~>ICmd#zN63ZTUk#q@;R=zNKX-VC;{`|rJ-Ji9%v6>Ii7{`GL8Qv%Lx9*b)2nd0}eyWHk7Y7HrEmCZR zMORBtOJCoc^O%9N_S9U@pRCT8_=IrzTAudP$Qk znxQ=>3tvAu$D3n_BuT8pm^6FRb~m5sS({7GXsUX@c3@B*OQ#?8?6W&8%x(F}yUxY_ z6*{2RRVk3xEI#3FD{tSF0;7)O`ijzZvP0DI*^4%}FC`tb`ocPEA480>A8Wz(#jZ~M zlhBoD?Y1!+Xqw)+^X1~d>fbNF!5RH0iGOu1I{V7VhNyQoKtN2@boT<6fC2Ijwci`` zE+$z$hsHv#Z8d-Wf^W+IfJ6LJ&Cn3FxY#!TK2{!z93H-XF7@{4uAa?aY&ZG1Lu~J| zNoP2HTWOM8E0oSK;v!x`__N>kQX2DfxE|N8c>9>kwuD3~+M`^!LN3)fE}k8NMAFn9qKknM(HDj^nSWV0T5gz?`u)nYljF+Ogi;7{ zcCy6JrW%8;&L|$e@ZITpMW;1{{B<#nZkeewUaTpe2Chz4z*zeH8QpMNf?D*Mo}Bar ztpo715EY&ZHVTD-UGGl5uCt)@j9pajfmPz*f8;hCq~wj+va+{c+4Z>o@w$=keq3SU z#mm-H?DlM}d&UYH6vNWfTbBv5ew_9}pAE$&%hw3I5F;D&^$zrgV(CWl(J|yQ&^LXG z#h}6{Y5GAm-djI3goj&aB)>QeX##ufv zWH<^!EJ#O&xB?W;z_ z#0K^AJ)jrsaR0t@Ush#Bg&TS*#aU1WJ$Vm{^sa6Ek^+T7KiWy9q$H1*&U$REIo3ni zd5Dm{@Pgpr7gUkjz&zmqZ>E!pAe1O7DvD<{;PLJ+Lhaky+jsYM&(u3(p(TQ`kz&VB zpFb~yLU~!ZH_yS)mhw?$S#tE-jtJ$h@xXW+><1g`;|E*EztFo(>Zv&^Bz z8)|a-7#ZCcgZeZz$K5k3D~C57nl`o;L>?JIg(bb-A$~6M(U?BvmJ6Mwe#Cn#Pv_c) zdA}Z60c5FV$Wo=D83+-Sw#aM z;zLTxrZb1g<_Zck9N985Hg<8;24C$@^WU!44ltL1$p?Q8#lbl+YVZg&q<{1LQRbT$ z;L-mW^otbT%c-G0N*cB>+{JlcK%rFqWcmF9-ZIGF=KzfvhR3{qqh+YBO~@(q*!rjDI=%^lCF#)Hk&q$@SYy) zU#-W3oT{ZQ7%f-LLx1Nt4^Y?Nnw#_aoz)EtM4^nX3#HjxfQEqN0<+^=4J zoQfwcZ8-ruxEg-t0`jfaQj1}y`>ZqR`dFUTwuO=PJ`Q-&KHK5iK%%XrI00l?FP_f< z!@0;QVtC5@sTV1HhLnu}vq%$>P{9s6AA6$o@FVcy535*y!@1HPg?#-waF!OGe%!I? zP+eW^nnC=fZ9V%TaH%n>taG`&Ra>|Sxz$2j|3ZD<>5a*cc3^InzWOo!+;||1E5Qoo_S)3sL0kg@D)6 z8Vox-ZIa=2B|5=XURKLj5jjre8vybdxcIrmbX^-xSOV)1?qXhCdU~c^{wtiM7sftV zmA*tl-{Vkdatm?jE1ST94>T5E~oow>Ow4&DuW> zmvQI;#8Ce2#q-0TH?Zq?U%}J?=+XU#swF2;291sWFF0wKST=`>Cb>ULb|Bs}-IzRm z@E{y?$ur$>7*#mn17+zlgl>+GgP6-9rPnimZv1Q;mUNJ}vYLG9_6A!D95Fx(6#3|0 zJD7(Mkdk8O+VJt^~(=Sk5E}COC6(bDi>jL8OY92a$xK-(kD^ zSW|K1UyDuidB?W$a`HWuPTvKni&o?%bO=KcB^)^B zBhx8dIO{uqoPgb$93L3?emXYcSbhf|?d!a+_K{q8|`j=aJ;j^e+jUHfX6l{74}&) zPJYyvR>#m#jI)Tt-qp1a)Eg=pLc{t=;8qLFQ($#A5bZnd?>X&{ou3sZ)M~r9m~Krx zR)Xigij7Z}Zm7W$9!~!3teAfMCxK&iYI>Ty`FHGnrUnkcU>i8kw~)j--q@b1Z$$rv zo$*Ica<5jwHo*EVZMi7%^h0on7iSMzMv5Q*m=ELjLK`(D$~Q!q`?hfwNJ>cJQ6b$G z@IEw5HNdE&4 z?T~IGO^8nSJUP(K;y&2>rXuP$EaoT4m2`!Rgri`j?9Z?UL#?eoz&NmZIrGvbojSpb zQz`QeP{fL!OthWLJCMP!Ha6CcD6z2@BG)vSHBC%Ry0a_rM2eL*VNN9FxiLd10;?1tt*%1!7?GiP;uDeNI6}w!5NV>VMjY zoyjODiA#z;ww7KAjq63h(CM!xX=fahL$1?Nb0^}$n6_`@YSP8Yv-GeiXNXlgciJm` zV`um#=-vP46xA{wRUUum$dQZ3GqhcSgi6dMr}@H*b|t~cFHR0>Z(p*%0^dd>zD}RA zu@&bij9E=kUYlVV16txjhvqeO#OC-vukGJJ0aG237i#vuZ{)4HG-PMDea06b7?}9M zU&gu4m+t=Z`(@_mFDew`x>{OD{qnw)ntOo~bQQ!i<&z8zDiq&(mwgiwdJpacDqhHS z!6!=I?A~|085ui4t6^>JdFGp!xXQba&mD&{L;}_Fi%Lq6)z0u=H@?^(5t4+t0!^|{ zIfi9B7O-6;x-P{|6Xl^#_>;Z;v0~E!#VH;eYip0~@B9QG<$D??PdI8*bc&go87OK2 z!9&~_Quy-5zYdCPAEbtg^Z2h-cBze&M#7VXPlL2ue8l`G_n^J;95AP4>vs}r;1D%_ zWsH3Xp16R?%E8Cl&hoMsrNuC$s61^nP%?=L@w>XYZ77vDsnT0I@tD44N>8cux8g~L z!On-_BDzLK{xnR-LCcIv>2E^FV3E}dvLJ4rT0k}5{tnMDGd-vltAh? zW;3!E7$~l}2%Y!w8+q?_Tl^MEn`^$<)5phmFSM6*$KNTuDfx;a?mIZNu5ttB`Xyfz z<5ut4M+!z#l1`TjzIh(or_UcC6X4o1#1LRR-H_c`B8P{Ei4?=^tlC_5zH=p$ug}k) zT(i@yJb{T{9s!_8%{0ToV16ipnxR&vyC?@J7(7pfUc7i&TI1dJ)`g5ac=U3<a zjn{AQ#JpF$?{jn%>R~G(pn{U z0aBFj`sOAPg^2l6ZjrLfxf@tfsS5?^s_N?VgGCM)F$S}n{=zsF^(dQL0JLZT@1hSCAo0D|LBDN$U54IJpr&b}VK^%v)gf>A$uw6?L4C49aV zBGBit1j`3SM3tknu2oX*<&=`}HK1@v6LPIU#h#sgG8#V@dw!~Ls`;K7&@<*Mt1Bz}A~^sT@e(5zDB*cD_{Al%4IF(yz7vDI zb9}P&4Zh^m4&LqWX&%FPA7rTgr5s*D0X_(DS=~Mm|M<^0_ep9<7=N(c6`QGC9^iTbw|_>MOUTd#z%n`*;<2THjRsjTtv zADw}@P^b-6aR1`oLC_S?<+Pktp$@fY6$LUT5F@M!y@iD~5fp-$vq}!WOaA9-Ql>{0 zW(p^UE+!`G*k$Ip9*33-fKzBSsW8oz~YkbJz$Hij1mZ5+J3)m|B*E<0szXI4P; zZ_{$t)XDdhIZmG8+q$yVhLw^m`ndGEUy~%lEGM%gT{>pN&;XQ_9hBmIeFiH=)5SLSa1%gxcv$;s^ z<3axXgO*i;*)qC1I**-p!2TH&)bZylpd>e%nVT1%F4uyaEk8d$5s{m}{d>9=rx&&r?V+0L@xASa@2e#Zj>-c=P9_|NYjzJLFTd`JeGG5A15<8u^! z=PnHvdH&(ea}S%t6rjILBGU!eRLZL_fZI(|WB}IM`i6$vw{Iz?bIGCeSEV^lPN`d5 zot^1LMP^|ah)HMgN80J>i`j~Sn;E`(KkzS5?##_`5=PI%MEkdbZ1#SAK?el{J+2i# zx$pq<6c_4jR|GiB@4+}zxKvv=^RE-t32 z8xqPZDhf(VspquUm1EK$1Cyl^4q2CC%mViGRwp>Q9wXWF(zms%WPtUijt&4wLcZTf z8K(iMLGLXjuG}?OHu;wx)D2P(|2x^|7clN!`%WFh@$Aa&2G&|f4Y=ifjY_}$coa(J z@^BRA<%Z7a_DNzUT` zMs#{|{U4xHZ5nW6-a&akXBOHU9XF&AWsG6wcbMXGozi#~bMgW}5%%^%K^ccT&1-9I zjV$+-@$!=PHGoM0H+b3P7C3*A5z|il|3i41NwBVF&VEjFYVD-1PZ=jqe0K}5C14ac z?leEyPAhJqKC(3bZP4J%Qrh@1p{B4N_NxQoXuYOJqcU>-8JP2EKR)=<-d57I2+e_< z?VLw~x3^}mgjlrMO!ng4vw+_zU*(~Gd+VLaEzZtP7oeEaSS(Z1h)zo-)gFh)We;t? zE*Z?u)4#Xvh1)8Z5NVYE2Ne}s&yb69^NaRVSG-N2SKEH6p`}0Kd-ACqzkc$Bwu$I! zR(>rg@4g)Ah_&lRI}h-lb!FeagSB2=feax6cvD3!#(ApdQQIUNYRG$@eJIEgWYbRMSjh%#~QiGvNjy2fc}k z>m}0G7gl1Oe}-vZ3coIiLJ42iLI>Cp?t8}yGI;cMdV;hQLt<-nsBZb9=wu=JYm^XUK>DLQ(BL)moGd>yV_$UONj369&%> zU|b%_A43aC`KT`4)&n}XrPv$VlczTLGR}Slv_CjZ>f$EksU6QFPVMICg$OQ_sYfI^ zhLI>tF-GXV?Wi3|v9~i9ADK6hghl~mK`6_9?2xih=g7#U(HvEg{`X~Tugy4~*A~K` zEf@}P<^_*1HWz(?q~shKgR>1~f)M@4e{;@-Ur9)0MMkO^8XD^9c}YnLFfT=DL}eIh zY90c0*h%=Fq}}6R?H!G$QXxf^6&KbcYwHa}aC52xYgPlXT_zjnP8;pW{$B~(XLyWu z71i%C?qM&yD07_TR^oo|esl(E7Pof>&YF1|6r19`9SBwC1PYZ&8ttyf2b*N`8y!Oi z7Jm5qNnK_sPb%lRGX_$I45P>OQlY}o%H|>=tI{O*9J2w9YPCTpUfA9N!|86}8pD|% zo5Ii=b_bgm;X2=iRsYXytfav!HkKMbDYMH-$Ac6w#FNvw^>TLU-g?s48`tfl)g=-v zfeiibw9npY-GOLfu1KE#-cDfOUnR$Taw>yAc={gs*LL|w`Vl5Hc>8VL=wO3M4w*AL zmGe2TU1*v4?nVWi6X& z&3wn?s*`spPoovo3AV1B=IG?yN$B2)MEX(A$es7m8r zpd1oF@XpTUbHQUNt6LV9JYE2=(SIw1bzlBn9oiK1-P+)SzuWv=tbZkaWM!{>4ivH{ z^)6P$bkXh)CF*R&XaYL<=%v`=++#Maa(mM9{2#bPh90C?FQE-?E1-=wM{zSP677?M ziahSO=w!;^%ml#al0wcHor-3Xo#0q^T_sPszp#J`kSVM>I9L#)aLe8V82j@TK2$-q zuw2=k*e1IXT8hw_VlWmW>Qn(8x9`l?PPC>WOzN^So2JL0Z3qO}$sJtv3to*gE0~jl zpcvT}rhi2DJa;h^-cV*4s1~7#bibOsX&MYBJTjj~kQEy&Y+a%k_{TJ5a%ch)5f|3J zwmYSN3-HM5pH6aF7KFrcr}ZsPdMBMq)jl%VLeu_m2|{`XNI)Y%o(zfHHBtS`7Jii9 zInl_CpLR6#fB`~mtr`C41MlxSx$g(Qk|K4+AAd3%=6xK8{;vm4G&8F2Vg7h!$ z9-OF93VEz8h13C?2AD$w)Hz^S)z{Z=^jZIE+HAq4@|rWAsdYookyti zbDV6A-L&7jnwzBWXL;z!LN9zq6w!T1!hcJ@#j*7o*Fe~PeYPYxA-&i@N3 zOM-6f4OERyuPop(pNF-t@A(+pG`pdqosAtZdbj_U=Fn|O>@&xX$z|r`n2tvnXqQ0Z zdd>RT*%jhhLxXv8ITfgrxoGa{ApZi{6y~htD=Xf5?ZoSQ-wpCYend15~;1;QDuyFvEB6e{A?nWUIAsc9RsslUD_d)JW2d(?e)k0l#H41KW08KaGB~Lu~1BBg3Fmba- zyVM_LsX+(q&U1`u$}&~0$O2c}d>PG18B?74CKZW5JdOSgM!f|vt&$%#y(Oq^5WM^} zKo`4qP^``p2Ua80M&0+GQgPIwL%%4m3~j*w9f|h%QSSI=+bQ)`jb_x_)rE_TyH*@K z|7$;^< zTNk@Q@lXDSFokfQPc=N#)vzYkWQ<1!>?oT!df+t!nx)irA}iLCCRq9I9@$5mfok_j z$V{_&0D-5>eOSigEED}Z06wwXFqZQb43sy~7fL>r8q`66^9n?ttqFz&xXE3sy$_rQ z$;ob5SRoD#$eW6YhzPkG0;7+S2c_9DhDC`eXJ@BuC%B9>!{2l9L@83lZJT`!3?hNR z(8zBYI#JHK)Y944bcwtJyl)2Q{nHJVPlzaT>g#22$hOh5(`;rA)DCu6JxX?+7yh8P zD;f_*8>@+PoDMKwwwvt{;i^Q37`thUzVv+IWL%mhfaCs$d?xs%ZBQ{u#B2zF|1Lnp zO!MA`!nuJYNK0YLXG5g8ieL7;eKF?eX;(i#Zwy>gAe&|Z2p!P%04cl-D$RrCahtwB zB{N|uT&{cf;Vo63`y_M^n0IIQR@S9aV|02d?ViVzz#G zZ|LO|o^=q=5tbk19m-=Nx8HxuU9G zYYJjVEEGmSYh&{xcy>+*J82`s5NA#%0u$ReHJDPpt!)YZxtKL?cTacv$7{vrTdf|{ zBBG*Tm~?TtI&0)tt;O;1384s>cl}8el-&Og2OqP@#qaFo1kkt;u0d<$Yk&~Oofq#s zzMn4V8P$oPrZ~ihg-;(Fuz{W*cS7g+S(wTl8z3sqoDa!)71=?=5OF!*NDcgrRnACS$@K4M7YrLi=GOxX*C&)f6M=c}0-$T1hyRe2z?gK!NJT?J36;E{y(X7XvaGZd0FvU8qFq`(s~;5 z?MlaT=E!IO7KK(-9?I*rue0GTqO-Ur>G*(B=;nY8$=&*AAEqVrtQ)`&hgU{PNalAo z5z*<{U zy;n{n1T@saKG50Oj!l%+t8j@%!F@r7iRWGp_-GYqqYoxN-L9w5w*MZLeAYAcLDCKMK${(%s{z;Bh4T+PTovGp)e__tfkPs?Io}k=)ZY$v}O|N zB7RB%km|wr$PUObg?J8`YimEitLb$C`D8DgUugkv@8}p>uPdO>HfXy`1NgP+iZidl z9YyzkhnT6ux>p-Ml@d|{Is~Y)k82TlR^&8GZ-%5DI=?3ox^u1<6?DXedFF-M?8U42 z#3-BKx_W54)Qmnuuj(}3>zsvZF;DkYq&N{Nv8L(#Rfq~C-+zdsnsPC2*!`W_f%(>F z4lZmsC!runNy|tKrYPulaOhE~cr5DoJIEck=D~nANj`f0+RLEM{VB){gx5shvSS2b zocsIwHp|Pj$5B=R1RNZ2ObrHuv3XEwFau#@{d0M?UkbdBc4Q3S^7$iT9CHdFOa1Vp?B0QzK_7{oebqEk~)Z`7{c^ejDD|(#O$DprEHOoIG@| z-#+|QH8VDHH<;HxgvrzKy1lAzmH9hvK_IfboyHVjWgmGtnd-nRypf*VQPG0ui#f!M zgNn3S6Cv=kIG#tVXX?pOKS&FFSobB-^Yw^DYMs|yV~k0Q>sW&7x?;1!hmX$j)nf`z zSnNFix-Ug75&9nWUe@{zG*Pkj@ zn5G7SfVqR1eHBq0BN%WoX<#mh{K@;#6@ z>regRorGIc9%*X>QZg#((CH*Kf7<-2zExWUpkvL5GKy?U6dQcb7y_{W5CXZ;vhhDd z?d)yH1Oiv*W?~a27O#2QwI^w1R`M>Ik_Ssbry~vg*uoB|)f0Y3B(u;7Hqp7?fBU8e zXB$9L7@=xOF{z;a^T>|24Is=q7wH+Eot&Jwa5ylGv`ho_lr&DXyjij$VM?DNxXaD@ z?a$ERi-IPSkoCcjvYj$8srWJSs_rmLxWvtU+in|tZi*lk(%O1sQ(lJ|=+u*Dwn}ss zBJd=Flj{9csFnC{me*x_)6x0Wo=)I05Z&2+;ka%cBgKHXn>4W4Nb*-oW3HGxm+SaN zz+rNBF;)XLI!6tW2cl%1>o#4 z`3Jt8?DqUQDYw_1U7mfkd4uKrdeKXN3-GezhVUdtmUqefe6y?+YkoaQi@9kJ)wnuaD|j=$a<)>tN60(vg6dO~u|2V30E^_9LMdcJo0aeL*$DC*)yBO;B5# zAYE_#eR!$G3miP(xT56m(yRbag}LRKXC}3)hk{b7z{O{*ctK%dZPg<}iT-p!V0kHA zmk?{EltWG-C->(5j8`2$1vrIk*e<2cmc=BTR$sQ_UTvhh03 z^m4C7pRk)XV6WjYP>R^i5X_l3VEX1VmY^HxMplwyfi{@lR=rzM69g8-SZ3wp)K`y* zqx(5EWrd_cawqM2@_`frr(yrrYh@nxFjHCfyI%%y!~^EEK*$LgA~w2jPr_^>Q3nD0 zA^0L5;+(b!5*U+mzw*^A0ldT9bS%Qcr`h;oB)Xx7z944q!d}|YVdvPlsKX+on2n9e zpusi-1lxT6^)z5S_Zj^fXt<{#2ACKLILutbbajkMvW4~)#M$OaHNY8uP9 zsseIq8oFv@;{tt`ro=hD*)2&mT04W-0z7T{s`zSNf_s5IZ>{2g#Pq(`!F=ppW;ZGa zC0pNct}@KzlLfXCUYtB{r}5>L$)^B`U-gx%B&?|_ID+0Qh?_hzv^mAu_1{IDck5&h z^@#7*kvZhZ`YT`7532d9@Dq}Ck;C# zT0M7ZPSO^iYrx!en3HlCKvPLOAOz~{Pf7!ViFyPbD8&+7d?U!iU14ogIJjs)Tq2O@ znkn^nYJ)t~dv-m_c=A6qNB(&3A#Og0DW~NgO@99KT%vF#r3UzGh5$=cbA`^yHV(yA z@14>Do-_)E^WB{pCFi!=wX^=*KdZO1b=Ch1>o{QP=#3wlVpgdGxXroJediM??lhhA z1QN+lQlzrjd+jVOp9Q?Hr=SS0jow;_#q^K8$RKCzRMLSEk<=E|tV#3(JB7j#MW&-d zlU^J^_OU4qr(9s?;k^D$b+*O-4T4m1lVi04OoMs}aF)?&6lzkcal(I(tgXoUSX`0= zSICcg<`QP7#P{xzeVR|4`)lJ(lRaPGLo^(`b58XrMJafK@Si=gFLw(YAm*m&RUwd{ zT$MBdZ`Kt-_~0Wh=Cu46S2ZuIXSeh!&HF^k&~x#9`ket^IoUms%!&+^k(H60+@|GT zsm5T=hNc`l;4stI*R#(S8W9Z#v6!f>q{{mw{T!^U1tlfYv>^mTBZewCgczPGfa;Cu z5_(pl>^5%fwUNw%O*{3DRj>pb^mTSvCNx>v1jlnGUU~3BCWyUhcv3_tg|UQrNjQAS zSL3f~gfhRjp7ZY0UWD=-QoE<9c1M|i-hC{=Z3MEcV|1xGsg+#pE68;fR&?{hgP&25 zp$C<+0s+^$itEx+Vm*w(cmhx*yi|@S!Pxel#5=5%8W5Z2StO`F+uPgo6iIi($pOMq z0Hsf10rxy^bH&ql+uHBS6ML62iR3Z(M{epSk~e66|0-9&KLcb+6#X_O1rE)vTY-j# z2GR&wIpuBuaTik@dRv@XoW=&cG#t+d$P=@{h^MvnjE_>pyNr3&?eu?8mA98^=_?`t z$q;PT=QFfkEb4md@Bc+WYfLTjdi=v|@;Ar~(BO+r?Gq7TJTb%zEA$LN^mDf`#R5}B z`ha&R1=-gi^1Yglh~#&jOjxXeB7MS`83jK!%=o>xec`BHYG#arz5>@_3D08@ZkT*7 zL8u#0Hdl-7=P3R5sY%*C45N;)a()$>ALjoL08_$i){zxkObUx}EZsW#iWTFg^D&H$e|-Ok>azR@FA99yM-OGUdII*u=RyZ7gg zGL*ZoDcf2dKjpN;sVG(Ro^J1`i>^Yk*}%v@9oe7Zm9H(sZoUv%URmMg=a-S*FhUHi z9{^Lq{wh&}ziDSg+P09pE}(2IEGoB0z{EUu0OgI!dnqI|^xljLaC22mZc#bYC!4=Y zBD>)WNiHsCqj`3!R^uiQBbAe_kh#_UC}RiAR5vsG$;evFI1ci9+F zgn*G9YHHA|-ptHw*DvJ1gPWfDb9mK|qpJ zo0Q>OCYGlbWE>3VDgUz&8XM|`goQK2Tvrg2`<4+o#`e~Bb}R4s_Fv{{An3nWk3s&3 zZ?95hP46o(qY<7f{CFwi{3le*%N>&+$b;Oe^Eh4mG?QN6^9>!r=ACF~w@B8rM#hDu=$GVlPd!nHIMef4W9(~*X=^!PX#&@l z*B3<7@)bSG7wU0k-+pLdOth`j+xb9NC^!KS-whsC$X;vHdM81f0Ux)C$RQ*ob6oi| zxwi-G4&F2Ciyh(K%g}Mq;5D&gVrF8R`420TAPq^>8JXs>SX~P;W7oG9SikkCsj;Vn z^xWoCG<48wtpUBZCSV;q3&aPis;cYD%iZ(uinpA>8a~!VBkB|&LbhKXI&5& z7);P=UU{H34Z?%m5EB4hSlQhCYi6dnq~v1mtul{=tE0I8VD$xZkVpSiu>ErCUY1G1jomh-)!fcRp zv>a>zLyr_~Sj^CnXd^~QNQhOx+2x3W__lr6e4Hez&drCEJ!7Ygn*QNq7jkjf4n)-q z^J(Iaw@+P)a+c{!_XGu-`}$Ml@hV=Sy(q4T#K8RO4>o@6oA1BNfRP0msXnzNySG;} z1~1)yV00_diofpdemEyKynfyXAnwQO;nqf60-sQAjTL`vDLP6eo}m-&P&J{ewP#-l zdEmW%%=z0yMFfLMDRhO4d1JRyxZN@7Gv49)ZT}n3)G%WnbRDtVGo{)?z&e3R6>M}v z#dMnz5)y&{FVNU$ROw*T5%Ay7Ws@GsoR8yn8T0@(EXddZ%$)La&LcI*>EXlwJ7bhY zy&%>bem**(C(Pzz_1d@m!m!LKPj&tL0h$VveGZX`G(xCC(pJq^En1gA%nOt_-L=f+ zJ~l}M@(s-J(g<41o#u7wK?>Pt7MB!k)2rh;u{L4&uP>_uZR!wd+bgig_fp8;OHjA< z_&2BrsP0hR!y}W-8wRtY1lH{#Tkrl<-G~Sb_#g_4iU4{invf9CM9d2I|4^!bTqia1 zZ3ci@?mRdOQ6AR2EFdI!)ufz@GCUn^ImVEKka;;pMIn#5C?B~;nVL$0ZoD*9|M>P4LphURY2kovPq3-A zMK(Bh_Q%I-f$TSP#Q~tW0%Y;8I)Hj{g-bmJSh3Q`+tmP7m3+SMrjR!jL zf7t%yDW_DpOvV_GmiGO$<7{$5y|}fU6mD0|O{?`pt*)egL*qouzZQpIxTRSEFhGxu zX1@?i7ZE44>vPTTqHerU&HvvKrJ>hhFXsAJwihXhh*(lmdxB9^uc@~iniuuU5k-Z{@Vn>+WKKSN#IuBM1BgMo|GX~H<%&j2 z;nZWB8*lwJ41~yxMzZsJb$))$X#X8UUtgG`tEI;>t^p4fzu(rZ|2YvMS^whx4s_tf zqCS#;aXA)o^eI$oZbwCtdw|)bBX|TS~b0+=g zTUn0`!sb>0iUUJGpD8L{niZek#6fN_`)7K@+P5#GXjvHrF@cH1hjZK0$izS{q_{r1CrzgMq70)V166P2@2+LS>$mzaGn7y9u|v zqWpcJ!7S`^oHwBOhn6|5_p)UoPOhZ9tV6*SKz9@^`^ZhkUGnz7D5=-3z2NFg>pS2R)4{#1e!;W`Sw*+!5nePCIiL##5CXIqg^7n=%sBW<@EI{jN{+R zu=n~Y0#=`Z?+lHC0UsJTHi&T)&u^T~>S2P?V3f?A@9za(MYs^(yLF{+{w+uJhUOoR z-_`djtoHJQKOjj*vD5Ofj?|U^bRfmOZPHm{ClG%v=mrnYzr@&o^DzJZ-+{kfF&Y2$ z^`Gwo{Q7Ua+dsem{~d64jsN98@nt3z6aT-)m(>{zsNQ;8RTHtY*HGxH6nDrr3hqt| z{aX2utT#QH*2LlRdBcw>_#%5(?jO_MS7#x=&nO(t{jFaD_JF#WvM=ti9fbdc7rTZR zSFDon`)5b}- zRykpv?olj1X*G9x^Q~42{2SHwWq^Mpc5MfA!x{II>^NcTzs&`ItCU|507c8`Mmu;R zHaeUZS3riNy!Acs*Mb@rL}Y|xGVFVJCEJk{;H~h4k_8e^`sQ4M?9yuOE9NSYu7#i! zNWuUS=;V1uY+{vFTQ1XZ?w=&#JJolty?uI9G0 zS_a-yQ3`4OM7?rdgmQjec{N`xk7(r!(1F8Zn4t2WVw^xnFV*WeHC0= zp(Y7o>VW=4-Tp%(`7^XIE(s=UX~R@Tc-KzV^}TRtWSDr}<=kkYHb@{35AU1UH38`< zt?wR8eYXY5FY+;mL^0zHr|xkT+3@?V88;2< z(de(kjtOvW-cdk`vxsg3@tA{#G+yoTK8GIE+>;lraB0>CXttgH!pAUeZt`jUBU_ZE z3>q3;x!q@1Lg`I>t0e;gnNdR0=g30JuNut_b}CtLTlXCdd4Ls-iAz*F;*RyFgfPB;Nc?Jh8<-E>jdg>JRq_w7ecBIJ44-CU}lwFU_Ofc4&I~_~x8i6d-OK*;kKp)rj_sTxHZO8h$uMj?6Y+#h`50TVn zoO(h$9-h3Rq00|p+lh$}2n6)(fZJiL2SS7UHsf^~{kbm{!->w)ZhhA-R3&)L;3F6I zr7_0ka^O}L$5b~_C7uSHsyL%nwFRgSER2$Z@E@ou>V%d?IAV4Zxo=icrlL|~pN@G? z=I0iMQg~o`#!5*(!W1}!Nl$*{crlZ z1X1R`MYtwajP%_{w9OCfWVYNS{43}HPFfQGuz8oc!d5kT$&8k-Rk8I~o;H`y$Z9Xh zj0iSg%a-B7TI!fu`K0)FyuC^pbQa~r#x3jxJB*VTI28b5z4cY%6u=`SQUiz}FoJ_L z#F^>m%BP4P!p|5lO)U9pd0QK9I*k|`HF?c*LayN6+aTN=pQh>5lz^yE9l=)Kdxz&b zwebi|^(sEI5}V-TXh}ictDKlmSqUsto`;%Ag3ni*In_?B+6t=6({n8}j@|*)(g8(w zOJ|`9_0e5*%XwvG4L6xfD~zxy-@Dn*H>Z}r=-8f>#Te)LJd4CgjeUt!cJ>G`9#rs$ z3rAV!ydr5nr;mAyls)G^qMNOxCA-|S37hO=Jg!ceLhle0H`1S-QX}xy7X^@v5*;VU zEkj0!3n`z4TvU=Fn?flAA<2n9(a9q(fhd)6+T#O0Y7)h^v&vxs{UjZp0UoXT4Xou8lp_vHWHqAy6AJL`2O`yUoNnrZUP$6O6 zGYhnc_A*r*!C7lZ8~m2tRZ&!O1yg29A70cuR(^J+yBJ(Q#hG8Z!`*NvBjx*fotxUU zhL4<;k~Oib_-GKS=4$&@EW|1A-}DPi=%XGDf)4t5jUpXQ-vQRm2Na>fx>xL9gR@iS zBSA(n(czt=Yg--IQovF#7}&9BBBR&#!KUQHR5jV*oSy8j&spuLj!9>|dSZ{(sjz*2 zJQEY5z~F$(I`miR?>8ISVy(l+Zm_CNmSY@hXtoq0q+j?9u{#k`m=@18t7}K49pVaL z1>~h>WMuf?`2+9B{$mItm`S4XZG)#fkJRhQAL^Y3d)K(DN%()RC(sama>d2UHxPf| zsTZ1dDwiZd$Wxj}+W8K$HRsvs4*HQ=3JD^w$*^h|2%nku(=I(v&o`(W#}S6FzIKN& zCSpNKi~U#&5RS=#;`QwaGMd)xXw1tz7My?h&LAfPh^fLB)b~9c~5|zaPtW+|R-iTxno_shMLrRC9UsKDuErTj=TyP_4c zyx>_?amtZq;Yx>%fLcFpA-Sz-S)nJiR%q#!C)ZuA7K!mFPP2QHA|>~44_lp6r6t}z z|NE!*_p|mn%ObcjVkGE1G2I!ga3rV+B9+8Kum`OjMo2LyM>pS-%7!or*JFqk#5=H?sw7tz(%Rs^mV?zl^ z6QaOt34J}%CA#Z(_O{b~LrjL8#FqvSL9=n6WKIt)u*tycju8w%FYS;tQCd@lGCI~? zIVI%efE2*S9^%gi^OvT8>nQw4ThnrVZf+0b4))bo>3>>EJXV(7)f3e5TIWp?qzej* z7f$bBkdy3I?(W|ReFm%Ynd5Opu+4Lo2AueH-1n4eVjAq{6hO#vPInGa(*tUy`{U6} zX5o+$P>60HSlQMug4~Cdru~tplgemy>P!KFw=?j|?mJ7pdA-JIkl0VehQ>yoS6!;W z4xmP3|EJxR{pmpPd4E9O^45HSDRhW_Xb41mU8S?wfLUpJdOBG7Dz(Bug}~0ven6!5 zp6XV1vT%ynSHfo~T8b2~QE;0b$JviRu?i;C)J%w92zKpMW$RVwU3>1E zy}V%zSJ8Q;VVrWcBTr$UqWy$XH!=J@~(l0TVXh;o4hUo0yt%+pmsp z4aBuRZ6A!qkh9 zvz2M(#mY4TRLM4t+^Xt4O32^usbNpEx)Y+iqPZ-}`w`}K+saz@AwD9g+l{-!iOr_1 zmuAtORSD=!WZbTE1U&U{FFF;em0?Lj_`N)Cp5CDbUJf~}#4q%8gNb`j%jqEkZ_SZ2 z@EqMIy5A4gve6tJoV0K_83ly~hlYl_16U|b%c^JVJ!5d!-Cbkpy$6$gLd^MPl>EtJ z%f$KH^82Tx6A;1>t87qZzEiR*IY#7m>3uu0$C{HQlasRG#Guh+g3kOhpi@*n=s3yI z?xuS?cKiF<+FIvg){soXEeIq66LApORLjIqpVFn@B@^Zy^+0L63X39yQOxd+mYt60 zCs$}{NE6kM{r$9KZIShY6m>7U9J6d@mklPfTz0-*@ZQkUcq4#T_cN@`Zc#u^=>wVj z%-I7QkKgtFPbw540+uszNDH#fndkTE*IaBlh1h}pvANNP(fJ(C~PzF0y0a>4VgQ3D;mN$WfWl;BuCzL-y=4t!h>aGO0a%T|e zp;SGVFE19JogwI&*x1;!Si3bp<{I3(&e;#97ZX?EBG5t@n!>k)m>QIMZ3uo?IoDD@ zh3jKLEt~^HP|ISqV>t#bba%VIP(zY*RQ}o(n^F^$t1H_vH@(GKGUC*$gfE|VZVyCr&H7I=I?`> z58#*>wr`UQ$9go@t$RnUt34r9ui;n^bbOv19nI>BjF)bXlGk!rDC?o;H5GqPj=}_dNIQ-(MK0 z;=B;}KvETZ&$=C2t9MYWZGoSiYciA*Y91fj*G{jO$LJ|`&fdHlSe`IslfVt`a(Ii} z!tCQHj_T~cahgd@9@L5EmRkZ0Fd8vUg)Mpe2bn9}fqWY3D>h^Dx{N~nHsJo&p<-{L#@?Xi{g#4i8TCifx`wMu>mO;;%nqAE} z%Os;O3Jd>~H>JOjmd5R>v1bpr45x_5Qh-`~1k4y=Nnf`t}xc6OD0hPL*$N`(MC zxVpJHIX0F)W!7g{A*=bzeJbR{FZ$}_@aC}i=($!vPyJ72`0}^jg8G_`agt&kPC-)B-V53N~+9 zgHW5-y&~tWGZvpH6>Ak#rgWY?13VCIuicHF47S7MWN11c44i8fuE$bKlU*`YvG{bB zbf7DWp4E;{H{7l*Tqj>4*B_0Av7G(M@XZ+dnRewi0?8XvetjapSo&F(o7SpZlS zNM~+=Ti`ZE7Ll_S_l1sW!*6S1Ib6j)uwZ%3sA1xGvdEWsG*hj z>u>|NsOpS{$LRx6Cn(nI69Nkpz|%4cIh{Q9V~t-w{G4A!6nzTHZ)c%t+LJLpzv#tA%l5KwM#ak-GR(! zyQ<1oLA~2FoJP)+xx3|aEb(SXZ}GY|GOf}*(OxANn_8a}!w#=~@06)}H|Q5WZ+k^# zt{IB5e5NVez^d$u?9C?QK~hq`oUc;N8?k5-=;^A4!po*yf&o8!HUQHFd#(*;M8fD3;&1CADjOK7~T6J`E z#KFO#RVn!dYm{X)D3bt}3+1xe4qVnfi_ECaRb(hPD3ix9jOI{nu6>|jyL>VJT0Ixl zNB?%?3-e^^kS=yi6V-*9E~#X`%A?&0r#%bcNsL4UW+jHflxN&$yM({xxwofjc#>GK zWWp^A`A%@$$mloid_?CrjB{gWU)rQdZCZW!$yZz40ohw(tuf$ozzgM9@470HskxDK zpG$bWA6wX$C9?K4>o=%xNkqseLdj%f5C%bjusf=qTIPvmN6FxqU zByd$1sX<-(pR0O=bb^f+;)((N_U~P@`-~x#*)dxosuf_7ltF0zo{}fV^x*rmepvuVqehMGcrQ*{i3RhCG@MkNkC;rOJA5Y0`|>M?;$#1%kf1C??FIp z;1+z=*L5H&9_B&s&Elk7w6HWC8X52e0PgkmjXTWi%gaA-b4$cF-}S{@yMtnALB}855R%C4Ro`c!k$N zVXiKaVyg}_wm&rD;>rvo>?Sv9`3tlxjkrMsZU#5Uk2#H$DAel>uS$YjjjSkLAOt=; z4^T@nW$7~)us`kMLx4^46GwuKSTm+PIi9^4-v^KTaupQ~|IQ5QRD0>-5PSEX5Ba=8JxF-Q=IF8`l-OVmm@WT#`4ovz`jw1KnTHZ}lzue8u zoguZA>oh(2F!`|Pu!Y(qIVHu0OH0(nPr35E!nVb0WkzQ6BM4lGMj9V93oJ~c6#_AX zy=E>}R#w0=`my1Io-X?xFXQysGV^Im;mOK6gUyPghFoOmkK5T!Z%%{P6jW46R=(pC zQ0sYL{C7~63^?A}pt0=@j$CvUC$vrF{)Ho%1Ur^GJv!mHbPk1is8FJD0+^jy! z)r&)`NX<_m9;l4jRB@x{D}k5fSlO%I0?`LwOV>q@-Z?S9&g_lH^XF1z1rH+%fnCEc>+ zj*u`cSDVc&FDwL?B%_0;TW6@LVJ}xU^H(_&8NrcO2#T|m|?SY{fyr5 ztgT+m@sV}bQtJd!!CEc)x7pHhETx7T3>N0*y!NM~z-f6OJ8N?UtWMCwc>`|blJsufXs|5BKJL3`cVt_DY;3IV#DdCUh_Xp)vT$<Qe2YFts_y&sNx`N5ZRTRokJ2VR0*5j@e}W}aJB-0fc=e13-7k>)5XQPxW(Sq z(bn2tL~Np?z=oTx6pI_8l{b;xBY26Wr98GVSq{e;RZDjbP>v9sO|@{JC1r_I?nSse z>HjW|0+k+C%SPiB|k`z$+{2Oy(jtok#C0hpmg$0#!NH?VydE@ zjhM@P?0gZKYw^7Ce*Xa!k1`5!$;YE=c)O5dzDeg|EZlWVAl5ug{qg0nB&}kuEI1S= zc`O>nB%bW=&(|8Sg#5+XmivUA$s9L;6b`#m2?>{S$b>dmh~Ey3v`RFP|Nri`xZCGq z9jAp(-fkFSKj;UYH65fArYfY%&Wwf8w6Z+P0nuHIHN5a_8~IX1X;#l#>o-dgFqzW@ z3U=?qW)Z_X4cx?E)bWy2Qs^`~9_bQ2(i*8q87h$zhL@I<2)Lb=B{e41Bb%ogr+Hpi z$LT_DyW+r<06-%T4)(z)d}n{Z;fH%`#U-#8J>ZqLo{a}H(rY&;nJ^X=7W0-pw`Ft% zBOeNWtKQ$yaRvYd9nZbnxL5|wePI5I>K{(wRn^gXI(ZJUMLcX%K3Qq?995n$sp^u( zI+?2$FP!S`>H%(hU;+Z;W;)$^H&7REbG-5%HjDu;PTzu^4?C39; zgEpflab+V6q22jvb9X<{3@Xuu`9rb0wjp|QHp2;d;3-Ia_39Pi*|dMdHv5^i8NF$# zSp(`*(}~>nK>p>hom?YjtfuD8dOb>g)&!aR62kB^WTy>-8}_M5XwhfFza)#a7evq2 z&^X4Y+xFzLz2jF{nSE*tW6lkyO|&a}-lhZacmwlBDbE_s?P2XT1#4y_A1oT}O@7>j z7`W_!MkkyB-lt7ej?H9|62182PEij<5f4R});DMpq|a)0Smd;ZJdjnZRr|2!lSyT3 z4rB@=mHz4nbMbI|dIknLIZ4bw5r9f4sMy~Oi~{-A^86Rk#bY_+1fr+Dy>Mb5 zmMzV>Eu4wY-ckuU_so8aKNT3H{cn5V57E0++K5jbT!=^{_M~=k8ihefayaGL_`)_n zIDGK73Ctm+l5UJm?56brWg!%o4oF7hT-KC6kp5uCW^7zs*TdcN3!I%$vCPWKi-xNM zumsFf_X*W6M{mKowZ?L;#;!-MUS=5UbZ0Q7^17wkePe!fh4sYZ!E9q&5CjYF=(;v9 zgQ%RL+7%EF__~stfq`M=3AzBF#YBA0U*_qJSQ7Ns^Z*-ls_myN>_wKKuE*n+uIE$r zZRwCk@$|sJ!4*;|UTC*>p%^Ux`7Rkg^3LX2lqzc}$R}C-y&5j~SO*x46+_acO@Fs+ zMp6YDoknz=oS?wa5z@H^$e!k_h0V}#DBbho&0KejClRm9;Pm%cftynwdd(WG7W>=Y zbTXclFbQ%(9#@mR&5ckRbar38?j^ilo3LV8L{lK^kYxvTU;P5%(!F7Fy#JT9g< z-3@j*9xF`knH|yF(MYMVMV)K&w|=d;-(dNkdd&Fm@(VVvKzn{x%WLo_Cpa30yvApl z2ow2B+3wxqVp%zMnqa1?3U((*t^_;pym#a>w z;Dh;ru8L^gi9je)s67AKlVSa9yaTC6$!OT2e{8dw-dB{YPCyuTJ~^6d zSo9WIpQyb`U&)_ZROdXbw3+DGkwqfdn(T0T9IZ*!anZBHjE(()-11sFX26yF>IlO! zGKax5NsB@`A94v(+-FD{^-+c=V8qe78hY)Byk6mJeg68z5B{jWXb1Mfyt3WNKE+Z? z=c8%)bfo|OHUGk3|CGye@$l=fozX6cpJ~-gx$f^DOZ!n7yh0;$N9!dIa&ZxcVBor@ z*3~Ochh%hfG#Ce2Vohlg6col`SnUuGtS`QuN_eZR`nQ6EP2^a<_y|LKp&zd#rEhtM z^fCxZ^2}S$=7pE0bm`3VL8d3@Qxm#Be2sSi>7vB8ul^|;+EP9)Qq|OPn8zQ!$IX8y zYj&JIAex)`klXWS@K2bMsBe)n6XuVb%Xwb=`)~^xa27mIf0I&{mrbN zb0)xXkW&385O;A5Q`Y^o6iqjTLOgT&T8D-&K{;`M5BnSYmoN!pKUet#RJMt*KB5iB z{^%vOpm$64f5&U&Oc8QQ(M2jox12V_%a@}I`a+ZW#{AyUrEX{0z%pG zzO3SumT!6XuN@7AILJdka`R`-Savgq#7CUgk<=!Ze#Vyqu+SV`LASH=_pN>#|NCwK zf?;Rp>{5=Ct~!n<(;%)^!?VnMgz^*h-bxw1QqqARq%8lZh zHcq>Swl`MSc27=lkLfPIeNi_=RZfrOaGExX%dVBgEpLwBo19t_dBr@4mlG)p{e}tm znc;tuihrUMi=8$*7n9{e$b_fmff@FFAr9hQ#a&ay9iPAg38l4Io)g_m`A-H%5%y#e zf3wPao_?Z*tI9G5>IUKkRPgdh?JJpSc%Vo7THnz1Jp)P{1ln ziPj(~yugL{r0saxxJkf)F^DokZ$~o z^#88oKb%U4b?oZtS-Kse_GwO<`L3*+I(R}3&ud!c+ycwv*>Lm4QSVFeW~S*+{w~MM z8I`2oUj9;C?Si3#@Vq51sve|>gO~3Rf3Xy$PX4Bz{C__ftogh%ZsY-Dz7~(`U>V$d z$`%WA)lQ-wj_qjUkmEg;U=h@SzQ%zt7pG^1_0A-m>S)oOZzjK_19ieskT(Xt#~Cjc zk*dE~GX1}Q>Q7wBHb<81tRjKdn(V6b%=vF@i;GyC*hsmR*N#$}J2EZOOI3%*(db<_ z&!|ZmAHq%v-h9sZ$8t`}D2sRm#=qt)*WG?o38(6H!FqitpQrv4r3x<2PeRFW&PYef z;M7qooe1M@Z`ON=QW}p^id|lHB-NJ?*`T!%523+OF@`_Fr+P<8vVZ_4Q(PhczKdLG z*K)iFv7Xf-$vGLSgsTs-w1J=0Jf$h>nbxYX_wlmUIMZV!aq$22Ri8%5;1GqaMhWVx zj28Az{QF7AK8EytW*vIQoDIb6UU?oIf3NSOC{}dImvPzDDO`*m`dgx72{is*wfi?Q z1xh$#I)AfTnf>}U4Z&XiTKXqwg8ujOIh@?f|GcOkFfQNF#kvlU?_IUzc%jb4nYmUW~bT3H?#E*R0e_@HWB_qogcJQghYIex-fF z=Fi4VxV<9qej@3=O=Wn*du`BXx##Ut@aq`B8ChkVdDkOBF0e3Ca z`?%Rd^0(;!o)aKP^42rCO4Q!**pIG3T%ntUoPT-L%6P~Xy`zZc)M`|+ugGjPLSGmq zEh#mphgx5X*N{ijHIhj}8iLF!qz-HwH;;S-zGfaw?Yc%t%~M+zTT-(!W<~BT4}aDZ zC_hFP;4D0y!2WRh<}fsrlB|L`!ngS>kJabJQh7ajFDY0!|33dV`_nL;c^-XC$+izR z>K%HxprP>s`s)SsG_ql_YEjrWW^#I{mqxlLTB4%&hjlz(=Gd2IwcolnZr4@8k6cFjYKx zJ&&+szmulYR%GX06vf9#qY_q_M#svPT4K&1t%!l9ApYPKwPiiEI=LaU>C#D$0ApP- z>q@2N9$VH_p{1)0YQ)d(Tn)7U{!F0sZ6C`m7Gr;ZDj zGq5OCphel1T5#7oYL23!$2!w0ie)v$rwk=qZWHsZ2(U)V~|naC#R% z9+ODR?EWsRagToxe%;`%XC*`Vb&d7k;`D-eYk;rM4e!S?MtOY{<-l$}GrYtaWjvfD z2$d5&bed@ShjV>%{9)EuEi;587lnw0xAk11R4g#NTr9U+2N-WfD8HhTVTs?$64-RG zzZZY*!EC8!e5_53MGevPNMH5!B7?UMZ|brN`gIc2xyIzUQQ=^iCL2gTAbIwmFMF&4 zX1PcE_jGX&clV5LPj4PctL%C}BISN}cTOYmtu5yf!VB;+SS3s!zx-npA4PaYM7VW= znX2mow-jO@GngTc8r7{6^#Ig0a2FOPSr~!gC(_T^4LIfudp9vD!$ORhDR#6#q7;;!uj zol7byiz^J^VOoTQ#bdn4GM*pNUx=j_7h3|w?d|PM0|hEe!utMpVsdhHawMOJw(qI) z167)b#gmh|>0X+rMQU#kmFaf{Ma7FEb!w+}h&$)eKrwWyWG2Ana%u{%To;zO={2yc z8A|)5=oHaA;L;>;G*olJ@i9?G#Z*7We?U`nw`zO{-nlV$WfmmS*nkJEGM5Syc(*u#jM-N+EDWep=R$bI1kN z#r0#RCJvO`kbwMkiP@pWMVQWRYRj>6a2;Bc_Jlu5rhG@KOT**BXLsMQiB+UBNms(} zyjCl|)5>mhy_7fO5U2aKCK`{eS%fF)h_L@Gtil3hw#UtE?m-|DG9@YUY!eitO-;3x z>4hJ)b0fcUU3dIKN3C2DmmK>tXp7*lXwHYOMSBBnecIUFW%GRE1L_Bzn1Z~#%^o5S z?H0GK6wfA0<)bso?uNFu7Z-xjQd@5XMSzD*x6JxUWLfC&WZ>^gT%g76B^8Wzs-}$& zoq4+lN!>;VWGKD#o%V6{jS<}$Q3o$jJz|p`PDM{?Oy!|T&O$C>>xVlzLA_0)!wmjq zE*sG#2rxPx9Z$+)FQ{^0)=1(q%W2FMekE+Fo2xjFUjAbq#a1nu2&!&0@bKNscb@Zj z{LsTfkSCV$K})inf7C08dGB>$ed#j-8z0Y*-0FP(H@|kp#ZKxF{UUOM=V83>xb4D6oneJN-IO#jOjb->*N55dYK)HSII5WLKS`vzo;PWVC-Q(vJ?lPiAzh}x2H-n)c`0Usc zMbZ?GONjjPhPTTgpgWx^*g@!3Ku`R-%_`5*&t`CvLp@t6s~w@^4k(MEy}P)<5}sn5 z*{cR+9Y}QY+RDbS8xEVTDO1g?qTrmgvRFM`ByfvoLv|Bu`)mL0*&AGHcXe`BLBUp_ zkTEsgn>7x4v#K*nVmY?YPNJhoS29rdZ6w}NGIPt>*fhMZx=?`QW0x%xZ;VXvd5X$} zh8Y{qRD+H$ich}~EOWkvuMF-|sK*d^ExO}8BS6D~krMx{{68uM^X5mHJ74R=-q85` zIB9>MFy>UL$AX(3qu%jLoeknd8q;Tgz47+%K!F{KkZTNRa9cN#1}af5kjao8lr;_g zj@Gsf(L~OjcFrr#KiZF^(=4AfL)SD^5^)w$lT$&)Cw<``r|OdWiP+zzOTQIm(PoW6 zK11!1sx4F`x%fk&4HarLk6ST+e379=n?f zxvEM}R!UnN(hCZ3AGOPsGgVHOn{)H>>ZBKqfRO9v+|DWu??d%Jy6NyzHbpk*Rn5(r zj;)LKQM0~Vf)2}_m83M<+SzW|`h6n)^$StA(y=-vW$9zhs7&D$fuQ5V;@sqavV698 zPHMj&nK3fT--s;w={~`d4+u)mJU2x+uwx^6ACDowc3oxJ1J!=sSizt?SS`CJeaydn z4_Z~7`sS~*tN`pG5wqr-{t?GN?V7q)yNw9y9j~z7v z0|9UI+wmA!JML3JIk41piigg3b{bsGD~n~0nbplXYZa6=G1eRp3^j+XELHJ1=xp7Z zJmdI;@#5?YS&RESA@tXnMUA!DpLbzCll+^7ge1f%5_iLOB=VZ0;BJXx8N?;*dg0Vs z^tfva+i*4Y8U96&xJv8}GkY)Y$)i>oyiMFHzm4n;bmcZ09%1k2 z#`?O-c2}5{7ZvBKhLy$4wOmb1z4ZEOXU8hkJ7xJ>2cn3UBPSalbf;?JZr8bh2;<%r zv<1X-=`Cw*-ad14+|SUxp4ZaU*}2(70``Ug%8h`<80{!MlFWS%EZ;3>+x|ECoRO_W zZZ`s8>XV^=UqevZbcdS6@7&W&mFlLIz0b~RZecQ8cP0(C1c!rZruf0IYh;d{?n-!s zV1c{UG(gIg7r1)k{i%1T?;n(F%IvBw@dJRrTQ%Qu_zbJnxFwA0%udfcZuX89Ca4N7 z+$3y4twJrA|B!<|Z{Vqz1Yrtz$vf#U8G8W2(J^gcZWEkUH%oEFVm z#2vw0bHLY8j(k0I!9id_Z#mlGb=oq8d2ZyM5{u8shYzQ|=E`xD?}ot!rO)cT&3v*H zG|a!31VTfN#pqK^?&bcBCNOxfn;XB?lY9d&JVO={oxI~LrsWykUxq*Cg)*LRD8d7j zzgc#tA{7iHcl{)nH0Rq?G=s1>{fZeYnrLX>f{HmKt!~5 ztaq78(ms7rJr6e%TqqkM6SY}i>SUU@TYKU*YO#(mrNWPXJiS=-YQqOgv6tUMqG>RM zet83qK$_4mzbC+u`i<7YoU+iZ1#D&Uw~KYKJjR_#e8p^0*Di_tG1T;@4;;F`RsUM zTM#WrmYrk**eSOe!H+(k?^N#p!|a_dtwb&HNqrFNQS5-Cpvja5WDcc#S6LXNE|HK&cK*R z6Cso5NoOdkM_uOzvdb~*L7Wf4;7GWws-5*a4`H3~6Kr2}B)_R({rvr4VikOPpz|7v zSeE@}YLVcrAb#pM7F_4gaE<~|Fji(PeFb*vC7)qQ@KcFH63H02W)hr&{+6MM4Si*c zm6BrM>ZYfvys=gYCE^HZcI&EGYP<%bJO+&_Am6pkJ4EbO3*hh8zXa1JHM;E`UAJjY zNt5xxEUZ+B&FBEUOE15kG?3qpEb;_k0qvB6mI z?>80>kK2TL&*RNL=BV7iO?T%9wW|t#Tkb%9F$>+w(d`*q()u8uq!>ZCh9+oDdbq~; z#>vE4e1=LaZ>A6uU*bKxA?W*0zLG>NU@xa^7ihF|{Ta0K9txz-NGdJe-4hhXXVqCd zoU~9WjK+%zL-s#f_oPaozF%OKn4d73I5cIa&nBacL=h4gZvRX;M&ZCs<`_?tKh(~G zO5X}UvFOsC8s(Op-hm%qHz7iSV}z(ax684B(k-lzADwJKkLIQ3QSW)5Qd^}#pZwh^0cE5QHeFG@ad_(( zM0oy+&YmE&!wlo|KU12P<4Z-svv>b~44ak@fUWQ`lVQ}vANt^9?49Q2k@;poGdzKp zOTLPTGyxGt)WF7R4rHH(c9av%swsHjkf7azOiIKEPT@^U7F=s* zA>h8u;_@M4$^3T!ILxsoc&o<>mzm=G2GQ#A5z5UqYqipHQ7JD-g&GJT5MxmpsA$IE zaQ?Lkw;MY+LWyQ*s1I^g9d}uUN=YHn0)|Q=IQM#YN&Q9h!=^9D`Jtf);-H4K?uPRY-c+ zlN^w9nj0;zMqz0?5PyAsaaFBxd~g7{9<2A)rG5SCRguR00>VFKlo_4wC&lmC-%LSj z5hBcMpLBlf$#NwXO&jZ(&p_h2}$@ zEX72=A&-zme(Z_lePB<8E(-KhW7gT`RLT;+zIe;R12wc92hGUjlkqZjjx=%4f$NW7 z{dOXhicYr}W1C&Cr7b@0!zbsIcCOtMpx~#DPAE+)N0S6;Pe(w0GT3hf4DQkl@6yOr zhx>C6^hoy?MJM#JN(V^;H8)T#)IL-@+)opL(z4~*`^x#@FUQyKD*Nl5AmDVg{auJe(LdELzt z5%<0&dgn;()s2W3-0%Z$u|hWLG6~+Ge!0KoxySWfH*h;C7pgWi)JIB?`+oUvH>rhv z;h#C^Y+wWr4-cUP0}~7Dc}JHB!S^TUKP~q%(&898jj54hd(fVIWqp@L3 zHgcjwfmJD2Of$r6H~ACvBb!=zEB~Hgl;mVKTsSIRR@m`(KPev1eplo4T&=m3SkGP) zwpHfmZ8i@Xm=u?`@6V-#(~6eZ)%(|j!dk7=Z0U_xLw0ucbxc#tjyPSzp9^<|xbRa& zKErYt)* zOsZS(0@r1-m86i4z1ILWxEp7{Z&eQNnz69(QV$gIo9W=IZ5-54H4{hzmXMkn+~q1~au{ ze|N6-MWcq4ZiA`hL{7sjWQp^@FU8pNaO&gO?C8bqWhqDm|Bh9Bpw^UMg{rQ^Xmdfgxh0;G! z^qF>dF&)!!mCVgG+pB+qhRuYnt-jF+v4LqmI=oO`qb4c(^211e;lIzpPrnNwr4+cm znFvj@e7L^1T9s+!wTJ%tAmr$Sfl_S%KdBL;u^@e_~<(Q!3MN{Kqo^dqh9ELPGyEP3%HwhiCt^6wOHA zIc7co4z}OU-?K1W@?a%vIrPTp4h$0CQxO&*p$9A$2@W#|IEN-{Z=^Rhy$bKVy}Lzr z`^fR5zbiP-6`kJ#dAbq-64LccEIX067ZG2G-6lSOO1h!(_NNEY!x}HzQnd6G*Q34t zLg@yYu8p>%d?_C#u_+yRHGXW$Y;7bfUlfKjEGYihLIbA!hI-*}1 z<+vvIoqD1aKSGZZy<<{A%2454rYcv?Gt}zhH;U2{C(p3{;0CWT(iY;Q53bD#pG~x z{y8oWPc*37y$+`OdP!4Xx0-Cyk4iIh)@=!wLSH=i9pc+xaAD$x#nsr|d7RP+ph=uo zk5NqD#NO6xeI`duprgG0Pw8#wksrCPP$&|qQ5-9k4YmNZbmDS}O)u~@^DeKh%B99b zp`c>YrRX`~@!$k=B6Xvk2kp+I_@7^OVUNpB!+y(=e660T&*8H$e+c*|zh@#`sXLt@ z!+cXGp4zv(Fsj4uwy{0jpcjcN3?_kKD$>zpVA(vX!hu21avG;nTHc$~>zZgZHPjUs zBu5|Q+19l@kb?!LwX=A3b7Y%Mly3(=7WAPGh?RWj=XY!0MZL9vae6$AV+kJ7q2bA% zFb~*|v(Mk11p1iSm9S_@+J~i%was@Z+Ccls%X97FJe*wl^mIMR=J; zM~8Bjvz%+vAec_W>@G4pxToUf_K(lNO9xci@hzmhJfyxs!9hbyMJPfv zG5fn?20kJrCE99gyWZ}P*P{7KAU7oqxO6fXIsl6wv~PAmfb+2?uTWl96$tm}sJ&=} z2|rqGbEyAfJsGhhmdQltiPoRr3u_x*(}Zts-+Vv(ERBw^PJxJb|=CsjtcXtOD&{?V$$B3yxL)0GKyqJm&g2cZFm? zzZi&LwOr~3%%iG@8}`f*P3Q0(kXDhz`MQ(i3Q4r#tkFo2|5l;kuil!Rfse6>|Nfyx z5vX{?-4V~Y+_ZX&zLmxUT~DxC#U;$rZmZ_REVH*HXmyI6fefq#S%60P^XC*$OH#O5 zsrgv&!#k&@Ckgmn2LUOq0Qmr9xde9UV>0Q42U;s=2v6q;}_c)4Ja!{5zhlj~PGf3om)9&s5vMt5j*DOlEpD@K{kQw%H^TwxFmhz2>t&dk_4q*ICL#>pTan{mYH%nNrge)!(=6 zR3=i-=aBJXPW0CTtosI63$zxrfuqQw+v@tN$-ZRuLo*o%Hy`#*I!R|1P8wz6x!J>kcMAh1r zwVKDjwu)|k6H2);Hn8A7V!VgckQrCQUw%VyI94pGWi>H|U5*sc2XS6L2w-?%-~GZu z>di*)wjBK@>5F=@Y;6*+(a`1TTR-*$qpMpom9ZKTN(H`@SO1yA3sX&ExxcWuI)HVkW%EGctW~ml=2H1Rw@9Pe_K^R_ zvJ3PG&^~nPBV9mfc#51jIV$vUVG6o?W9xb989vDm{S6(2ffP#uLdLtf z8C&iiKzQN~E5jiu#r7;{|0EEk7%ZQms^cv#{5~$Ujl1)pp{pN149Cxz%I84Z@}+G2X7m02K2$6 z%&6sC@fE%Y7>VSNGvE)v{~s-9(k@a1hopg~szF?nZ~+SKlx<9dc;UousB7k!MB7H- z8`MCF97T0Rn&8e&po9_%%ZzF>IE--uCUa=c^Uv(9hUlF|Q4ci@DM*6{&#Am`J@5EN z@N#!cJ2;?=va1iJR7+L=^rD()cF`IB9P$4!_SRuheQ(>h3KAl%G)RL;cgN7uEsfG3 z-7O{E(%mH>-7VeS-HmkfEWYu(@B4}Oc<1mRVb3tL_nNiWx~}v5obK>d(ud#WWJ(%p z%d3PnC?XuhTu47wLUO0J5jnY$WJtsF^>Bhd8+NVF*(Bp%n@hhyenG&AGw*v+k`>Bh zPU6#fLJU5HR|eX0BhVzk7n5FkNsSP+-7c(juVjKrYA(gCK5ghd2(9!Bynsq|x9u8& zb0+na141LvjZW+gU7#kJ3_KhIy?us=ad!EaloIKSQD(C`bh-R=xh?AUpdnY)tj<2p z@wXxeE?q_2ora$B7{q`asb`GsNGEf@#ld-@3M68$&7dxQQa%?VrMsh-<}*}L=MDZ& z5kNRkcyaXilWRz*)f%<|zsl6iI7G(Zu=ErD0X~>*_IG!kHzs0NmjBTkK0iG(x24MI zDIhyRvcZO<{_+ByV({!A{ZksMNesow%R50>BoG9tNgHd!zCZkH*yE@BT+a+V64Kwg zNQC{k7e023F0?TQDiUM#&4d)J?AVKczYR-RcmxDQ1cWEuVNHNe0l6i`AIr0@=}}es z6IX1o>%5MR{nbcdE->%>Dgegf9}Upo)T%=`0%C36x#uC=jiuiNbdi@jb%x(Hmq8Js z$DB)t#f96%Ajhs}w)7|CC>;^69xI;nzXv}9 zlD!41%(+!TQL(+N8lTsvc_O)ssSl>WiySin)F~W>CsgeF|2f?2%iOXwGmmSNR!O5; z0_S$7BICkBt3%#a%)}N@uuhGAcxOce{epqa*(qyDksX}be;%NHUSl&5tktVKm)f(K z%eMWKpluCa<>MeHJokQ_D^)yL4l;9w2rVuSYbhxvlEqYgc5?GfHj=x8LgL0`AOH7t zo&v~g#)Pjr>p3043#rV>8`NrKE9-*WYlA`nyRr4WhNJrp6&@HM-;Tlce-a0O3+VCO+i$T;K`oUf2CPVP^CR=a zZF9N2EVX2{Oa)Urlc*jc(r_^$M(<985e|)*;gmhn)mk7yZsl;_Sez>u+l6=dmAFJ zPY~$dakxTX;QaNge_lfeYp%+?FfZ@weroCH2co&T$zq*T;m7Q{+`o@o4(0a|1W#C& zjs>Qn{cZq6P)n8u<=C8oxGL+3kFR`Rh;~wQkk#gw8eh!MIP}7R_(qF`GP}VB4qHyQ zhRZroW(5gJ0PwgfZDnCW2k{3Hms~YRw7l=Y1Xuhfb!Xe07{$LBa^!RT5{Wz3a{x%q zFcG8`S>6^f^GM=!O_4G4+R`TXGV{$&YuRy{I#g$jMI7;XQf|$d{na4@~`?E0&g)&$drJ5>wx8j#Lv|EuP3k^~9-L zHT~jLAUxCXr{&E< zgF$r=d0dKj08d-8de_sR{QNKi4A65JO@Z@`X6dgD7L!3h9o1)m=5!kqr9DE~|GxD- zb)9B)22(wA(NEqZPp1+qEbbz$a=Lp=*kT)v?xfSHP`ui!DJUE5ay2;x(R0wcN>RIM z{XOH5sr7-jiO_B0NNL zf5_D!g+^^gsNN4gSJiypMe-W*$FX~;@A3E^IXNjAgGNn{u1w{$CXiZzPJM`NeoCS-;>19=z%%-x^WByKy z72fRA)yXBRmBz1^kKlNn3H2C{3wxHJprK3q%H?C|y2g69Ps9PAVOQ|MR}KU~Hohm} zS(_fwJ#stN(r`_362BY20-N>5+LZws4>PCLe2Qfh&(A+%qpK?_TrWBdiHL|U+a65L z6UOJg!J>bwvzUnv{ycQSb+vCy)rBDC@w31+or+}-U~!^al%ehFgN+z0#hC?*w$ z5;5n3^7>kpF(wj|Qj#T2Ajz`Q_meImL+x>sv3NUm#Cxgx^_ZGGgvrXjd81drTY3$z z`p55Oqbz*0+T38yNyhG<52L%Ta^rZfMAOjNDz{RE;H>5aB}D}LqM;hTeF{~# zG?WuDy|B8>y1ms>P;)6NTqmA44u);idhF<=1DI!UY8#s#M9U3^5_olQfQ{Vp?0AH% zFQ!HAMN9wKd&^}=rSinMDie)s(?;9bogmF>9r!H7tM&1*&@P>CCVar4h>aRnXhB_2 zU0JZ$`JgPZj!3q^;uItC1K(}{^YWD!no!hc;_I8kg8e!s59fYoA2EG?M^Ui&bqHbV zLYkVIbaZr~7}9i9XXPg|-!;xxbf`9UsSDu@>CtJ4>V|%m+=e>(l9n3NgE-ns6i+-^ zKId!6Sa%1GYOcuQ2CFWOFJkjI&-#Hy9+$P;&P)A>{yV5U!=Yri!~NQ>R9C$3eBVBw z6}X^6LW#Rv^gOsorPPu+=h>Pp;F0_gP6NPMuiq$wRA-b6Yt%FD>@-oMfoUU0=9QS_ z0FM!n;HZH%tbjg=PaHEVgdCiV%QJiNvBC1kkTZ!m99D}L`ee>7&T55?nA{Q><){!L z)G;FBY?j+NjtD(Q95Q{Cq_volg9TK`*D3x?Wt#Ux>otDcKN!802Tns;SKu{{@@^`M z+)CaT(x70bIwV@XbN$gN2yExEHG4pDru()tlR{WjL|CiQ`7OA|zNV{Z4*5nQaz#F0 z!!>Mr`hm97Z*ZrNINsM$s@SL@MkyiTP38LFt0TuqJACiMT@7~~*Je}gMeNT;#8VWr zce#S=Uo*8RXnU7oJArHmTmMNis+bbispx&eA zE!m48_UZoGqPnpom^-8|-RX|35!EqUTtXj zl;h^fPY>{8K#MAyugE+->|Iw^2c|(46_vdTPC%NTFjY~{DI`Vf0YTu$cR@o#i5B;o zyVr)P)z#G=kL{NCk`2Ij6rXK!u!c&0pF5@jOR9 zL-11kc>NFC>A+vD z=qa}Kvq1VMYF3;OV9hEDD+!Zw;pu0n;10$LyTHHL2;(oiixMIv@saEvul}vW4DHgv ze$hO@4_CUa0TexxdH&Fh5V683LLX*M7D(O^t01-6g4O0Nkb?cr%SJaTv2x^wz*&?Y zu@j^E)$<+%3ltKUzhrI=QIk_F7R&uX*Wn-?6<}Eu9QSx2nKev%GABu~wEcI54!%;@-_(gKPhJ7gey1 z2Frz8t2-iu6=}HLnuwB)ZmG%6#mcHwIn&O{O0~{)=jTj0HSV-6!%NnY?eQ6X<0$V) znp^Y${UWu-&N-)W>6#|mbWu99)-|}NBFp8#ui7@f;d0FvH!<52A44?e*%W7j*HA%v z0tz2J(o^-eWkL7CtD`#G9I`i|8yK?}tB01nk>dEyQ&Jd?=ta-q2Rs?lY7L$*#nKc- zJt|dGb<&ywDLVMBwp30kGjCNj(|e45qxX0%L#G^(az{W@0IUt5MiKeU^UTBYGMn90 zfH^z;;jKFGz_M_9HvzPsr>v~DO0&gL)6f2&A=+jYA7cr9fTh*J^0C!72$NQ`N|87s ziPz}{xN7&39hSu7?C%YE2*NM{@SAt7VZvc4W-}&XH=%NG@`7e(d)x6mTP0s{cT`{E z0DnIbClUB&!=t0m&#SeO)!K}IgSx`Qd8$WzbD9N!UF}&k@X{ZAIW+!aJ~@Sks6Kc> zPJovAk*+do^G5ngZ%BVAz3D zFAWWi9}-@j>-EXhlB-!XOx@0B=-Z}gXT&zRKHs!uwN{Xoj*I>F8q_Dy;Cujtprq-l zpt^dh%o+b8=>0DxbEoe;dcjC>i*#i>%wXiWhm$_@>j?0*&i zn$riRZSD54f}ei3@~_T%OI(~}XHL+qVsZ#uu}KrdRJoXkZas{@1g(in-L3OIv)1fZ z{0Yh;ahFH^+U8rU9^t4Ff0PVMAKE_>154kY*97JNpz=ZKOjYvu|3YaM;k@IpU7ve& z?_1M+Bm>z;97BA!cat>gG|j|Ak}1~{nA+mm@?7<}sg=ROuVK6yoO;)r$R6(xo2fDO z0DkN6R+9&KipOMl8*Od}J@-0lb^%xmj>sFxtX?4_zpLm%1R^K4JyWL-$Vm1eK!_&f z<1K)54Y+lES^EO2%G!>HFAEJkJw4sH%Ix|kL9A(sYPA9Nze9*5Dz7I>IcacKia6X= z1A-`WU)d}17IA7ai#tr@!K$9E`Q%HD10IrJrh+OH1r1+fC0j0cG9-g0`GFDwWG9vP zXVr&D?x$al1dWK1-oKSfn6f^%oLD)sboA;mLitX90`mtVesP-@ZljDPV6dy96G>EQ!TUY0onqn(^*zGF^2D` z`%RCBE{ySa1D8u@n%@nE;_rJUO70qVwyGchT-1Qy-+tL+fg=G8BTX&`fEasN&fFu5 z&mD?0XN%ZiQ-xwm4H&hKGP#}sa zYc2KYI7_v35k4rR=VJPH!WyZ0b4~X!Aq5+|4Einy=ONYQ4vD2mGQ{m%2#3y_N5jys zNj_)G8=FfXjt%je#oJjsILIW#+g|L?cxvaUlxQwo-eVC75uz9jrQA2CK7we$+e5w8 z+|EP_ws&N$!Goh|enitwH(zHg)E#`ek=0PFH8bZ{Br3eY2EB&2Z9B)DUgme#S@ zkzipnfgGi5v<$HMCas|}{BlKs@BvUhGlD1PlgXb_;B zBAFY>roA|1d$yU&{gn|%&(3!>65%y0GL;JRFDt`8PCl~Q0*E`BrdA^{ssoOc z2yNKV=JfeR!6uz*sp;v_sChu`K*yO4=GYLCPm<;W2DSRcCvAtjWvx>|a{{e$4C>yV z26;JoA4^K(3s-J}B_ObwofjfS-J;%Sdr%%F8yxEWYHl)YT=_LrlV8k8)(Dy)?45z; zCyNXd1egmsoax}-I+@S)YhlSF>k6&sPKUnmeINWIp(@>^du=cu-lUNGL#sJFDxX$C zg&za{*@ypw8U|~?|HAvHAz!J(ufG6PZZyWsY8tK@BF-X94ojeB3ou~0sctu&&WVXq zq>Wnc;GI!qIa_XkIkZ!sb=Lz=*_jc0A&Hi{Ouz@w} z32p~1)3;MY{u7*Rk<}7_;#aWusV-A#{ zt&`OBg!wTYuDs=x#qEPj{|2%sJ8yOHbFYGhCf*Mli2w<;2Y+g?ax2+B(6?Y{O&?6l zVE;o!Mb$e1lKgt^*Dm>3A1j@%12>R)PEf#!zV8d=2xewwCHA?yFX~#6PGP*pxXi>h z&=#>mZ0pWJ@RZJF!g@W`MM|7CwnP1{!}@8hglnrJG5G!V_gH?vXV_qn=H*lX-2-YzS+ja&N8kld)CqI~vc5`Z?!PGuqzm^h#n~Je11N%Pi2+1`r zbpJP8M`C|<45~#n?I!XwVM)lP;#oW*T8$`asJk1TXIe+#i7IY9fkxiX{>aGGEHp6% z3kP-Kl3K+fY~qs7di9vMRx)S8WNawu6&#Y;&%zxv2dzP|Xxo5+0lZ{Q>M12nxfJK! zxR%Awi>n)Wv?UES$MVhvLewcK+%9o;L|>cNj9f^S`^F=c>smVMR=&xh<+OH6Z7ZIr zUtnO_C3K$F|D}xke9TN70#89vBN}&09KvpnK$NBUexMTTXUysKoj~)I_4MRRYO!^J z-Vm|@$s4fc&t8zXF`fXEneRng_%KT0dDF@22P6M4E1QT|9R(H{R-Ejg;*QL|tDVbI z2X((l#H+8!7A14B-hp+yCiJNGhimp}4)tiwvRQ=~Am99K+wDhq*@a2Qy-j+Ib(QyV zp?vMkfx2$t)G=y7|JLc(f$O?aUWkU4ENp?8%jT{GCUeJF5ct~vTSr_kuWY2!ECri(b zPSdZVA2@P1w=C~}i2a>>5KzAPi^HDwkbp6tnVB(xu7b~D)kqter2MeBxMHjeWKGTs z_vJC;03O#DBA;G~z%S?q;joE=?J(@~Eu~GG8!9u!&xLRbAK}Wh3Joe+Z`vPudisin z6Wkz$;b(=UyV$P`$!i>jv2A_A2i zy;VD?2;MxpFtxFh1@=kTp^%)Sq-*8~ev>HX-spuOGy?m|%a}{CLA@j3HmQu0?Y@=Ro{Ex8n1uxX^%I3kM{m`rZkk{ z6b%Vl0Bb|7K*1~XUh|u1-GxZP%?uH|Zh+<0A^+QQuw7bb1YTADH zh8Sh`7FPA~Aw0^dM~B|=`bO?CMH504n@A_OySP|-1UE70t}~H-GhRexHAWAt)xHK> zZ#`jlB5Z@u!~~mu+}a48rv2IVzeBV zp{WTL3otf6$_dfoe6RzU1`U%$;aFIiC#NPT1|-YA@@I~sK)4C$DA|pcJvOBusu$St z@u>Utxxm+%egS=X{hcqc7ef5|2(oHk$C3e2)r4B~#0elexa~9p$3_5hGSfDHExut> z*NSCfR4R+iP0oHaiO=+FT8Mwga)P8tbdDkMK36~|@#v?(oD=uhksNDqBRJ`--spW^ z*W$Zn$U`f>_-Qu9rI+k;bgd6@ikJvMa>BHy9r&)SuVwwL_}S3lI_w7kazH}^Nyn0) z%SD|tvQsN0W84Wja@;IVAi1c-PF_(7anm+mW67(`X5piI^u^Tv)SzeOC{*JVVt#0z zSs(Xe|CK4@TdEn^g@~JEf;Tz-N0UX{4H~xA24{>m+f8e2w@VWdv~y0r>h_E{iZZ53 zGB&=t{a#H=Zwa5QF7q%1i%mcjEsB)FV^vYwG-$-k7$zpw4sQg|ZbT>|Z4G~17~&mJqV%hJF9PwX3mDk#se z;}vH#v=yj2sd8wyypuRc&sxs{DN+GKkr5Gq7=LhhXnvjdF92>=6^Jv6ii&bd-KYjg zZebQJrcLgU2K|LXiG5^+X9x>L(5>+{ro%4G0F43_qFGiY(B#!O>kl0{vCeC)e_344 zR|D6$`MVe&$dWV-J%({@O%+nAomYh#=9eumR+zX>hU`@~wtvVMH58W9ODU^RzK$Q6 z%37P{aI*-br|!ucJG(bLG@4Jb872FyuRR$cq#J={4<;;Is@g2#AaYAzBW?owuXDik zaD;S&kgY)rS`5?}rb)b6n`h3VE?q72lOe~4yMZVLdB2df0eHy##&|5R9S)$4*@~yq zP@8h>18!Mcti60kG$o(6albv^$WZVkkki1(@j7e7*;qmFaOUz8x{_{GXy<~cIjP8~ zpSLVM`-x?{Ta|>~HY|iTR&0R>@8bY1IM-5y$zWV2NtI7YlV40(SWKBYhTXanu`*V z4H<(DC1On>wRY* z9PUhOH*=z|JM+xL!$Xv!3t@{cNrsQlFvYF}k&CPT*x&Nh`Szn+oMa9i-(y*R{!Uk_ z2VP%+?**9p-L;xBGuPt2EZ5*Cp>nXZUtM1x%+`JYrf2P`+`l<=QWZ=G2KWba{zIq% zSLOg!l>|)?6Ls#dZ>AzK1ZtgCcw!lo7l)jeP~M$toNEks--zd(z0GBIWvD7wA2>=r zHNA=I6aYRFG^8lHy`8qTV_PayuYKM*mT>+I+i0yrYRUE$IOg;qa6hL^+PhSnO)(eO z$AIMR9y`R?++UTrLJ>vTw7p8u-w?tZn(cx-7PkAE zotdrFN^Xw&y1I*l88#BD?-Q7ViC0ADCl|y~JrpuYufyPu)IVuyrNksmUQ+zaijx66 zykvJbEeidx6F}Gl$QdXyrQQn z9*Ci;QzqpNpvN3!!a)QW*`<+{#=?EZE}H2A@*aNtYr`H%+Nn9~4AQ?=i`!Lq4So_y zEOdmVKP!&a%>V2 zxUrfVZ#6VELA92x(=0BY+Xk$m79tP94F!hxW*%Xv@u7E*j^}X{RNO!$m!AAgt<4q? zpFiHGdW2aunwy&wr4uE(&yJ6ezd=Fa&mBXA@!t37B+l|@ zMI7uT&JP`1OOE#;v0ARiJEPe^Nr$6;L`W^zk2e2 zLjlP;twgQBbHE(z;${O1y`Qbx+UKO*$^q_%#o`V4DEC+Dg1Evy6?)z& zm*9E_iWA}uN_-FEr}N1)WH5O_Ay_Clg%Xq#c*1cP%Nt~C^flX`b&ssBuCD*kixA5i zF)E-c1f1?2pmGBGq#02BB@h7_ovYbFfcuy^VY0TmX2h&!EWQ&zW*AeV(PVcziMz7r zyQS@Mejcmk_~c>*3VASV13=%TNrepe`EM}cbt>sD#r~;>L6jjx0o=idyD>nipYH0) z1z+Fe^mh0$G#p$UQ3r;XaDtizeZmy?8iD{1@@aPKN3II%+hR%QS!?TRE`|m!X)XVJ z)&3WM4M}wW?h)1XZEmTO4`Aog5H~VEEvv4%v$5t-u9Yg1yY|O1b0kkTSoeVFMf`4x zZEDSxR~F-(9v-7^wh`6Qfyw4|hh-zNCG@IJbkzo2Ix5quZZ6Kx#~(I#j5tGojy{_g zn~$kXrQ9s&$dO5xD6?wwZb#fbOR8QrKUtNa`~Lkq0hjZ>Yo}A@$oBqzgZX_ONC;6= z^02hFzWKic?sVVPMKd!Q_i3wxei=-1Q&&gF1}N#(yX{?g!yQ7k9BJyQ--fl@%v>-LV~WC(qEUa`pQwystx!qu_(^a@JXCbW=H08s zwkO=@g|qEkgwZyN9hO>CcK>_hVDLiACg-Q`vzNnI?!R2`L#A@cC3&3g))yCCK#E$j zw1btM({eg22CW*qkz48tU)FRx9ArB}^xcXjJ4IM(LxNLus}8guvdUMsY zgPv_QX!OrDnpR6vp}+D40hb_-ZHZo?_A@-mCuOjX>O99`ZUFe-fWEa99yj}=l*Yru z!!Vu)z@VO~)ScR<&CwA8*c8pO3tt6>0fXt01y@=_j~bbVFp1{f3eYv5L}}d0y}W(+ z^lP#XQ^R03;(Y)@SD9CT1qskgP#@4{h4+OXE;Vkpc2RS^)7NYYkB!D=qhVlX#38aZ zx(uzF+?@8o{wx>uGes*r(QN}#7gXPMNA}?-0agD{ZBoSM_I{aB2hM3^yNg2=D_d=y zOaI=|r%^ImI@-X*6!yEiUrgADC!J*%4NM~Ua8Ua_)G1>>grN#;9aOeJS)uea6h(Lt zXKGE`Y8kgMM32+CUQ#pk=N_ddN~~7ZAX^8mLG4vLhii3jb0p_QO$Z83Uy$BE%se3R zA-^G8JHbxO;PG()0-q1n9hU)HcM+2<>XflKsz1EJp|vYXT= z{3AdhOL$tk7i*y|hE6X>?4CJ7Te z3mZWwNM3nkV|M;Mg@H!2)jH!fe#6$?eF7oa(t}F zQXMouq|%qU*a%ADb(f|sZZAOyN|{WEDHIL%Kz>d#8h4lGh=(+EnMzzlvtQgln*YXI z-=<$HWs} z-w4!yL)H-ajBpGcIg(bck+*B&_1`|R5E_4Vu_&+w5Q@kI6crWB*SnRE7_CoR36f+$ z3AWwL`iKZikZRI|oZmW_>(i?eQ{-mNoMtaXY9@NHu?-uIi(VWMN4-bpyXS_85ye_O zu6bWzFLb=?0FX)hxutni`i@Bbi!WkOgqqUC3!XdrB&JBjyzJFbPHW+1-B`6miZy)qU=ioeT7-aL_2*^ZQ_Gy(vg!`q zuM2E&n37$=t^$|6D6uTF3GmIyMBxG?Xh$4FK|#`3L-a*_ft(m9QtH_WyA8Znv%9Ud zDJV9`?Ln}_IG18*TY(1_E+aW%fEL_cI)Gc)<`TiN-6m{nRek->`)pwyCVM`=_XGc2 zSwhVAqQyXns-5L?M@uokND+=|Fgw$wTG?r!rHtB;^$FQ%9Q%t16T>5R;}kc?(H4&7 z*^*@31%t5~Vm-}Gao_KGgyxk#{OMuDF8>j}0o0nM3={Sl)G4*M!-{}Ee|mY+y}q6A zJuigWV5vDo1ggCiN+!cU117#KWQ$9DLThPES+`bJEqTZuF$+QCXH`M@l~+Uh?=+<` z$Iy$<0g5S^6NMxA+&|@YHV0*)ux}hRAaJThPg1YH9#2TLZ>TG9LN9#HD~Hn#@C)u+ z20z-mTsC$hur2r` zHD)lJch<;b#P5*hi7<00a6I`G)A{sxViUF~f1P?(NY)rxm5!sn5hwNqsJF3;bFmJ!c@QtZBDfS#1 zrGioI1~r#YXMPaSIg}Xw#weNR5k}P&cYU1m-`}jx8@M+KdleIJE<)}?MJ8udt*vw< ztaivW!`|F$;`Gp1;oI?d>_w=E=A?b*;*3z8_eAXO7ruVF| z%r`1UKNM zy0aqe>{T{?W7+ooAua10e;e7GR9yC96Mjvt7|%X9UbNa_OpHsdJPh|7bS6{8 zz}NYe*Q(h8-+#v7lVVQir3@*&*Xs2{l*_D1^no3Ys$oe@erZvs(eN5PDR%(Gz_Nx{ z&Nlsn!a9o)r-*#?n5t`Iq@0XtrO4zC$1Uof9y&xMNbc*l^E)ys&+(GP$kTEC)r`}V zPQvc!)@RSYNQesw0OW(R)JEWbyTS04bo*ECA-06Qx3m^iDt6}MGvoQj@y-FVpY-_LBAF9cQ(|2hZ6uPK9jUmMz16C0bBJ6 zw92drW*wu%WJ7j5o_~*dVnfbzQQ{Hd&>IYx1b~Up1ip*J_Ug0gzehYNJD)jVyYo}G ztx(6x?&DEEj$hdJ?FLfE4!@*Dis-T2{`b(Qvur7oj-V+lS8i3am-_xi0Hks|Q*XE+ zk?tKcHlmxvr$KjG_zz%XjmP=#li&i)pe##DPhV&Lx<0rzoLD#z;uM`5llo#A%qb;f z8d9_FC7n&rMp9k_wn|m%D0mG2dFIo5FE?^E3|og)N)8F!44nMArj|XPH%5pT%AYgp zD9!B2)ZXg7viuzO)xS^rOCU%jgjqN0TWpEjAs>jx-jVt+}4u}CV_%&sYX zA+6`BQ%_h#A>IGP*&gBmbqhB37ABplQ0|zSbH<2~M*R(MA6fIm148Oh{cYGM2~!Z8 z08B`L(4NHi?AsgxUMC5TU>ej@swxnR)*$F*rSe&=>S>xKYn9koqDV>kYgf6x_l0

i&qpOq^XE78VNG?;YiWI; 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ÛhZd4wcN4&D1JeklSj$TYD_MC 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 literal 89162 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 diff --git a/desloppify/app/commands/autofix/apply_retro.py b/desloppify/app/commands/autofix/apply_retro.py index e9afb121..3f5ac16b 100644 --- a/desloppify/app/commands/autofix/apply_retro.py +++ b/desloppify/app/commands/autofix/apply_retro.py @@ -19,14 +19,17 @@ def _resolve_fixer_results( state: dict, results: list[dict], detector: str, fixer_name: str ) -> list[str]: + work_items = state.get("work_items") or state.get("issues", {}) + state["work_items"] = work_items + state["issues"] = work_items resolved_ids = [] for result in results: result_file = rel(result["file"]) for symbol in result["removed"]: issue_id = f"{detector}::{result_file}::{symbol}" - if issue_id in state["issues"] and state["issues"][issue_id]["status"] == "open": - state["issues"][issue_id]["status"] = "fixed" - state["issues"][issue_id]["note"] = ( + if issue_id in work_items and work_items[issue_id]["status"] == "open": + work_items[issue_id]["status"] = "fixed" + work_items[issue_id]["note"] = ( f"auto-fixed by desloppify autofix {fixer_name}" ) resolved_ids.append(issue_id) diff --git a/desloppify/app/commands/exclude.py b/desloppify/app/commands/exclude.py index 647e2b7d..8183bde8 100644 --- a/desloppify/app/commands/exclude.py +++ b/desloppify/app/commands/exclude.py @@ -30,9 +30,11 @@ def _state_file_for_runtime(runtime) -> Path: def _prune_excluded_issues(state: dict, pattern: str) -> list[str]: """Drop issues whose file path matches a new exclusion pattern.""" - issues = state.get("issues") + issues = state.get("work_items") or state.get("issues") if not isinstance(issues, dict): return [] + state["work_items"] = issues + state["issues"] = issues removed_ids = [ issue_id @@ -62,6 +64,11 @@ def cmd_exclude(args: argparse.Namespace) -> None: runtime = command_runtime(args) config = runtime.config state = runtime.state + if isinstance(state, dict): + issues = state.get("work_items") or state.get("issues") + if isinstance(issues, dict): + state["work_items"] = issues + state["issues"] = issues state_file = _state_file_for_runtime(runtime) config_mod.add_exclude_pattern(config, args.pattern) diff --git a/desloppify/app/commands/helpers/guardrails.py b/desloppify/app/commands/helpers/guardrails.py index 1c1af9d0..9d92eacd 100644 --- a/desloppify/app/commands/helpers/guardrails.py +++ b/desloppify/app/commands/helpers/guardrails.py @@ -119,7 +119,7 @@ def require_triage_current_or_exit( ] if new_ids: for fid in sorted(new_ids)[:5]: - issue = state.get("issues", {}).get(fid, {}) + issue = (state.get("work_items") or state.get("issues", {})).get(fid, {}) lines.append(f" * [{short_issue_id(fid)}] {issue.get('summary', '')}") if len(new_ids) > 5: lines.append(f" ... and {len(new_ids) - 5} more") diff --git a/desloppify/app/commands/helpers/queue_progress.py b/desloppify/app/commands/helpers/queue_progress.py index 89a09c40..03680a78 100644 --- a/desloppify/app/commands/helpers/queue_progress.py +++ b/desloppify/app/commands/helpers/queue_progress.py @@ -208,7 +208,7 @@ def plan_aware_queue_breakdown( cluster_member_ids = set(cluster_data.get("issue_ids", [])) open_issues = { fid - for fid, f in state.get("issues", {}).items() + for fid, f in (state.get("work_items") or state.get("issues", {})).items() if f.get("status") == "open" } focus_cluster_count = len(cluster_member_ids & open_issues) diff --git a/desloppify/app/commands/next/queue_flow.py b/desloppify/app/commands/next/queue_flow.py index 4bbff368..641f847b 100644 --- a/desloppify/app/commands/next/queue_flow.py +++ b/desloppify/app/commands/next/queue_flow.py @@ -212,7 +212,7 @@ def _render_terminal_queue_view( """Render terminal output for a non-empty queue.""" dim_scores = state.get("dimension_scores", {}) issues_scoped = path_scoped_issues( - state.get("issues", {}), + (state.get("work_items") or state.get("issues", {})), state.get("scan_path"), ) plan_start_strict = None diff --git a/desloppify/app/commands/plan/cluster/dispatch.py b/desloppify/app/commands/plan/cluster/dispatch.py index 456c33b2..4b0a1c95 100644 --- a/desloppify/app/commands/plan/cluster/dispatch.py +++ b/desloppify/app/commands/plan/cluster/dispatch.py @@ -44,7 +44,7 @@ def _all_known_issue_ids(state: dict, plan: dict | None) -> list[str]: - all_ids: list[str] = list(state.get("issues", {}).keys()) + all_ids: list[str] = list((state.get("work_items") or state.get("issues", {})).keys()) if plan is None: return all_ids seen_ids: set[str] = set(all_ids) diff --git a/desloppify/app/commands/plan/cluster_ops_display.py b/desloppify/app/commands/plan/cluster_ops_display.py index 75f8d2d7..485eb3a6 100644 --- a/desloppify/app/commands/plan/cluster_ops_display.py +++ b/desloppify/app/commands/plan/cluster_ops_display.py @@ -33,7 +33,7 @@ def _print_cluster_member(idx: int, fid: str, issue: dict | None) -> None: def _load_issues_best_effort(args: argparse.Namespace) -> dict: """Load issues from state, returning empty dict on failure.""" rt = command_runtime(args) - return rt.state.get("issues", {}) + return rt.state.get("work_items") or rt.state.get("issues", {}) def _load_cluster_or_print_missing(cluster_name: str) -> dict | None: diff --git a/desloppify/app/commands/plan/override_resolve_helpers.py b/desloppify/app/commands/plan/override_resolve_helpers.py index 5f410abf..3f39fd98 100644 --- a/desloppify/app/commands/plan/override_resolve_helpers.py +++ b/desloppify/app/commands/plan/override_resolve_helpers.py @@ -20,7 +20,7 @@ def check_cluster_guard(patterns: list[str], plan: dict, state: dict) -> bool: """Return True if blocked by cluster guard, False if OK to proceed.""" clusters = plan.get("clusters", {}) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) for pattern in patterns: if pattern in clusters: cluster = clusters[pattern] @@ -45,7 +45,7 @@ def check_cluster_guard(patterns: list[str], plan: dict, state: dict) -> bool: def print_cluster_guard(cluster_name: str, issue_ids: list[str], state: dict) -> None: - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) print( colorize( f"\n Cluster '{cluster_name}' has {len(issue_ids)} item(s) — mark them done individually first:\n", diff --git a/desloppify/app/commands/plan/override_skip.py b/desloppify/app/commands/plan/override_skip.py index 15ee3090..3a287bcc 100644 --- a/desloppify/app/commands/plan/override_skip.py +++ b/desloppify/app/commands/plan/override_skip.py @@ -358,7 +358,7 @@ def cmd_plan_backlog(args: argparse.Namespace) -> None: # so they don't get stranded with a non-open status while untracked by plan. _BACKLOG_REOPEN_STATUSES = {"deferred", "triaged_out"} state_data = state_mod.load_state(state_file) - issues = state_data.get("issues", {}) + issues = state_data.get("work_items", {}) reopen_ids = [ fid for fid in removed if issues.get(fid, {}).get("status") in _BACKLOG_REOPEN_STATUSES diff --git a/desloppify/app/commands/plan/shared/patterns.py b/desloppify/app/commands/plan/shared/patterns.py index f2f49f5c..7c86e94b 100644 --- a/desloppify/app/commands/plan/shared/patterns.py +++ b/desloppify/app/commands/plan/shared/patterns.py @@ -114,7 +114,7 @@ def resolve_ids_from_patterns( When *plan* is provided, literal IDs that exist only in the plan (e.g. ``subjective::*`` synthetic items) are included even if they - have no corresponding entry in ``state["issues"]``. + have no corresponding entry in ``state["work_items"]``. """ seen: set[str] = set() result: list[str] = [] diff --git a/desloppify/app/commands/plan/triage/display/layout.py b/desloppify/app/commands/plan/triage/display/layout.py index a08ce2fe..7dbea906 100644 --- a/desloppify/app/commands/plan/triage/display/layout.py +++ b/desloppify/app/commands/plan/triage/display/layout.py @@ -289,7 +289,7 @@ def show_plan_summary(plan: dict, state: dict) -> None: for name, cluster in clusters.items() if cluster_issue_ids(cluster) and not cluster.get("auto") } - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if active: print(colorize(f"\n Clusters ({len(active)}):", "bold")) diff --git a/desloppify/app/commands/plan/triage/stages/helpers.py b/desloppify/app/commands/plan/triage/stages/helpers.py index 08dfcc78..08deabd6 100644 --- a/desloppify/app/commands/plan/triage/stages/helpers.py +++ b/desloppify/app/commands/plan/triage/stages/helpers.py @@ -96,7 +96,7 @@ def unclustered_review_issues(plan: dict, state: dict | None = None) -> list[str if state is not None: review_ids = [ - fid for fid, finding in state.get("issues", {}).items() + fid for fid, finding in (state.get("work_items") or state.get("issues", {})).items() if finding.get("status") == "open" and is_triage_finding(finding) ] diff --git a/desloppify/app/commands/resolve/queue_guard.py b/desloppify/app/commands/resolve/queue_guard.py index a50ccdc3..788fd526 100644 --- a/desloppify/app/commands/resolve/queue_guard.py +++ b/desloppify/app/commands/resolve/queue_guard.py @@ -144,7 +144,7 @@ def _check_queue_order_guard( return False clusters = plan.get("clusters", {}) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) resolved_ids = _resolve_target_ids(patterns, clusters) resolved_ids = _filter_open_or_cluster_targets( resolved_ids, diff --git a/desloppify/app/commands/resolve/render.py b/desloppify/app/commands/resolve/render.py index e79c4d75..2ea320d1 100644 --- a/desloppify/app/commands/resolve/render.py +++ b/desloppify/app/commands/resolve/render.py @@ -35,12 +35,13 @@ def _print_wontfix_batch_warning( ) -> None: if status != "wontfix" or resolved_count <= 10: return + work_items = state.get("work_items") or state.get("issues", {}) wontfix_count = sum( - 1 for issue in state["issues"].values() if issue["status"] == "wontfix" + 1 for issue in work_items.values() if issue["status"] == "wontfix" ) actionable = sum( 1 - for issue in state["issues"].values() + for issue in work_items.values() if issue["status"] in ("open", "wontfix", "fixed", "auto_resolved", "false_positive") ) @@ -114,8 +115,9 @@ def _print_subjective_reset_hint( all_resolved: list[str], prev_subjective_scores: dict[str, float], ) -> None: + work_items = state.get("work_items") or state.get("issues", {}) has_review = any( - state["issues"].get(fid, {}).get("detector") == "review" + work_items.get(fid, {}).get("detector") == "review" for fid in all_resolved ) if not has_review or not state.get("subjective_assessments"): @@ -125,10 +127,10 @@ def _print_subjective_reset_hint( dim for dim in { str( - state["issues"].get(fid, {}).get("detail", {}).get("dimension", "") + work_items.get(fid, {}).get("detail", {}).get("dimension", "") ).strip() for fid in all_resolved - if state["issues"].get(fid, {}).get("detector") == "review" + if work_items.get(fid, {}).get("detector") == "review" } if dim and dim in (state.get("subjective_assessments") or {}) ) @@ -236,9 +238,10 @@ def render_commit_guidance( def _print_next_command(state: dict) -> str: + work_items = state.get("work_items") or state.get("issues", {}) remaining = sum( 1 - for issue in state["issues"].values() + for issue in work_items.values() if issue["status"] == "open" and not issue.get("suppressed") ) diff --git a/desloppify/app/commands/review/batch/core_models.py b/desloppify/app/commands/review/batch/core_models.py index 67f3bf99..f8880a8c 100644 --- a/desloppify/app/commands/review/batch/core_models.py +++ b/desloppify/app/commands/review/batch/core_models.py @@ -51,7 +51,6 @@ class BatchDimensionJudgmentPayload(TypedDict, total=False): """Reviewer's holistic judgment narrative for a dimension.""" strengths: list[str] - issue_character: str dimension_character: str score_rationale: str diff --git a/desloppify/app/commands/review/batch/core_normalize.py b/desloppify/app/commands/review/batch/core_normalize.py index 62c13cab..f917afd3 100644 --- a/desloppify/app/commands/review/batch/core_normalize.py +++ b/desloppify/app/commands/review/batch/core_normalize.py @@ -117,7 +117,6 @@ def _validate_dimension_judgment( require_complete=require_complete, ) - # Accept dimension_character (new) or issue_character (legacy) dimension_character = _normalize_dimension_judgment_text( key, raw.get("dimension_character"), @@ -132,10 +131,10 @@ def _validate_dimension_judgment( require_complete=False, log_fn=log_fn, ) - # Require at least one character field when completeness is required - if require_complete and not dimension_character and not issue_character: + effective_dimension_character = dimension_character or issue_character + if require_complete and not effective_dimension_character: raise ValueError( - f"dimension_judgment.{key} must include dimension_character or issue_character" + f"dimension_judgment.{key} must include dimension_character" ) score_rationale = _normalize_dimension_judgment_text( @@ -147,16 +146,14 @@ def _validate_dimension_judgment( min_length=50, ) - if not dimension_character and not issue_character and not score_rationale and not strengths: + if not effective_dimension_character and not score_rationale and not strengths: return None result: BatchDimensionJudgmentPayload = {} if strengths: result["strengths"] = strengths - if dimension_character: - result["dimension_character"] = dimension_character - if issue_character: - result["issue_character"] = issue_character + if effective_dimension_character: + result["dimension_character"] = effective_dimension_character if score_rationale: result["score_rationale"] = score_rationale return result @@ -198,8 +195,8 @@ def _normalize_dimension_judgment_text( log_fn(f" dimension_judgment.{key}.{field_name}: missing or empty") return "" if min_length is not None and len(value) < min_length: - log_fn( - f" dimension_judgment.{key}.{field_name}: " + raise ValueError( + f"dimension_judgment.{key}.{field_name}: " f"too short ({len(value)} chars, want ≥{min_length})" ) return value @@ -531,7 +528,7 @@ def _normalize_dimension_judgments( ) if validated is None: raise ValueError( - f"dimension_judgment.{key} must include dimension_character (or issue_character) and score_rationale" + f"dimension_judgment.{key} must include dimension_character and score_rationale" ) dimension_judgment[key] = validated return dimension_judgment diff --git a/desloppify/app/commands/review/importing/cmd.py b/desloppify/app/commands/review/importing/cmd.py index 8f0da2a7..fd38396c 100644 --- a/desloppify/app/commands/review/importing/cmd.py +++ b/desloppify/app/commands/review/importing/cmd.py @@ -6,7 +6,6 @@ from pathlib import Path from types import SimpleNamespace -from desloppify import state as state_mod from desloppify.app.commands.scan.reporting import ( dimensions as reporting_dimensions_mod, ) @@ -23,11 +22,14 @@ import_scores_meta_matches, pending_import_scores_meta, ) +from desloppify.engine._state.persistence import load_state, save_state +from desloppify.engine._state.schema import utc_now from desloppify.intelligence import integrity as subjective_integrity_mod from desloppify.intelligence.review.importing.holistic import import_holistic_issues from desloppify.intelligence.review.importing.contracts_models import ( AssessmentImportPolicyModel, ) +from desloppify.state_score_snapshot import score_snapshot from ..assessment_integrity import ( bind_scorecard_subjective_at_target, @@ -46,9 +48,9 @@ print_import_load_errors, ) from .policy import assessment_policy_model_from_payload -from .helpers import load_import_issues_data from .parse import ( ImportPayloadLoadError, + load_import_issues_data, resolve_override_context, ) from .plan_sync import PlanImportSyncRequest, sync_plan_after_import @@ -96,7 +98,7 @@ def _build_working_state(state: dict, state_file) -> dict: """Return state snapshot used for import mutation/dry-run rendering.""" state_path = Path(state_file) if state_file is not None else None if state_path is not None and state_path.exists(): - return copy.deepcopy(state_mod.load_state(state_path)) + return copy.deepcopy(load_state(state_path)) return copy.deepcopy(state) @@ -145,14 +147,17 @@ def _append_assessment_import_audit( provisional_count: int, override_attest: str | None, import_file, + import_payload: dict, ) -> None: """Record audit metadata for assessment-bearing import payloads.""" if not assessment_policy.assessments_present: return + provenance = import_payload.get("provenance") + provenance_dict = provenance if isinstance(provenance, dict) else {} audit = working_state.setdefault("assessment_import_audit", []) audit.append( { - "timestamp": state_mod.utc_now(), + "timestamp": utc_now(), "mode": assessment_policy.mode, "trusted": bool(assessment_policy.trusted), "reason": assessment_policy.reason, @@ -162,6 +167,7 @@ def _append_assessment_import_audit( "provisional_count": int(provisional_count), "attest": (override_attest or "").strip(), "import_file": str(import_file), + "packet_sha256": str(provenance_dict.get("packet_sha256", "")).strip(), } ) @@ -180,7 +186,7 @@ def _persist_import_state( """Persist imported state and synchronize the work plan.""" state.clear() state.update(working_state) - state_mod.save_state(state, state_file) + save_state(state, state_file) sync_plan_after_import( state, diff, @@ -316,7 +322,7 @@ def do_import( assessment_policy=assessment_policy, ) - prev = state_mod.score_snapshot(state) + prev = score_snapshot(state) working_state = _build_working_state(state, state_file) diff = import_holistic_issues(issues_data, working_state, lang.name) @@ -333,6 +339,7 @@ def do_import( provisional_count=provisional_count, override_attest=override_attest, import_file=import_file, + import_payload=issues_data, ) if not dry_run: @@ -382,7 +389,7 @@ def do_validate_import( try: issues_data = load_import_issues_data( import_file, - config=build_import_load_config( + options=build_import_load_config( lang_name=lang.name, import_config=resolved_import_config, override_enabled=override_enabled, diff --git a/desloppify/app/commands/review/importing/output.py b/desloppify/app/commands/review/importing/output.py index 8ab53ac3..0aa49f03 100644 --- a/desloppify/app/commands/review/importing/output.py +++ b/desloppify/app/commands/review/importing/output.py @@ -298,9 +298,10 @@ def print_assessments_summary(state: StateModel, *, colorize_fn) -> None: def print_open_review_summary(state: StateModel, *, colorize_fn) -> str: """Print current open review issue count and return next command.""" + work_items = state.get("work_items") or state.get("issues", {}) open_review = [ issue - for issue in state["issues"].values() + for issue in work_items.values() if issue["status"] == "open" and issue.get("detector") == "review" ] if not open_review: @@ -320,7 +321,6 @@ def print_review_import_scores_and_integrity( state: StateModel, config: dict[str, Any], *, - state_mod, target_strict_score_from_config_fn, subjective_at_target_fn, subjective_rerun_command_fn, diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index f9068b2d..e58cff6b 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -76,7 +76,7 @@ class _PlanImportMutations: def _has_postflight_review_work(state: dict, *, policy) -> bool: - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if any( isinstance(issue, dict) and issue.get("status") == "open" @@ -142,7 +142,7 @@ def _print_new_review_items(state: dict, new_ids: list[str]) -> None: f" Plan updated: {len(new_ids)} new review issue(s) added to queue.", "bold", )) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) for finding_id in sorted(new_ids)[:10]: finding = issues.get(finding_id, {}) print(f" * [{short_issue_id(finding_id)}] {finding.get('summary', '')}") diff --git a/desloppify/app/commands/review/importing/results.py b/desloppify/app/commands/review/importing/results.py index 6c4d44f8..fd756357 100644 --- a/desloppify/app/commands/review/importing/results.py +++ b/desloppify/app/commands/review/importing/results.py @@ -3,7 +3,6 @@ from __future__ import annotations import desloppify.intelligence.narrative.core as narrative_core -from desloppify import state_compat as state_compat from desloppify.app.commands.helpers.query import write_query from desloppify.app.commands.helpers.queue_progress import show_score_with_plan_context from desloppify.app.commands.scan.reporting import dimensions as reporting_dimensions @@ -67,7 +66,6 @@ def report_review_import_outcome( at_target = print_review_import_scores_and_integrity( state, config or {}, - state_mod=state_compat, target_strict_score_from_config_fn=target_strict_score_from_config, subjective_at_target_fn=scorecard_subjective_at_target_fn, subjective_rerun_command_fn=reporting_dimensions.subjective_rerun_command, diff --git a/desloppify/app/commands/scan/artifacts.py b/desloppify/app/commands/scan/artifacts.py index 12007599..054d19d2 100644 --- a/desloppify/app/commands/scan/artifacts.py +++ b/desloppify/app/commands/scan/artifacts.py @@ -38,7 +38,7 @@ def build_scan_query_payload( ) -> ScanQueryPayload: """Build the canonical query payload persisted after a scan.""" scores = score_snapshot(state) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) open_scope = ( open_scope_breakdown(issues, state.get("scan_path")) if isinstance(issues, dict) diff --git a/desloppify/app/commands/scan/plan_reconcile.py b/desloppify/app/commands/scan/plan_reconcile.py index e21721dd..409b511d 100644 --- a/desloppify/app/commands/scan/plan_reconcile.py +++ b/desloppify/app/commands/scan/plan_reconcile.py @@ -403,7 +403,7 @@ def _has_postflight_review_work( *, policy, ) -> bool: - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) has_review_like_issue = any( isinstance(issue, dict) and issue.get("status") == "open" diff --git a/desloppify/app/commands/scan/reporting/dimensions.py b/desloppify/app/commands/scan/reporting/dimensions.py index 9d6d49d1..98b69fad 100644 --- a/desloppify/app/commands/scan/reporting/dimensions.py +++ b/desloppify/app/commands/scan/reporting/dimensions.py @@ -125,7 +125,7 @@ def show_scorecard_subjective_measures(state: dict) -> None: stale_keys = [e["dimension_key"] for e in entries if e.get("stale")] has_open = any( f.get("status") == "open" and not f.get("suppressed") - for f in (state.get("issues") or {}).values() + for f in (state.get("work_items") or {}).values() ) stale_followup = _stale_subjective_followup(stale_keys, has_open=has_open) if stale_followup: diff --git a/desloppify/app/commands/scan/reporting/presentation.py b/desloppify/app/commands/scan/reporting/presentation.py index cd63bd02..3ee44e6c 100644 --- a/desloppify/app/commands/scan/reporting/presentation.py +++ b/desloppify/app/commands/scan/reporting/presentation.py @@ -386,7 +386,8 @@ def show_detector_progress( colorize_fn: Callable[[str, str], str], ) -> None: """Show per-detector progress bars.""" - issues = state_mod.path_scoped_issues(state["issues"], state.get("scan_path")) + work_items = state.get("work_items") or state.get("issues", {}) + issues = state_mod.path_scoped_issues(work_items, state.get("scan_path")) if not issues: return diff --git a/desloppify/app/commands/scan/reporting/subjective.py b/desloppify/app/commands/scan/reporting/subjective.py index f7f49f61..712e1a6c 100644 --- a/desloppify/app/commands/scan/reporting/subjective.py +++ b/desloppify/app/commands/scan/reporting/subjective.py @@ -422,7 +422,7 @@ def build_subjective_followup( def _subjective_coverage_global(state: dict) -> int: - all_issues = state.get("issues", {}) + all_issues = (state.get("work_items") or state.get("issues", {})) if not isinstance(all_issues, dict): all_issues = {} coverage_global, _reason_counts, _holistic_reasons = ( diff --git a/desloppify/app/commands/scan/wontfix.py b/desloppify/app/commands/scan/wontfix.py index 44dd5a14..15ecda37 100644 --- a/desloppify/app/commands/scan/wontfix.py +++ b/desloppify/app/commands/scan/wontfix.py @@ -147,7 +147,7 @@ def augment_with_stale_wontfix_issues( decay_scans: int, ) -> tuple[list[dict[str, Any]], int]: """Append re-triage issues for stale or worsening wontfix debt.""" - existing = state.get("issues", {}) + existing = (state.get("work_items") or state.get("issues", {})) if not isinstance(existing, dict): return issues, 0 diff --git a/desloppify/app/commands/scan/workflow.py b/desloppify/app/commands/scan/workflow.py index fa09bab5..6f592488 100644 --- a/desloppify/app/commands/scan/workflow.py +++ b/desloppify/app/commands/scan/workflow.py @@ -121,7 +121,7 @@ def _ensure_state_lang_capabilities( def _state_issues(state: StateModel) -> dict[str, dict[str, Any]]: """Return normalized issue map from state.""" - issues = state.get("issues") + issues = state.get("work_items") if isinstance(issues, dict): return issues raise ScanStateContractError( diff --git a/desloppify/app/commands/show/dimension_views.py b/desloppify/app/commands/show/dimension_views.py index ea35430f..924e6f31 100644 --- a/desloppify/app/commands/show/dimension_views.py +++ b/desloppify/app/commands/show/dimension_views.py @@ -27,7 +27,7 @@ def _print_dimension_score(dim_data: dict, display_name: str) -> None: def _render_judgment(state: dict, dimension_key: str) -> None: - """Print judgment narrative (strengths, issue_character, score_rationale) if available.""" + """Print judgment narrative (strengths, dimension_character, score_rationale) if available.""" assessments = state.get("subjective_assessments", {}) assessment = assessments.get(dimension_key, {}) if not isinstance(assessment, dict): @@ -49,10 +49,6 @@ def _render_judgment(state: dict, dimension_key: str) -> None: dim_char = judgment.get("dimension_character", "") if dim_char: print(colorize(f" Dimension character: {dim_char}", "dim")) - else: - issue_character = judgment.get("issue_character", "") - if issue_character: - print(colorize(f" Issue character: {issue_character}", "dim")) def _render_subjective_dimension( @@ -75,7 +71,7 @@ def _render_subjective_dimension( ) dim_reviews = [ issue - for issue in (state.get("issues") or {}).values() + for issue in (state.get("work_items") or {}).values() if is_triage_finding(issue) and issue.get("status") == "open" and lowered diff --git a/desloppify/app/commands/status/cmd.py b/desloppify/app/commands/status/cmd.py index 3903df30..70d8d1c4 100644 --- a/desloppify/app/commands/status/cmd.py +++ b/desloppify/app/commands/status/cmd.py @@ -69,7 +69,7 @@ def _status_json_payload( suppression: dict, ) -> dict: scores = score_snapshot(state) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) open_scope = ( open_scope_breakdown(issues, state.get("scan_path")) if isinstance(issues, dict) diff --git a/desloppify/app/commands/status/render.py b/desloppify/app/commands/status/render.py index c78d9dc5..d7553cae 100644 --- a/desloppify/app/commands/status/render.py +++ b/desloppify/app/commands/status/render.py @@ -322,7 +322,7 @@ def show_structural_areas(state: StateModel) -> None: def show_review_summary(state: StateModel) -> None: """Show review issues summary if any exist.""" - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) review_open = [ f for f in issues.values() diff --git a/desloppify/app/commands/status/render_dimensions.py b/desloppify/app/commands/status/render_dimensions.py index 1b37cd8b..9083c085 100644 --- a/desloppify/app/commands/status/render_dimensions.py +++ b/desloppify/app/commands/status/render_dimensions.py @@ -45,7 +45,7 @@ def find_lowest_dimension( def open_review_issue_counts(state: dict) -> dict[str, int]: """Count open review issues grouped by subjective dimension key.""" - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if not isinstance(issues, dict): return {} diff --git a/desloppify/app/commands/status/render_io.py b/desloppify/app/commands/status/render_io.py index 0a02c63d..e48f0f5c 100644 --- a/desloppify/app/commands/status/render_io.py +++ b/desloppify/app/commands/status/render_io.py @@ -103,7 +103,7 @@ def write_status_query(request: StatusQueryRequest) -> None: verified_strict_score = request.verified_strict_score plan = request.plan - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) open_scope = ( open_scope_breakdown(issues, state.get("scan_path")) if isinstance(issues, dict) diff --git a/desloppify/app/commands/status/render_structural.py b/desloppify/app/commands/status/render_structural.py index 7459ea57..75d16bae 100644 --- a/desloppify/app/commands/status/render_structural.py +++ b/desloppify/app/commands/status/render_structural.py @@ -14,7 +14,7 @@ def collect_structural_areas( ) -> list[tuple[str, list]] | None: """Collect T3/T4 structural issues grouped by area.""" issues = path_scoped_issues( - state.get("issues", {}), state.get("scan_path") + (state.get("work_items") or state.get("issues", {})), state.get("scan_path") ) structural = [ issue diff --git a/desloppify/app/commands/status/summary.py b/desloppify/app/commands/status/summary.py index 9d9ee04c..7d2a6012 100644 --- a/desloppify/app/commands/status/summary.py +++ b/desloppify/app/commands/status/summary.py @@ -115,7 +115,7 @@ def print_scan_completeness(state: dict) -> None: def print_open_scope_breakdown(state: dict) -> None: """Print open counts with explicit in-scope/out-of-scope semantics.""" - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if not isinstance(issues, dict): return diff --git a/desloppify/app/commands/zone.py b/desloppify/app/commands/zone.py index e7e5d501..758551cd 100644 --- a/desloppify/app/commands/zone.py +++ b/desloppify/app/commands/zone.py @@ -104,7 +104,7 @@ def _zone_set(args: argparse.Namespace): sp = state_path(args) if sp.exists(): state = load_state(sp) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) updated = 0 for issue in issues.values(): if issue.get("file") == normalized: @@ -138,7 +138,7 @@ def _zone_clear(args: argparse.Namespace): sp = state_path(args) if sp.exists(): state = load_state(sp) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) updated = 0 for issue in issues.values(): if issue.get("file") == normalized: diff --git a/desloppify/app/output/visualize_data.py b/desloppify/app/output/visualize_data.py index 54b0b63c..96765285 100644 --- a/desloppify/app/output/visualize_data.py +++ b/desloppify/app/output/visualize_data.py @@ -203,8 +203,9 @@ def _build_dep_graph_for_path(path: Path, lang) -> dict: def _issues_by_file(state: dict | None) -> dict[str, list]: """Group issues from state by file path.""" result: dict[str, list] = defaultdict(list) - if state and state.get("issues"): - for f in state["issues"].values(): + work_items = (state.get("work_items") or state.get("issues", {})) if state else {} + if work_items: + for f in work_items.values(): result[f["file"]].append(f) return result diff --git a/desloppify/base/output/issues.py b/desloppify/base/output/issues.py index 1617f0cc..a8d9a06c 100644 --- a/desloppify/base/output/issues.py +++ b/desloppify/base/output/issues.py @@ -1,4 +1,4 @@ -"""Rendering and scoring helpers for issue work orders.""" +"""Rendering and scoring helpers for work-item work orders.""" from __future__ import annotations @@ -16,7 +16,7 @@ def issue_weight(issue: dict) -> tuple[float, float, str]: - """Compute (weight, impact_pts, issue_id) for a issue.""" + """Compute (weight, impact_pts, work_item_id) for a tracked work item.""" confidence = issue.get("confidence", "low") is_holistic = issue.get("detail", {}).get("holistic", False) @@ -47,7 +47,7 @@ def _append_assessment_context( f"({source} review, {assessed_at})" ) lines.append( - "Fixing this issue and re-reviewing should improve the " + "Fixing this work item and re-reviewing should improve the " f"{display_dimension} score.\n" ) @@ -151,7 +151,7 @@ def render_issue_detail( number: int | None = None, subjective_assessments: dict | None = None, ) -> str: - """Render one issue as a markdown work order from state.""" + """Render one tracked work item as a markdown work order from state.""" issue_id = issue["id"] detail = issue.get("detail", {}) detector = issue.get("detector", "") @@ -175,7 +175,7 @@ def render_issue_detail( lines: list[str] = [] lines.append(f"# {dimension}: {identifier}\n") - lines.append(f"**Issue**: `{issue_id}` ") + lines.append(f"**Work item**: `{issue_id}` ") if not is_review: meta = DETECTORS.get(detector) detector_display = meta.display if meta else detector diff --git a/desloppify/engine/_concerns/state.py b/desloppify/engine/_concerns/state.py index 45113b2c..227ce793 100644 --- a/desloppify/engine/_concerns/state.py +++ b/desloppify/engine/_concerns/state.py @@ -10,7 +10,7 @@ def _open_issues(state: StateModel) -> list[dict[str, Any]]: """Return all open issues from state.""" - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) return [ finding for finding in issues.values() if isinstance(finding, dict) and finding.get("status") == "open" diff --git a/desloppify/engine/_plan/auto_cluster.py b/desloppify/engine/_plan/auto_cluster.py index c6037f31..ac803213 100644 --- a/desloppify/engine/_plan/auto_cluster.py +++ b/desloppify/engine/_plan/auto_cluster.py @@ -157,7 +157,7 @@ def auto_cluster_issues( """ ensure_plan_defaults(plan) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) clusters = plan.get("clusters", {}) now = utc_now() diff --git a/desloppify/engine/_plan/commit_tracking.py b/desloppify/engine/_plan/commit_tracking.py index 3a6c5de7..54489b85 100644 --- a/desloppify/engine/_plan/commit_tracking.py +++ b/desloppify/engine/_plan/commit_tracking.py @@ -137,7 +137,7 @@ def commit_tracking_summary(plan: dict[str, Any]) -> dict[str, int]: def _issue_summary(state: StateModel, issue_id: str) -> str: """Extract a short summary for a issue ID from state.""" - issue = state.get("issues", {}).get(issue_id, {}) + issue = (state.get("work_items") or state.get("issues", {})).get(issue_id, {}) summary = issue.get("summary", "") if summary: return summary[:80] diff --git a/desloppify/engine/_plan/policy/stale.py b/desloppify/engine/_plan/policy/stale.py index 24867d4e..17f12f8d 100644 --- a/desloppify/engine/_plan/policy/stale.py +++ b/desloppify/engine/_plan/policy/stale.py @@ -14,7 +14,7 @@ def open_review_ids(state: StateModel) -> set[str]: """Return IDs of open review/concerns issues from state.""" return { fid - for fid, f in state.get("issues", {}).items() + for fid, f in (state.get("work_items") or state.get("issues", {})).items() if f.get("status") == "open" and is_triage_finding(f) } diff --git a/desloppify/engine/_plan/policy/subjective.py b/desloppify/engine/_plan/policy/subjective.py index 27ea9ef6..8ab25ac0 100644 --- a/desloppify/engine/_plan/policy/subjective.py +++ b/desloppify/engine/_plan/policy/subjective.py @@ -108,7 +108,7 @@ def compute_subjective_visibility( else scan_path ) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) skipped_ids = set((plan or {}).get("skipped", {}).keys()) # Count open, non-suppressed, objective issues. diff --git a/desloppify/engine/_plan/reconcile.py b/desloppify/engine/_plan/reconcile.py index 4125e6c4..4de0965a 100644 --- a/desloppify/engine/_plan/reconcile.py +++ b/desloppify/engine/_plan/reconcile.py @@ -22,7 +22,7 @@ ensure_plan_defaults, ) from desloppify.engine._plan.skip_policy import skip_kind_state_status -from desloppify.engine._state.schema import StateModel, utc_now +from desloppify.engine._state.schema import StateModel, ensure_state_defaults, utc_now SUPERSEDED_TTL_DAYS = 90 @@ -43,7 +43,7 @@ def _find_candidates( ) -> list[str]: """Find alive issues that could be remaps for a disappeared issue.""" candidates: list[str] = [] - for fid, issue in state.get("issues", {}).items(): + for fid, issue in (state.get("work_items") or state.get("issues", {})).items(): if issue.get("status") not in _ALIVE_STATUSES: continue if issue.get("detector") == detector and issue.get("file") == file: @@ -56,7 +56,7 @@ def _find_candidates( def _is_issue_alive(state: StateModel, issue_id: str) -> bool: """Return True if the issue exists and is actionable (open/deferred/triaged_out).""" - issue = state.get("issues", {}).get(issue_id) + issue = (state.get("work_items") or state.get("issues", {})).get(issue_id) if issue is None: return False return issue.get("status") in _ALIVE_STATUSES @@ -69,7 +69,7 @@ def _supersede_id( now: str, ) -> bool: """Move a disappeared issue to superseded. Returns True if changed.""" - issue = state.get("issues", {}).get(issue_id) + issue = (state.get("work_items") or state.get("issues", {})).get(issue_id) detector = "" file = "" summary = "" @@ -231,7 +231,7 @@ def _sync_skipped_issue_statuses(plan: PlanModel, state: StateModel) -> None: Runs on every reconcile so existing data gets migrated on next scan. """ skipped = plan.get("skipped", {}) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) for fid, entry in skipped.items(): issue = issues.get(fid) if issue is None or issue.get("status") != "open": @@ -252,6 +252,7 @@ def reconcile_plan_after_scan( open, moves them to superseded, and prunes old superseded entries. """ ensure_plan_defaults(plan) + ensure_state_defaults(state) result = ReconcileResult() now = utc_now() now_dt = datetime.now(UTC) @@ -291,7 +292,7 @@ def reconcile_plan_after_scan( result.resurfaced = resurfaced result.changes += len(resurfaced) # Reopen resurfaced issues in state (they were deferred) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) for fid in resurfaced: issue = issues.get(fid) if issue and issue.get("status") == "deferred": diff --git a/desloppify/engine/_plan/reconcile_review_import.py b/desloppify/engine/_plan/reconcile_review_import.py index 7fb126b8..5137a722 100644 --- a/desloppify/engine/_plan/reconcile_review_import.py +++ b/desloppify/engine/_plan/reconcile_review_import.py @@ -56,7 +56,7 @@ def _is_review_queue_id(issue_id: str, state: StateModel) -> bool: Falls back to legacy ID prefixes only when the issue payload is absent. """ - issue = state.get("issues", {}).get(issue_id) + issue = (state.get("work_items") or state.get("issues", {})).get(issue_id) if isinstance(issue, dict): return is_triage_finding(issue) return issue_id.startswith("review::") or issue_id.startswith("concerns::") diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 54b0738d..15c71812 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -337,16 +337,26 @@ def executable_objective_ids( if not isinstance(plan, dict): return set(all_objective_ids) tracked_ids = _tracked_plan_ids(plan) - if not tracked_ids: - return set(all_objective_ids) skipped_ids = set(plan.get("skipped", {}).keys()) + tracked_objective_ids = tracked_ids & set(all_objective_ids) queued_ids = { issue_id for issue_id in plan.get("queue_order", []) if issue_id not in skipped_ids and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) } - return all_objective_ids & queued_ids + has_active_plan_structure = bool( + plan.get("queue_order") or plan.get("clusters") or plan.get("overrides") + ) + if not tracked_ids: + return set(all_objective_ids) - skipped_ids + if not tracked_objective_ids: + return set(all_objective_ids) - skipped_ids + if queued_ids: + return all_objective_ids & queued_ids + if not has_active_plan_structure: + return set(all_objective_ids) - skipped_ids + return set() def validate_plan(plan: dict[str, Any]) -> None: diff --git a/desloppify/engine/_plan/sync/context.py b/desloppify/engine/_plan/sync/context.py index 5e77f9ed..87351bb3 100644 --- a/desloppify/engine/_plan/sync/context.py +++ b/desloppify/engine/_plan/sync/context.py @@ -35,10 +35,13 @@ def has_objective_backlog( if policy is not None: return policy.has_objective_backlog - # Accept either full state payload (`{"issues": ...}`) or raw issues dict. + # Accept either full state payload (`{"work_items": ...}`) or a raw + # work-item mapping, with legacy ``issues`` as a fallback alias. issues = state_or_issues if isinstance(state_or_issues, dict): - maybe_issues = state_or_issues.get("issues") + maybe_issues = state_or_issues.get("work_items") + if not isinstance(maybe_issues, dict): + maybe_issues = state_or_issues.get("issues") if isinstance(maybe_issues, dict): issues = maybe_issues return any( diff --git a/desloppify/engine/_plan/sync/workflow.py b/desloppify/engine/_plan/sync/workflow.py index 5fc795d9..01696110 100644 --- a/desloppify/engine/_plan/sync/workflow.py +++ b/desloppify/engine/_plan/sync/workflow.py @@ -99,11 +99,11 @@ def _build_pending_import_scores_meta( import_payload: dict[str, Any] | None, issues_only_audit: dict[str, Any] | None, ) -> PendingImportScoresMeta: - provenance = {} + packet_sha256 = "" if isinstance(import_payload, dict): raw_provenance = import_payload.get("provenance") if isinstance(raw_provenance, dict): - provenance = raw_provenance + packet_sha256 = str(raw_provenance.get("packet_sha256", "")).strip() recorded_file = ( str(import_file).strip() if isinstance(import_file, str) and import_file.strip() @@ -114,11 +114,13 @@ def _build_pending_import_scores_meta( timestamp = "" if isinstance(issues_only_audit, dict): timestamp = str(issues_only_audit.get("timestamp", "")).strip() + if not packet_sha256 and isinstance(issues_only_audit, dict): + packet_sha256 = str(issues_only_audit.get("packet_sha256", "")).strip() return PendingImportScoresMeta( timestamp=timestamp, import_file=recorded_file, normalized_import_file=_normalize_match_path(recorded_file) or "", - packet_sha256=str(provenance.get("packet_sha256", "")).strip(), + packet_sha256=packet_sha256, ) diff --git a/desloppify/engine/_plan/triage/apply.py b/desloppify/engine/_plan/triage/apply.py index 893139c1..ccab4e95 100644 --- a/desloppify/engine/_plan/triage/apply.py +++ b/desloppify/engine/_plan/triage/apply.py @@ -13,7 +13,7 @@ ) from desloppify.engine._plan.skip_policy import skip_kind_state_status from desloppify.engine._state.issue_semantics import is_triage_finding -from desloppify.engine._state.schema import StateModel, utc_now +from desloppify.engine._state.schema import StateModel, ensure_state_defaults, utc_now from .dismiss import dismiss_triage_issues from .prompt import TriageResult @@ -170,7 +170,7 @@ def _set_triage_meta( current_hash = review_issue_snapshot_hash(state) open_review_ids = sorted( fid - for fid, issue in state.get("issues", {}).items() + for fid, issue in (state.get("work_items") or state.get("issues", {})).items() if issue.get("status") == "open" and is_triage_finding(issue) ) @@ -201,6 +201,7 @@ def apply_triage_to_plan( 4. Updates epic_triage_meta with snapshot hash """ ensure_plan_defaults(plan) + ensure_state_defaults(state) now = utc_now() result = TriageMutationResult() result.strategy_summary = triage.strategy_summary @@ -232,7 +233,7 @@ def apply_triage_to_plan( result.issues_dismissed += dismiss_count # Sync state status for dismissed issues so state is authoritative. - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) triaged_out_status = skip_kind_state_status("triaged_out") for fid in dismissed_ids: issue = issues.get(fid) diff --git a/desloppify/engine/_plan/triage/prompt.py b/desloppify/engine/_plan/triage/prompt.py index d32da59c..31f04966 100644 --- a/desloppify/engine/_plan/triage/prompt.py +++ b/desloppify/engine/_plan/triage/prompt.py @@ -181,7 +181,7 @@ def _recent_completed_clusters(meta: dict, plan: PlanModel) -> list[dict]: def collect_triage_input(plan: PlanModel, state: StateModel) -> TriageInput: """Gather all data needed for the triage LLM prompt.""" ensure_plan_defaults(plan) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) meta = plan.get("epic_triage_meta", {}) epics = triage_clusters(plan) auto_clusters = { diff --git a/desloppify/engine/_scoring/policy/core.py b/desloppify/engine/_scoring/policy/core.py index cdc17180..8835a0b9 100644 --- a/desloppify/engine/_scoring/policy/core.py +++ b/desloppify/engine/_scoring/policy/core.py @@ -48,6 +48,12 @@ class DetectorScoringPolicy: "security": SECURITY_EXCLUDED_ZONES, } +# Legacy test/import surface for code that still expects subjective detectors +# to be grouped in scoring core. +_NON_OBJECTIVE_DETECTORS = frozenset( + {"review", "concerns", "subjective_review", "subjective_assessment"} +) + def _build_builtin_detector_scoring_policies() -> dict[str, DetectorScoringPolicy]: """Build baseline scoring policies from DetectorMeta plus policy overrides.""" diff --git a/desloppify/engine/_scoring/state_integration.py b/desloppify/engine/_scoring/state_integration.py index 99fc1089..a66bc603 100644 --- a/desloppify/engine/_scoring/state_integration.py +++ b/desloppify/engine/_scoring/state_integration.py @@ -205,7 +205,7 @@ def recompute_stats( ) -> None: """Recompute stats and canonical health scores from issues.""" ensure_state_defaults(state) - issues = path_scoped_issues(state["issues"], scan_path) + issues = path_scoped_issues(state.get("work_items") or state.get("issues", {}), scan_path) counters, tier_stats = _count_issues(issues) state["stats"] = { "total": sum(counters.values()), diff --git a/desloppify/engine/_state/filtering.py b/desloppify/engine/_state/filtering.py index 72866626..3a164d47 100644 --- a/desloppify/engine/_state/filtering.py +++ b/desloppify/engine/_state/filtering.py @@ -114,12 +114,12 @@ def remove_ignored_issues(state: StateModel, pattern: str) -> int: ensure_state_defaults(state) matched_ids = [ issue_id - for issue_id, issue in state["issues"].items() + for issue_id, issue in state["work_items"].items() if is_ignored(issue_id, issue["file"], [pattern]) ] now = utc_now() for issue_id in matched_ids: - issue = state["issues"][issue_id] + issue = state["work_items"][issue_id] issue["suppressed"] = True issue["suppressed_at"] = now issue["suppression_pattern"] = pattern diff --git a/desloppify/engine/_state/issue_semantics.py b/desloppify/engine/_state/issue_semantics.py index 5cceaa50..527afa35 100644 --- a/desloppify/engine/_state/issue_semantics.py +++ b/desloppify/engine/_state/issue_semantics.py @@ -1,41 +1,64 @@ -"""Canonical issue taxonomy and semantic helpers. +"""Canonical work-item taxonomy and semantic helpers. -This module owns the semantic meaning of persisted issues. Callers should use -these helpers instead of branching on detector strings or ID prefixes. +This module owns the semantic meaning of persisted tracked work. Callers should +use these helpers instead of branching on detector strings or ID prefixes. + +Legacy ``issue`` names remain as aliases so the wider codebase can move +incrementally without losing semantic clarity. """ from __future__ import annotations from typing import Any, Mapping, TypeAlias -IssueKind: TypeAlias = str -IssueOrigin: TypeAlias = str +WorkItemKind: TypeAlias = str +WorkItemOrigin: TypeAlias = str -MECHANICAL_FINDING = "mechanical_finding" -REVIEW_FINDING = "review_finding" -CONCERN_FINDING = "concern_finding" -REVIEW_REQUEST = "review_request" +MECHANICAL_DEFECT = "mechanical_defect" +REVIEW_DEFECT = "review_defect" +REVIEW_CONCERN = "review_concern" +ASSESSMENT_REQUEST = "assessment_request" SCAN_ORIGIN = "scan" REVIEW_IMPORT_ORIGIN = "review_import" -SYNTHETIC_REQUEST_ORIGIN = "synthetic_request" +SYNTHETIC_TASK_ORIGIN = "synthetic_task" -ISSUE_KINDS: frozenset[str] = frozenset( +WORK_ITEM_KINDS: frozenset[str] = frozenset( { - MECHANICAL_FINDING, - REVIEW_FINDING, - CONCERN_FINDING, - REVIEW_REQUEST, + MECHANICAL_DEFECT, + REVIEW_DEFECT, + REVIEW_CONCERN, + ASSESSMENT_REQUEST, } ) -ISSUE_ORIGINS: frozenset[str] = frozenset( +WORK_ITEM_ORIGINS: frozenset[str] = frozenset( { SCAN_ORIGIN, REVIEW_IMPORT_ORIGIN, - SYNTHETIC_REQUEST_ORIGIN, + SYNTHETIC_TASK_ORIGIN, } ) +# Legacy semantic aliases kept for compatibility while the repo moves to the +# work-item terminology. +MECHANICAL_FINDING = MECHANICAL_DEFECT +REVIEW_FINDING = REVIEW_DEFECT +CONCERN_FINDING = REVIEW_CONCERN +REVIEW_REQUEST = ASSESSMENT_REQUEST +SYNTHETIC_REQUEST_ORIGIN = SYNTHETIC_TASK_ORIGIN +ISSUE_KINDS = WORK_ITEM_KINDS +ISSUE_ORIGINS = WORK_ITEM_ORIGINS + +_LEGACY_KIND_ALIASES: dict[str, str] = { + "mechanical_finding": MECHANICAL_DEFECT, + "review_finding": REVIEW_DEFECT, + "concern_finding": REVIEW_CONCERN, + "review_request": ASSESSMENT_REQUEST, +} +_LEGACY_ORIGIN_ALIASES: dict[str, str] = { + "synthetic_request": SYNTHETIC_TASK_ORIGIN, +} + # Mechanical detectors that remain actionable work but stay excluded from # detector-side scoring rules. SCORING_EXCLUDED_DETECTORS: frozenset[str] = frozenset( @@ -51,34 +74,34 @@ ) -def infer_issue_kind( +def infer_work_item_kind( detector: object, *, detail: Mapping[str, Any] | None = None, -) -> IssueKind: - """Infer a persisted issue kind from legacy detector/detail fields.""" +) -> WorkItemKind: + """Infer a persisted work-item kind from detector/detail fields.""" detector_name = str(detector or "").strip() detail_dict = detail if isinstance(detail, Mapping) else {} if detector_name == "review": - return REVIEW_FINDING + return REVIEW_DEFECT if detector_name == "concerns": - return CONCERN_FINDING + return REVIEW_CONCERN if detector_name in {"subjective_review", "subjective_assessment", "holistic_review"}: - return REVIEW_REQUEST + return ASSESSMENT_REQUEST # Legacy imported confirmed concerns sometimes carried review-like detail; # keep explicit concern markers mapped to concern findings. if str(detail_dict.get("concern_verdict", "")).strip().lower() == "confirmed": - return CONCERN_FINDING - return MECHANICAL_FINDING + return REVIEW_CONCERN + return MECHANICAL_DEFECT -def infer_issue_origin( +def infer_work_item_origin( detector: object, *, detail: Mapping[str, Any] | None = None, -) -> IssueOrigin: - """Infer provenance for a persisted issue.""" +) -> WorkItemOrigin: + """Infer provenance for a persisted work item.""" detector_name = str(detector or "").strip() detail_dict = detail if isinstance(detail, Mapping) else {} @@ -88,50 +111,113 @@ def infer_issue_origin( verdict = str(detail_dict.get("concern_verdict", "")).strip().lower() return REVIEW_IMPORT_ORIGIN if verdict == "confirmed" else SCAN_ORIGIN if detector_name in {"subjective_review", "subjective_assessment", "holistic_review"}: - return SYNTHETIC_REQUEST_ORIGIN + return SYNTHETIC_TASK_ORIGIN return SCAN_ORIGIN -def normalized_issue_kind(issue: Mapping[str, Any]) -> IssueKind: - """Return the canonical issue kind, inferring from legacy data when needed.""" - raw_kind = str(issue.get("issue_kind", "")).strip() - if raw_kind in ISSUE_KINDS: +def infer_issue_kind( + detector: object, + *, + detail: Mapping[str, Any] | None = None, +) -> WorkItemKind: + """Backward-compatible alias for canonical work-item kind inference.""" + return infer_work_item_kind(detector, detail=detail) + + +def infer_issue_origin( + detector: object, + *, + detail: Mapping[str, Any] | None = None, +) -> WorkItemOrigin: + """Backward-compatible alias for canonical work-item origin inference.""" + return infer_work_item_origin(detector, detail=detail) + + +def normalized_work_item_kind(issue: Mapping[str, Any]) -> WorkItemKind: + """Return the canonical work-item kind, inferring from legacy data when needed.""" + raw_kind = str( + issue.get("work_item_kind", issue.get("issue_kind", "")) + ).strip() + if raw_kind in WORK_ITEM_KINDS: return raw_kind - return infer_issue_kind(issue.get("detector", ""), detail=_detail_dict(issue)) + if raw_kind in _LEGACY_KIND_ALIASES: + return _LEGACY_KIND_ALIASES[raw_kind] + return infer_work_item_kind(issue.get("detector", ""), detail=_detail_dict(issue)) + +def normalized_issue_kind(issue: Mapping[str, Any]) -> WorkItemKind: + """Backward-compatible alias for canonical work-item kind normalization.""" + return normalized_work_item_kind(issue) -def normalized_issue_origin(issue: Mapping[str, Any]) -> IssueOrigin: - """Return the canonical issue origin, inferring from legacy data when needed.""" + +def normalized_work_item_origin(issue: Mapping[str, Any]) -> WorkItemOrigin: + """Return the canonical work-item origin, inferring from legacy data when needed.""" raw_origin = str(issue.get("origin", "")).strip() - if raw_origin in ISSUE_ORIGINS: + if raw_origin in WORK_ITEM_ORIGINS: return raw_origin - return infer_issue_origin(issue.get("detector", ""), detail=_detail_dict(issue)) + if raw_origin in _LEGACY_ORIGIN_ALIASES: + return _LEGACY_ORIGIN_ALIASES[raw_origin] + return infer_work_item_origin(issue.get("detector", ""), detail=_detail_dict(issue)) + + +def normalized_issue_origin(issue: Mapping[str, Any]) -> WorkItemOrigin: + """Backward-compatible alias for canonical work-item origin normalization.""" + return normalized_work_item_origin(issue) def ensure_issue_semantics(issue: dict[str, Any]) -> None: - """Populate canonical semantic fields in-place.""" - issue["issue_kind"] = normalized_issue_kind(issue) - issue["origin"] = normalized_issue_origin(issue) + """Populate canonical semantic fields in-place. + Both ``work_item_kind`` and legacy ``issue_kind`` are written so current + in-repo callers can migrate incrementally while persisted state moves + toward the work-item terminology. + """ + kind = normalized_work_item_kind(issue) + origin = normalized_work_item_origin(issue) + issue["work_item_kind"] = kind + issue["issue_kind"] = kind + issue["origin"] = origin -def is_objective_finding(issue: Mapping[str, Any]) -> bool: - return normalized_issue_kind(issue) == MECHANICAL_FINDING +def ensure_work_item_semantics(issue: dict[str, Any]) -> None: + """Preferred name for semantic normalization.""" + ensure_issue_semantics(issue) -def is_triage_finding(issue: Mapping[str, Any]) -> bool: - return normalized_issue_kind(issue) in {REVIEW_FINDING, CONCERN_FINDING} + +def is_defect_work_item(issue: Mapping[str, Any]) -> bool: + return normalized_work_item_kind(issue) in { + MECHANICAL_DEFECT, + REVIEW_DEFECT, + REVIEW_CONCERN, + } + + +def is_objective_finding(issue: Mapping[str, Any]) -> bool: + return normalized_work_item_kind(issue) == MECHANICAL_DEFECT def is_review_finding(issue: Mapping[str, Any]) -> bool: - return normalized_issue_kind(issue) == REVIEW_FINDING + return normalized_work_item_kind(issue) == REVIEW_DEFECT def is_concern_finding(issue: Mapping[str, Any]) -> bool: - return normalized_issue_kind(issue) == CONCERN_FINDING + return normalized_work_item_kind(issue) == REVIEW_CONCERN + + +def is_review_work_item(issue: Mapping[str, Any]) -> bool: + return normalized_work_item_kind(issue) in {REVIEW_DEFECT, REVIEW_CONCERN} + + +def is_triage_finding(issue: Mapping[str, Any]) -> bool: + return is_review_work_item(issue) + + +def is_assessment_request(issue: Mapping[str, Any]) -> bool: + return normalized_work_item_kind(issue) == ASSESSMENT_REQUEST def is_review_request(issue: Mapping[str, Any]) -> bool: - return normalized_issue_kind(issue) == REVIEW_REQUEST + return is_assessment_request(issue) def is_non_objective_issue(issue: Mapping[str, Any]) -> bool: @@ -143,7 +229,7 @@ def counts_toward_objective_backlog(issue: Mapping[str, Any]) -> bool: def is_import_only_issue(issue: Mapping[str, Any]) -> bool: - return normalized_issue_origin(issue) == REVIEW_IMPORT_ORIGIN + return normalized_work_item_origin(issue) == REVIEW_IMPORT_ORIGIN def is_scoring_excluded_detector(detector: object) -> bool: @@ -157,28 +243,43 @@ def _detail_dict(issue: Mapping[str, Any]) -> Mapping[str, Any]: __all__ = [ + "ASSESSMENT_REQUEST", "CONCERN_FINDING", "ISSUE_KINDS", "ISSUE_ORIGINS", + "MECHANICAL_DEFECT", "MECHANICAL_FINDING", + "REVIEW_CONCERN", + "REVIEW_DEFECT", "REVIEW_FINDING", "REVIEW_IMPORT_ORIGIN", "REVIEW_REQUEST", "SCAN_ORIGIN", "SCORING_EXCLUDED_DETECTORS", + "SYNTHETIC_TASK_ORIGIN", "SYNTHETIC_REQUEST_ORIGIN", "counts_toward_objective_backlog", + "ensure_work_item_semantics", "ensure_issue_semantics", + "infer_work_item_kind", + "infer_work_item_origin", "infer_issue_kind", "infer_issue_origin", + "is_assessment_request", "is_concern_finding", + "is_defect_work_item", "is_import_only_issue", "is_non_objective_issue", "is_objective_finding", "is_review_finding", "is_review_request", + "is_review_work_item", "is_scoring_excluded_detector", "is_triage_finding", + "normalized_work_item_kind", + "normalized_work_item_origin", "normalized_issue_kind", "normalized_issue_origin", + "WORK_ITEM_KINDS", + "WORK_ITEM_ORIGINS", ] diff --git a/desloppify/engine/_state/merge.py b/desloppify/engine/_state/merge.py index 8cdfa4e0..fb381c67 100644 --- a/desloppify/engine/_state/merge.py +++ b/desloppify/engine/_state/merge.py @@ -11,6 +11,7 @@ ] from desloppify.base.registry import DETECTORS +from desloppify.engine._state.issue_semantics import ensure_issue_semantics from desloppify.engine._state.merge_history import ( _append_scan_history, _build_merge_diff, @@ -110,6 +111,9 @@ def merge_scan( ) -> ScanDiff: """Merge a fresh scan into existing state and return a diff summary.""" ensure_state_defaults(state) + for issue in current_issues: + if isinstance(issue, dict): + ensure_issue_semantics(issue) resolved_options = options or MergeScanOptions() now = utc_now() @@ -128,7 +132,7 @@ def merge_scan( codebase_metrics=resolved_options.codebase_metrics, ) - existing = state["issues"] + existing = state["work_items"] ignore_patterns = ( resolved_options.ignore if resolved_options.ignore is not None diff --git a/desloppify/engine/_state/persistence.py b/desloppify/engine/_state/persistence.py index 932d0c8e..91522ba4 100644 --- a/desloppify/engine/_state/persistence.py +++ b/desloppify/engine/_state/persistence.py @@ -292,7 +292,11 @@ def save_state( state_path = path or _default_state_file() state_path.parent.mkdir(parents=True, exist_ok=True) - content = json.dumps(state, indent=2, default=json_default) + "\n" + serialized_state = { + key: value for key, value in state.items() if key != "issues" + } + serialized_state["work_items"] = dict((state.get("work_items") or state.get("issues", {}))) + content = json.dumps(serialized_state, indent=2, default=json_default) + "\n" if state_path.exists(): backup = state_path.with_suffix(".json.bak") @@ -327,7 +331,7 @@ def state_lock( Usage:: with state_lock(state_file) as state: - state["issues"]["foo"] = "fixed" + state["work_items"]["foo"] = "fixed" # state is saved automatically on clean exit """ state_path = path or _default_state_file() diff --git a/desloppify/engine/_state/recovery.py b/desloppify/engine/_state/recovery.py index 64dc9f16..62871840 100644 --- a/desloppify/engine/_state/recovery.py +++ b/desloppify/engine/_state/recovery.py @@ -94,7 +94,7 @@ def _hydrate_saved_issue_ids( issue_ids: list[str], ) -> dict: recovered = dict(state) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) recovered_issues = dict(issues) if isinstance(issues, dict) else {} for issue_id in issue_ids: @@ -117,6 +117,7 @@ def _hydrate_saved_issue_ids( } ensure_issue_semantics(recovered_issues[issue_id]) + recovered["work_items"] = recovered_issues recovered["issues"] = recovered_issues recovered["scan_metadata"] = { "source": "plan_reconstruction", diff --git a/desloppify/engine/_state/resolution.py b/desloppify/engine/_state/resolution.py index bb19d54c..6a23dedf 100644 --- a/desloppify/engine/_state/resolution.py +++ b/desloppify/engine/_state/resolution.py @@ -104,7 +104,7 @@ def match_issues( ensure_state_defaults(state) return [ issue - for issue_id, issue in state["issues"].items() + for issue_id, issue in state["work_items"].items() if not issue.get("suppressed") if (status_filter == "all" or issue["status"] == status_filter) and _matches_pattern(issue_id, issue, pattern) @@ -133,7 +133,7 @@ def _refresh_original_wontfix(issue: dict) -> None: original_issue_id = detail.get("original_issue_id") if not isinstance(original_issue_id, str) or not original_issue_id: return - original = state["issues"].get(original_issue_id) + original = state["work_items"].get(original_issue_id) if not isinstance(original, dict) or original.get("status") != "wontfix": return snapshot_scan_count = int(state.get("scan_count", 0) or 0) diff --git a/desloppify/engine/_state/schema.py b/desloppify/engine/_state/schema.py index 27306811..875aea9f 100644 --- a/desloppify/engine/_state/schema.py +++ b/desloppify/engine/_state/schema.py @@ -9,9 +9,9 @@ from desloppify.base.discovery.paths import get_project_root from desloppify.base.enums import Status, canonical_issue_status, issue_status_tokens from desloppify.engine._state.issue_semantics import ( - ISSUE_KINDS, - ISSUE_ORIGINS, ensure_issue_semantics, + WORK_ITEM_KINDS, + WORK_ITEM_ORIGINS, ) from desloppify.engine._state.schema_scores import ( json_default, @@ -23,6 +23,7 @@ DimensionScore, IgnoreIntegrityModel, Issue, + WorkItem, LangCapability, ReviewCacheModel, ScanMetadataModel, @@ -43,6 +44,7 @@ "AssessmentImportAuditEntry", "AttestationLogEntry", "Issue", + "WorkItem", "TierStats", "StateStats", "DimensionScore", @@ -90,7 +92,7 @@ def get_state_file() -> Path: return get_state_dir() / "state.json" -CURRENT_VERSION = 2 +CURRENT_VERSION = 3 def utc_now() -> str: @@ -100,6 +102,7 @@ def utc_now() -> str: def empty_state() -> StateModel: """Return a new empty state payload.""" + work_items: dict[str, WorkItem] = {} return { "version": CURRENT_VERSION, "created": utc_now(), @@ -110,7 +113,8 @@ def empty_state() -> StateModel: "strict_score": 0, "verified_strict_score": 0, "stats": {}, - "issues": {}, + "work_items": work_items, + "issues": work_items, "scan_coverage": {}, "score_confidence": {}, "scan_metadata": {"source": "empty"}, @@ -137,11 +141,13 @@ def _rename_key(d: dict, old: str, new: str) -> bool: def migrate_state_keys(state: StateModel | dict[str, Any]) -> None: """Migrate legacy key names in-place. - - ``"findings"`` → ``"issues"`` + - ``"findings"`` → ``"work_items"`` + - legacy ``"issues"`` → ``"work_items"`` - ``dimension_scores[dim]["issues"]`` → ``"failing"`` """ state_dict = cast(dict[str, Any], state) - _rename_key(state_dict, "findings", "issues") + _rename_key(state_dict, "findings", "work_items") + _rename_key(state_dict, "issues", "work_items") for ds in state_dict.get("dimension_scores", {}).values(): if isinstance(ds, dict): @@ -164,9 +170,12 @@ def _normalize_scan_metadata(state: StateModel | dict[str, Any]) -> None: normalized: ScanMetadataModel = {"source": source} if source == "plan_reconstruction": normalized["plan_queue_available"] = bool(metadata.get("plan_queue_available")) - issue_count = metadata.get("reconstructed_issue_count", 0) - if isinstance(issue_count, int) and not isinstance(issue_count, bool): - normalized["reconstructed_issue_count"] = max(0, issue_count) + work_item_count = metadata.get( + "reconstructed_work_item_count", + metadata.get("reconstructed_issue_count", 0), + ) + if isinstance(work_item_count, int) and not isinstance(work_item_count, bool): + normalized["reconstructed_issue_count"] = max(0, work_item_count) else: normalized["reconstructed_issue_count"] = 0 @@ -186,8 +195,12 @@ def ensure_state_defaults(state: StateModel | dict) -> None: elif version < CURRENT_VERSION: mutable_state["version"] = CURRENT_VERSION - if not isinstance(state.get("issues"), dict): - state["issues"] = {} + if not isinstance(state.get("work_items"), dict): + legacy_items = state.get("issues") + state["work_items"] = legacy_items if isinstance(legacy_items, dict) else {} + # Keep the legacy alias available in-memory while internal call sites + # migrate, but make ``work_items`` the canonical storage. + state["issues"] = state["work_items"] if not isinstance(state.get("stats"), dict): state["stats"] = {} if not isinstance(state.get("scan_history"), list): @@ -200,7 +213,7 @@ def ensure_state_defaults(state: StateModel | dict) -> None: state["subjective_integrity"] = {} _normalize_scan_metadata(state) - all_issues = state["issues"] + all_issues = state["work_items"] to_remove: list[str] = [] for issue_id, issue in all_issues.items(): if not isinstance(issue, dict): @@ -247,8 +260,8 @@ def ensure_state_defaults(state: StateModel | dict) -> None: def validate_state_invariants(state: StateModel) -> None: """Raise ValueError when core state invariants are violated.""" - if not isinstance(state.get("issues"), dict): - raise ValueError("state.issues must be a dict") + if not isinstance(state.get("work_items"), dict): + raise ValueError("state.work_items must be a dict") if not isinstance(state.get("stats"), dict): raise ValueError("state.stats must be a dict") metadata = state.get("scan_metadata") @@ -264,19 +277,19 @@ def validate_state_invariants(state: StateModel) -> None: "state.scan_metadata.reconstructed_issue_count must be a non-negative int" ) - all_issues = state["issues"] + all_issues = state["work_items"] for issue_id, issue in all_issues.items(): if not isinstance(issue, dict): raise ValueError(f"issue {issue_id!r} must be a dict") if issue.get("id") != issue_id: raise ValueError(f"issue id mismatch for {issue_id!r}") - issue_kind = issue.get("issue_kind") - if issue_kind not in ISSUE_KINDS: + issue_kind = issue.get("work_item_kind", issue.get("issue_kind")) + if issue_kind not in WORK_ITEM_KINDS: raise ValueError( - f"issue {issue_id!r} has invalid issue_kind {issue_kind!r}" + f"issue {issue_id!r} has invalid work_item_kind {issue_kind!r}" ) origin = issue.get("origin") - if origin not in ISSUE_ORIGINS: + if origin not in WORK_ITEM_ORIGINS: raise ValueError( f"issue {issue_id!r} has invalid origin {origin!r}" ) diff --git a/desloppify/engine/_state/schema_types.py b/desloppify/engine/_state/schema_types.py index 79fc9b4c..e095c57d 100644 --- a/desloppify/engine/_state/schema_types.py +++ b/desloppify/engine/_state/schema_types.py @@ -7,6 +7,7 @@ from desloppify.engine._state.schema_types_issues import ( DimensionScore, Issue, + WorkItem, ScanHistoryEntry, ScoreConfidenceDetector, ScoreConfidenceModel, @@ -49,7 +50,8 @@ class StateModel(TypedDict, total=False): strict_score: Required[float] verified_strict_score: Required[float] stats: Required[StateStats] - issues: Required[dict[str, Issue]] + work_items: Required[dict[str, WorkItem]] + issues: NotRequired[dict[str, WorkItem]] dimension_scores: dict[str, DimensionScore] scan_path: str | None tool_hash: str @@ -101,6 +103,7 @@ class ScanDiff(TypedDict): "AssessmentImportAuditEntry", "AttestationLogEntry", "Issue", + "WorkItem", "TierStats", "StateStats", "DimensionScore", diff --git a/desloppify/engine/_state/schema_types_issues.py b/desloppify/engine/_state/schema_types_issues.py index 5d03d2bb..7cbdc381 100644 --- a/desloppify/engine/_state/schema_types_issues.py +++ b/desloppify/engine/_state/schema_types_issues.py @@ -1,4 +1,4 @@ -"""Issue and score-related TypedDict models for persisted state payloads.""" +"""Work-item and score-related TypedDict models for persisted state payloads.""" from __future__ import annotations @@ -7,18 +7,19 @@ from desloppify.base.enums import Status -class Issue(TypedDict): - """The central data structure: a normalized issue from any detector.""" +class WorkItem(TypedDict): + """The central data structure: a normalized tracked work item.""" id: str detector: str + work_item_kind: str issue_kind: str origin: str file: str tier: int confidence: str summary: str - # Known detail shapes per detector (non-exhaustive, for reference): + # Known detail shapes per detector/work item (non-exhaustive, for reference): # # structural: {loc, complexity_score?, complexity_signals?: list[str], # name? (god class), ...god_class_metrics} @@ -58,6 +59,11 @@ class Issue(TypedDict): zone: NotRequired[str] +# Legacy type alias retained while the codebase finishes moving to +# work-item-first naming. +Issue = WorkItem + + class TierStats(TypedDict, total=False): open: int fixed: int @@ -136,6 +142,7 @@ class ScanHistoryEntry(TypedDict, total=False): __all__ = [ + "WorkItem", "Issue", "TierStats", "StateStats", diff --git a/desloppify/engine/_state/schema_types_review.py b/desloppify/engine/_state/schema_types_review.py index 32693797..406b1578 100644 --- a/desloppify/engine/_state/schema_types_review.py +++ b/desloppify/engine/_state/schema_types_review.py @@ -19,7 +19,6 @@ class SubjectiveAssessmentJudgment(TypedDict, total=False): """Reviewer's holistic judgment narrative for a subjective dimension.""" strengths: list[str] - issue_character: str dimension_character: str score_rationale: str @@ -68,6 +67,7 @@ class AssessmentImportAuditEntry(TypedDict, total=False): provisional_count: int attest: str import_file: str + packet_sha256: str class AttestationLogEntry(TypedDict, total=False): diff --git a/desloppify/engine/_work_queue/inputs.py b/desloppify/engine/_work_queue/inputs.py index c5e860ed..e5076c74 100644 --- a/desloppify/engine/_work_queue/inputs.py +++ b/desloppify/engine/_work_queue/inputs.py @@ -50,7 +50,7 @@ def gather_subjective_items( candidates = build_subjective_items( state, - state.get("issues", {}), + (state.get("work_items") or state.get("issues", {})), threshold=threshold, ) return [item for item in candidates if scope_matches(item, opts.scope)] diff --git a/desloppify/engine/_work_queue/issues.py b/desloppify/engine/_work_queue/issues.py index 648296a3..0d15c366 100644 --- a/desloppify/engine/_work_queue/issues.py +++ b/desloppify/engine/_work_queue/issues.py @@ -1,9 +1,10 @@ -"""State-backed work queue for review issues. +"""State-backed work queue for review work items. -Review issues live in state["issues"]. This module provides: -- Listing/sorting open review issues by impact -- Storing investigation notes on issues -- Expiring stale holistic issues during scan +Review work items live in the in-memory ``state["work_items"]`` map and serialize +as ``work_items`` on disk. This module provides: +- Listing/sorting open review work items by impact +- Storing investigation notes on review work items +- Expiring stale holistic review work items during scan """ from __future__ import annotations @@ -25,6 +26,21 @@ ] +def _state_work_items(state: dict) -> dict: + work_items = state.get("work_items") + if isinstance(work_items, dict): + state["issues"] = work_items + return work_items + legacy_items = state.get("issues") + if isinstance(legacy_items, dict): + state["work_items"] = legacy_items + return legacy_items + empty: dict = {} + state["work_items"] = empty + state["issues"] = empty + return empty + + def impact_label(weight: float) -> str: """Convert weight to a human-readable impact label.""" try: @@ -39,8 +55,8 @@ def impact_label(weight: float) -> str: def list_open_review_issues(state: dict) -> list[dict]: - """Return open review issues sorted by impact (highest first).""" - issues = state.get("issues", {}) + """Return open review work items sorted by impact (highest first).""" + issues = _state_work_items(state) review = [ issue for issue in issues.values() @@ -56,8 +72,8 @@ def _sort_key(issue: dict) -> tuple[float, str]: def update_investigation(state: dict, issue_id: str, text: str) -> bool: - """Store investigation text on a issue. Returns False if not found/not open.""" - issue = state.get("issues", {}).get(issue_id) + """Store investigation text on a work item. Returns False if not found/not open.""" + issue = _state_work_items(state).get(issue_id) if not issue or issue.get("status") != "open": return False detail = detail_dict(issue) @@ -74,7 +90,7 @@ def mark_stale_holistic(state: dict, max_age_days: int = 30) -> list[str]: now = datetime.now(UTC) expired: list[str] = [] - for issue_id, issue in state.get("issues", {}).items(): + for issue_id, issue in _state_work_items(state).items(): if not is_review_finding(issue): continue if issue.get("status") != "open": diff --git a/desloppify/engine/_work_queue/plan_order.py b/desloppify/engine/_work_queue/plan_order.py index cbd2da79..45505674 100644 --- a/desloppify/engine/_work_queue/plan_order.py +++ b/desloppify/engine/_work_queue/plan_order.py @@ -32,7 +32,7 @@ def new_item_ids(state: StateModel) -> set[str]: return set() return { issue_id - for issue_id, issue in state.get("issues", {}).items() + for issue_id, issue in (state.get("work_items") or state.get("issues", {})).items() if issue.get("first_seen", "") >= threshold } diff --git a/desloppify/engine/_work_queue/ranking.py b/desloppify/engine/_work_queue/ranking.py index 8114f37a..971c71f6 100644 --- a/desloppify/engine/_work_queue/ranking.py +++ b/desloppify/engine/_work_queue/ranking.py @@ -129,7 +129,7 @@ def build_issue_items( scope: str | None, chronic: bool, ) -> list[WorkQueueItem]: - scoped = path_scoped_issues(state.get("issues", {}), scan_path) + scoped = path_scoped_issues((state.get("work_items") or state.get("issues", {})), scan_path) subjective_scores = subjective_strict_scores(state) out: list[WorkQueueItem] = [] diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index a1db8d94..0024480b 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -12,6 +12,7 @@ WORKFLOW_RUN_SCAN_ID, ) from desloppify.engine._plan.schema import ( + _tracked_plan_ids as _tracked_plan_ids, executable_objective_ids as _executable_objective_ids, ) from desloppify.engine._plan.triage.snapshot import build_triage_snapshot @@ -194,6 +195,7 @@ def _phase_for_snapshot( *, fresh_boundary: bool, initial_review_items: list[WorkQueueItem], + anchored_execution_items: list[WorkQueueItem], explicit_queue_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], @@ -202,10 +204,12 @@ def _phase_for_snapshot( ) -> str: if fresh_boundary and initial_review_items: return PHASE_REVIEW_INITIAL - if explicit_queue_items: + if anchored_execution_items: return PHASE_EXECUTE if scan_items: return PHASE_SCAN + if explicit_queue_items: + return PHASE_EXECUTE if postflight_review_items: return PHASE_REVIEW_POSTFLIGHT if postflight_workflow_items: @@ -263,7 +267,7 @@ def build_queue_snapshot( ) scan_path = _resolved_scan_path(options, state) skipped_ids = set((effective_plan or {}).get("skipped", {}).keys()) - scoped_issues = path_scoped_issues(state.get("issues", {}), scan_path) + scoped_issues = path_scoped_issues((state.get("work_items") or state.get("issues", {})), scan_path) scope = _option_value(options, "scope", None) chronic = bool(_option_value(options, "chronic", False)) @@ -295,12 +299,14 @@ def build_queue_snapshot( ) review_issue_ids = {item.get("id", "") for item in review_issue_items} executable_review_ids = {item.get("id", "") for item in executable_review_items} + review_request_ids = {item.get("id", "") for item in review_request_items} explicit_queue_ids = { str(issue_id) for issue_id in (effective_plan or {}).get("queue_order", []) if isinstance(issue_id, str) and issue_id } - skipped_ids - explicit_queue_ids |= _auto_promoted_autofix_ids(effective_plan) + auto_promoted_ids = _auto_promoted_autofix_ids(effective_plan) + explicit_queue_ids |= auto_promoted_ids queued_extra_items = [ item for item in all_issue_items if item.get("id", "") in explicit_queue_ids @@ -308,6 +314,8 @@ def build_queue_snapshot( item.get("id", "") not in review_issue_ids or item.get("id", "") in executable_review_ids ) + and item.get("id", "") not in review_issue_ids + and item.get("id", "") not in review_request_ids ] explicit_queue_items: list[WorkQueueItem] = [] seen_execution_ids: set[str] = set() @@ -317,6 +325,11 @@ def build_queue_snapshot( continue seen_execution_ids.add(item_id) explicit_queue_items.append(item) + anchored_execution_ids = (_tracked_plan_ids(effective_plan) | auto_promoted_ids) - skipped_ids + anchored_execution_items = [ + item for item in explicit_queue_items + if item.get("id", "") in anchored_execution_ids + ] initial_review_items, subjective_postflight_items = _subjective_partitions( state, scoped_issues=scoped_issues, @@ -336,6 +349,7 @@ def build_queue_snapshot( phase = _phase_for_snapshot( fresh_boundary=fresh_boundary, initial_review_items=initial_review_items, + anchored_execution_items=anchored_execution_items, explicit_queue_items=explicit_queue_items, scan_items=scan_items, postflight_review_items=postflight_review_items, diff --git a/desloppify/engine/_work_queue/synthetic.py b/desloppify/engine/_work_queue/synthetic.py index d426ac3f..e4e6368a 100644 --- a/desloppify/engine/_work_queue/synthetic.py +++ b/desloppify/engine/_work_queue/synthetic.py @@ -127,7 +127,7 @@ def build_triage_stage_items(plan: dict, state: dict) -> list[WorkQueueItem]: if not present_names: return [] - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) open_review_count = sum( 1 for f in issues.values() if f.get("status") == "open" diff --git a/desloppify/engine/_work_queue/types.py b/desloppify/engine/_work_queue/types.py index 88070f2d..19532600 100644 --- a/desloppify/engine/_work_queue/types.py +++ b/desloppify/engine/_work_queue/types.py @@ -34,6 +34,7 @@ class QueueItemCommon(QueueItemBase, total=False): """Optional fields shared across multiple queue item variants.""" detector: str + work_item_kind: str issue_kind: str origin: str file: str @@ -81,6 +82,7 @@ class QueueItemCommon(QueueItemBase, total=False): epic_triage_meta: dict[str, Any] fixers: list[str] issue_ids: list[str] + work_items: dict[str, Any] issues: dict[str, Any] lang_capabilities: dict[str, Any] name: str @@ -95,12 +97,16 @@ class QueueItemCommon(QueueItemBase, total=False): triage_stages: dict[str, Any] -class IssueQueueItem(QueueItemCommon, total=False): - """Concrete queue item for a detector finding.""" +class WorkItemQueueItem(QueueItemCommon, total=False): + """Concrete queue item for one tracked work item.""" tier: int +# Legacy alias retained while imports move to the new name. +IssueQueueItem = WorkItemQueueItem + + class ClusterQueueItem(QueueItemCommon, total=False): """Collapsed plan/work queue cluster item.""" @@ -188,7 +194,7 @@ class SerializedQueueItem(TypedDict, total=False): WorkQueueItem: TypeAlias = ( - IssueQueueItem + WorkItemQueueItem | ClusterQueueItem | WorkflowStageItem | WorkflowActionItem @@ -211,4 +217,5 @@ class SerializedQueueItem(TypedDict, total=False): "WorkflowStageItem", "WorkQueueGroups", "WorkQueueItem", + "WorkItemQueueItem", ] diff --git a/desloppify/engine/planning/render.py b/desloppify/engine/planning/render.py index 05f9f067..d76795fc 100644 --- a/desloppify/engine/planning/render.py +++ b/desloppify/engine/planning/render.py @@ -224,7 +224,7 @@ def generate_plan_md(state: PlanState, plan: dict | None = None) -> str: items, clusters, skipped, and superseded sections are rendered. When no plan exists, output is identical to the previous behavior. """ - issues = state["issues"] + issues = state.get("work_items") or state.get("issues", {}) stats = state.get("stats", {}) # Auto-load plan if not provided diff --git a/desloppify/engine/planning/scorecard_dimensions.py b/desloppify/engine/planning/scorecard_dimensions.py index 822cee70..38d2aee9 100644 --- a/desloppify/engine/planning/scorecard_dimensions.py +++ b/desloppify/engine/planning/scorecard_dimensions.py @@ -35,7 +35,7 @@ def _lang_from_capabilities(state: dict) -> str | None: def _lang_from_issues(state: dict) -> str | None: - issues = state.get("issues") + issues = state.get("work_items") if not isinstance(issues, dict): return None counts: dict[str, int] = {} diff --git a/desloppify/intelligence/narrative/action_engine.py b/desloppify/intelligence/narrative/action_engine.py index 005a5bd0..2396fc4f 100644 --- a/desloppify/intelligence/narrative/action_engine.py +++ b/desloppify/intelligence/narrative/action_engine.py @@ -75,7 +75,7 @@ def _fixer_has_applicable_issues( and not issue.get("suppressed") and issue.get("detector") == "smells" and issue.get("detail", {}).get("smell_id") == smell_id - for issue in state.get("issues", {}).values() + for issue in (state.get("work_items") or state.get("issues", {})).values() ) diff --git a/desloppify/intelligence/narrative/action_engine_routing.py b/desloppify/intelligence/narrative/action_engine_routing.py index 44380dbd..396225b8 100644 --- a/desloppify/intelligence/narrative/action_engine_routing.py +++ b/desloppify/intelligence/narrative/action_engine_routing.py @@ -7,9 +7,10 @@ from desloppify.engine._scoring.results.core import get_dimension_for_detector from desloppify.engine._state.issue_semantics import ( - REVIEW_FINDING, - REVIEW_REQUEST, - infer_issue_kind, + ASSESSMENT_REQUEST, + REVIEW_DEFECT, + REVIEW_CONCERN, + infer_work_item_kind, ) from desloppify.intelligence.narrative._constants import DETECTOR_TOOLS from desloppify.intelligence.narrative.action_models import ActionItem @@ -58,25 +59,25 @@ def _build_refactor_entry( guidance = tool_info.get("guidance", "manual fix") adjusted_info = {**tool_info, "guidance": guidance} - issue_kind = infer_issue_kind(detector) - if issue_kind == REVIEW_REQUEST: + work_item_kind = infer_work_item_kind(detector) + if work_item_kind == ASSESSMENT_REQUEST: command = "desloppify review --prepare" suffix = "s" if count != 1 else "" description = ( - f"{count} subjective dimension{suffix} need review — run holistic " + f"{count} assessment request{suffix} need review — run holistic " "review to refresh subjective scores" ) - elif issue_kind == REVIEW_FINDING: + elif work_item_kind in {REVIEW_DEFECT, REVIEW_CONCERN}: command = "desloppify show review --status open" suffix = "s" if count != 1 else "" description = ( - f"{count} review issue{suffix} need investigation — " + f"{count} review work item{suffix} need investigation — " "run `desloppify show review --status open` to see them" ) adjusted_info = {**adjusted_info, "action_type": "refactor"} else: command = f"desloppify show {detector} --status open" - description = f"{count} {detector} issues — {guidance}" + description = f"{count} {detector} work items — {guidance}" return { "type": adjusted_info["action_type"], diff --git a/desloppify/intelligence/narrative/dimensions.py b/desloppify/intelligence/narrative/dimensions.py index 318eaff7..a77fc9a9 100644 --- a/desloppify/intelligence/narrative/dimensions.py +++ b/desloppify/intelligence/narrative/dimensions.py @@ -64,7 +64,7 @@ def _biggest_gap_dimensions(dim_scores: dict, state: StateModel) -> list[dict]: """Build summary entries for dimensions with the biggest strict gap.""" biggest_gap = [] scoped = path_scoped_issues( - state.get("issues", {}), state.get("scan_path") + (state.get("work_items") or state.get("issues", {})), state.get("scan_path") ) for name, ds in dim_scores.items(): lenient = ds["score"] diff --git a/desloppify/intelligence/narrative/reminders.py b/desloppify/intelligence/narrative/reminders.py index 31fdf4df..c0f69211 100644 --- a/desloppify/intelligence/narrative/reminders.py +++ b/desloppify/intelligence/narrative/reminders.py @@ -45,7 +45,7 @@ def compute_reminders( strict_score = score_snapshot(state).strict reminder_history = state.get("reminder_history", {}) scoped_issues = path_scoped_issues( - state.get("issues", {}), state.get("scan_path") + (state.get("work_items") or state.get("issues", {})), state.get("scan_path") ) fp_rates = _compute_fp_rates(scoped_issues) diff --git a/desloppify/intelligence/narrative/reminders_rules_followup.py b/desloppify/intelligence/narrative/reminders_rules_followup.py index 307ebf11..a310b55c 100644 --- a/desloppify/intelligence/narrative/reminders_rules_followup.py +++ b/desloppify/intelligence/narrative/reminders_rules_followup.py @@ -77,9 +77,10 @@ def _review_queue_reminders( def _has_open_issues(state: StateModel) -> bool: """True when any non-suppressed open issues remain in the queue.""" + issues = state.get("work_items") or state.get("issues", {}) return any( issue.get("status") == "open" and not issue.get("suppressed") - for issue in (state.get("issues") or {}).values() + for issue in issues.values() ) diff --git a/desloppify/intelligence/narrative/reminders_rules_primary.py b/desloppify/intelligence/narrative/reminders_rules_primary.py index a70de68a..74e83d93 100644 --- a/desloppify/intelligence/narrative/reminders_rules_primary.py +++ b/desloppify/intelligence/narrative/reminders_rules_primary.py @@ -109,7 +109,7 @@ def _wontfix_debt_reminders( return reminders stale_wontfix = [] - for issue in state.get("issues", {}).values(): + for issue in (state.get("work_items") or state.get("issues", {})).values(): if issue.get("status") != "wontfix": continue resolved_at = issue.get("resolved_at") diff --git a/desloppify/intelligence/narrative/signals.py b/desloppify/intelligence/narrative/signals.py index 67488e48..16d503e4 100644 --- a/desloppify/intelligence/narrative/signals.py +++ b/desloppify/intelligence/narrative/signals.py @@ -273,7 +273,7 @@ def history_for_lang(raw_history: list[dict], lang: str | None) -> list[dict]: def scoped_issues(state: StateModel) -> dict[str, Issue]: return path_scoped_issues( - state.get("issues", {}), state.get("scan_path") + (state.get("work_items") or state.get("issues", {})), state.get("scan_path") ) diff --git a/desloppify/intelligence/review/_prepare/issue_history.py b/desloppify/intelligence/review/_prepare/issue_history.py index 36c0a5c5..744d1f34 100644 --- a/desloppify/intelligence/review/_prepare/issue_history.py +++ b/desloppify/intelligence/review/_prepare/issue_history.py @@ -76,7 +76,7 @@ def _related_files(issue: dict[str, Any], *, limit: int = 6) -> list[str]: def _iter_review_issues(state: StateModel) -> list[dict[str, Any]]: - issues = state.get("issues") + issues = state.get("work_items") if not isinstance(issues, dict): return [] out: list[dict[str, Any]] = [] diff --git a/desloppify/intelligence/review/_prepare/remediation_engine.py b/desloppify/intelligence/review/_prepare/remediation_engine.py index 1a878b88..27113204 100644 --- a/desloppify/intelligence/review/_prepare/remediation_engine.py +++ b/desloppify/intelligence/review/_prepare/remediation_engine.py @@ -44,7 +44,7 @@ def render_empty_remediation_plan(state: StateModel, lang_name: str) -> str: def _collect_holistic_issues( state: StateModel, ) -> list[tuple[str, Issue]]: - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) return [ (issue_id, issue) for issue_id, issue in issues.items() diff --git a/desloppify/intelligence/review/context_builder.py b/desloppify/intelligence/review/context_builder.py index 2db017f5..637740c6 100644 --- a/desloppify/intelligence/review/context_builder.py +++ b/desloppify/intelligence/review/context_builder.py @@ -97,7 +97,7 @@ def build_review_context_inner( for filepath in file_contents if isinstance(filepath, str) and filepath } - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) by_file: dict[str, list[str]] = {} for issue in issues.values(): if issue.get("status") != "open": diff --git a/desloppify/intelligence/review/context_holistic/mechanical.py b/desloppify/intelligence/review/context_holistic/mechanical.py index e38d27d6..ad72c657 100644 --- a/desloppify/intelligence/review/context_holistic/mechanical.py +++ b/desloppify/intelligence/review/context_holistic/mechanical.py @@ -53,7 +53,7 @@ def gather_mechanical_evidence( allowed_files: set[str] | list[str] | tuple[str, ...] | None = None, ) -> dict[str, Any]: """Aggregate open issues into evidence clusters for holistic review.""" - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if not issues: return {} allowed_scope = _normalize_allowed_files(allowed_files) diff --git a/desloppify/intelligence/review/context_holistic/selection/contexts.py b/desloppify/intelligence/review/context_holistic/selection/contexts.py index a1194962..1b34c4b3 100644 --- a/desloppify/intelligence/review/context_holistic/selection/contexts.py +++ b/desloppify/intelligence/review/context_holistic/selection/contexts.py @@ -210,7 +210,7 @@ def dependencies_context( allowed_files: set[str] | None = None, ) -> dict[str, Any]: cycle_issues = [] - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) if not isinstance(issues, dict): issues = {} for issue in issues.values(): @@ -242,7 +242,7 @@ def testing_context( tc_issues = { issue["file"] - for issue in state.get("issues", {}).values() + for issue in (state.get("work_items") or state.get("issues", {})).values() if issue.get("detector") == "test_coverage" and issue.get("status") == "open" and in_allowed_files(issue.get("file", ""), allowed_files) diff --git a/desloppify/intelligence/review/importing/assessments.py b/desloppify/intelligence/review/importing/assessments.py index 34f6d55e..5d5c983d 100644 --- a/desloppify/intelligence/review/importing/assessments.py +++ b/desloppify/intelligence/review/importing/assessments.py @@ -24,7 +24,6 @@ def _clean_judgment(raw: dict[str, Any]) -> dict[str, Any] | None: if isinstance(s, str) and str(s).strip() ] - # Accept dimension_character (new) or issue_character (legacy) dimension_character = "" dc = raw.get("dimension_character") if isinstance(dc, str) and dc.strip(): @@ -40,18 +39,15 @@ def _clean_judgment(raw: dict[str, Any]) -> dict[str, Any] | None: if isinstance(sr, str) and sr.strip(): score_rationale = sr.strip() - if not strengths and not dimension_character and not issue_character and not score_rationale: + effective_dimension_character = dimension_character or issue_character + if not strengths and not effective_dimension_character and not score_rationale: return None result: dict[str, Any] = {} if strengths: result["strengths"] = strengths - # Store dimension_character, falling back to issue_character - effective_dim_char = dimension_character or issue_character - if effective_dim_char: - result["dimension_character"] = effective_dim_char - if issue_character and not dimension_character: - result["issue_character"] = issue_character + if effective_dimension_character: + result["dimension_character"] = effective_dimension_character if score_rationale: result["score_rationale"] = score_rationale return result @@ -69,7 +65,7 @@ def store_assessments( *assessments*: ``{dim_name: score}`` or ``{dim_name: {score, ...}}``. *source*: ``"per_file"`` or ``"holistic"``. - *dimension_judgment*: optional ``{dim_name: {strengths, issue_character, score_rationale}}``. + *dimension_judgment*: optional ``{dim_name: {strengths, dimension_character, score_rationale}}``. Holistic assessments overwrite per-file for the same dimension. Per-file assessments don't overwrite holistic. diff --git a/desloppify/intelligence/review/importing/holistic_cache.py b/desloppify/intelligence/review/importing/holistic_cache.py index c0667051..597508d9 100644 --- a/desloppify/intelligence/review/importing/holistic_cache.py +++ b/desloppify/intelligence/review/importing/holistic_cache.py @@ -132,8 +132,11 @@ def resolve_holistic_coverage_issues( assessed = _assessed_dimension_keys(state) if not assessed: return + work_items = state.get("work_items") or state.get("issues", {}) + state["work_items"] = work_items + state["issues"] = work_items now = utc_now_fn() - for issue in state.get("issues", {}).values(): + for issue in work_items.values(): if issue.get("status") != "open": continue if issue.get("detector") != "subjective_review": diff --git a/desloppify/intelligence/review/importing/resolution.py b/desloppify/intelligence/review/importing/resolution.py index f479d5ac..a1404ff7 100644 --- a/desloppify/intelligence/review/importing/resolution.py +++ b/desloppify/intelligence/review/importing/resolution.py @@ -18,8 +18,11 @@ def auto_resolve_review_issues( utc_now_fn=utc_now, ) -> None: """Mark stale open review issues fixed when an explicit import supersedes them.""" + work_items = state.get("work_items") or state.get("issues", {}) + state["work_items"] = work_items + state["issues"] = work_items diff.setdefault("auto_resolved", 0) - for issue_id, issue in state.get("issues", {}).items(): + for issue_id, issue in work_items.items(): if issue_id in new_ids or issue.get("status") != "open": continue if not should_resolve(issue): diff --git a/desloppify/intelligence/review/prepare_batches_builders.py b/desloppify/intelligence/review/prepare_batches_builders.py index 7059b233..f21f7928 100644 --- a/desloppify/intelligence/review/prepare_batches_builders.py +++ b/desloppify/intelligence/review/prepare_batches_builders.py @@ -28,7 +28,7 @@ def _count_findings_for_dimensions( if not relevant: return {}, {} - issues = state.get("issues") + issues = state.get("work_items") if not isinstance(issues, dict): return {}, {} diff --git a/desloppify/intelligence/review/prepare_holistic_scope.py b/desloppify/intelligence/review/prepare_holistic_scope.py index 3c07b294..b9714f2f 100644 --- a/desloppify/intelligence/review/prepare_holistic_scope.py +++ b/desloppify/intelligence/review/prepare_holistic_scope.py @@ -124,8 +124,9 @@ def filter_batches_to_file_scope( if issue_focus is not None: batch["historical_issue_focus"] = issue_focus - # Keep any batch that has dimensions to review - if batch.get("dimensions"): + # Dimensions come from the original batch payload; this scope filter only trims + # file-linked fields such as concern signals and historical issue focus. + if raw_batch.get("dimensions"): scoped_batches.append(batch) return scoped_batches diff --git a/desloppify/intelligence/review/selection.py b/desloppify/intelligence/review/selection.py index 24e146b5..22f65c76 100644 --- a/desloppify/intelligence/review/selection.py +++ b/desloppify/intelligence/review/selection.py @@ -149,7 +149,7 @@ def _compute_review_priority(filepath: str, lang, state: dict) -> int: score += ic * 10 # Already has programmatic issues (compound value — review will be richer) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) n_issues = sum( 1 for f in issues.values() if f.get("file") == rpath and f["status"] == "open" ) diff --git a/desloppify/intelligence/review/selection_cache.py b/desloppify/intelligence/review/selection_cache.py index 42a2eeaa..ca29b005 100644 --- a/desloppify/intelligence/review/selection_cache.py +++ b/desloppify/intelligence/review/selection_cache.py @@ -13,7 +13,7 @@ def get_file_issues(state: dict, filepath: str) -> list[dict]: """Get existing open issues for a file (summaries for context).""" rpath = rel(filepath) - issues = state.get("issues", {}) + issues = (state.get("work_items") or state.get("issues", {})) return [ {"detector": issue["detector"], "summary": issue["summary"], "id": issue["id"]} for issue in issues.values() diff --git a/desloppify/languages/python/detectors/unused.py b/desloppify/languages/python/detectors/unused.py index 8d58ad7e..e1306882 100644 --- a/desloppify/languages/python/detectors/unused.py +++ b/desloppify/languages/python/detectors/unused.py @@ -4,6 +4,7 @@ import json import re +import shutil import subprocess # nosec B404 import sys from pathlib import Path @@ -151,17 +152,29 @@ def _try_ruff(path: Path, category: str) -> list[dict] | None: return [] exclude_dirs = _collect_exclude_dirs(path) - cmd = [ - sys.executable, - "-m", - "ruff", - "check", - "--select", - ",".join(select), - "--output-format", - "json", - "--no-fix", - ] + ruff_executable = shutil.which("ruff") + if ruff_executable: + cmd = [ + ruff_executable, + "check", + "--select", + ",".join(select), + "--output-format", + "json", + "--no-fix", + ] + else: + cmd = [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + ",".join(select), + "--output-format", + "json", + "--no-fix", + ] if exclude_dirs: cmd.extend(["--exclude", ",".join(exclude_dirs)]) cmd.append(str(path)) @@ -177,6 +190,8 @@ def _try_ruff(path: Path, category: str) -> list[dict] | None: except (FileNotFoundError, subprocess.TimeoutExpired): return None + if result.returncode not in (0, 1): + return None if not result.stdout.strip(): return [] diff --git a/desloppify/tests/commands/autofix/test_apply_retro_direct.py b/desloppify/tests/commands/autofix/test_apply_retro_direct.py index 71043abf..0a7756c0 100644 --- a/desloppify/tests/commands/autofix/test_apply_retro_direct.py +++ b/desloppify/tests/commands/autofix/test_apply_retro_direct.py @@ -111,7 +111,7 @@ def test_cascade_unused_import_cleanup_resolves_cascade_issues(monkeypatch, caps lang=lang, ) - issue = state["issues"]["unused::src/a.ts::Foo"] + issue = state["work_items"]["unused::src/a.ts::Foo"] assert issue["status"] == "fixed" assert "cascade-unused-imports" in str(issue["note"]) diff --git a/desloppify/tests/commands/plan/test_plan_override_transactions.py b/desloppify/tests/commands/plan/test_plan_override_transactions.py index 5ebd9278..aa7058bf 100644 --- a/desloppify/tests/commands/plan/test_plan_override_transactions.py +++ b/desloppify/tests/commands/plan/test_plan_override_transactions.py @@ -31,7 +31,7 @@ def _seed_state() -> tuple[dict, str]: summary="sample", ) issue_id = issue["id"] - state["issues"][issue_id] = issue + state["work_items"][issue_id] = issue return state, issue_id diff --git a/desloppify/tests/commands/plan/test_saved_plan_recovery.py b/desloppify/tests/commands/plan/test_saved_plan_recovery.py index e455f6fd..e6835020 100644 --- a/desloppify/tests/commands/plan/test_saved_plan_recovery.py +++ b/desloppify/tests/commands/plan/test_saved_plan_recovery.py @@ -35,7 +35,7 @@ def test_load_state_recovers_runtime_state_from_saved_plan(tmp_path: Path) -> No state = load_state(tmp_path / "state-typescript.json") - assert "review::src/foo.ts::abcd1234" in state["issues"] + assert "review::src/foo.ts::abcd1234" in state["work_items"] assert state["scan_metadata"] == { "source": "plan_reconstruction", "plan_queue_available": True, @@ -46,7 +46,7 @@ def test_load_state_recovers_runtime_state_from_saved_plan(tmp_path: Path) -> No def test_load_state_drops_stale_reconstructed_state_without_live_plan(tmp_path: Path) -> None: """Persisted plan-derived state should clear when the live plan disappears.""" state = empty_state() - state["issues"] = { + state["work_items"] = { "review::src/foo.ts::abcd1234": { "id": "review::src/foo.ts::abcd1234", "status": "open", @@ -72,7 +72,7 @@ def test_load_state_keeps_existing_state_when_saved_plan_load_is_degraded( ) -> None: """State recovery should treat saved-plan load failures as degraded, not silently rebuild.""" state = empty_state() - state["issues"] = { + state["work_items"] = { "review::src/foo.ts::abcd1234": { "id": "review::src/foo.ts::abcd1234", "status": "open", @@ -238,5 +238,5 @@ def test_cmd_plan_repair_state_rebuilds_persisted_state( "plan_queue_available": True, "reconstructed_issue_count": 1, } - assert "review::src/foo.ts::abcd1234" in repaired["issues"] + assert "review::src/foo.ts::abcd1234" in repaired["work_items"] assert "Rebuilt state-typescript.json from plan.json" in capsys.readouterr().out diff --git a/desloppify/tests/commands/review/test_review_batch_core_direct.py b/desloppify/tests/commands/review/test_review_batch_core_direct.py index cdfef37b..d4aaaa94 100644 --- a/desloppify/tests/commands/review/test_review_batch_core_direct.py +++ b/desloppify/tests/commands/review/test_review_batch_core_direct.py @@ -256,7 +256,7 @@ def test_normalize_batch_result_rejects_low_score_without_same_dimension_issue() "dimension_judgment": { "logic_clarity": { "strengths": ["handlers keep domain names consistent"], - "issue_character": "Predicate logic drifts between equivalent paths.", + "dimension_character": "Predicate logic drifts between equivalent paths.", "score_rationale": ( "The core decision paths are understandable, but equivalent handlers " "encode different branching logic and create behavioral drift. " @@ -289,7 +289,7 @@ def test_normalize_batch_result_accepts_low_score_with_same_dimension_issue(): "dimension_judgment": { "logic_clarity": { "strengths": ["predicate naming is mostly descriptive"], - "issue_character": "Control-flow choices are easy to follow but inconsistent.", + "dimension_character": "Control-flow choices are easy to follow but inconsistent.", "score_rationale": ( "Branch structure is readable in isolation, yet equivalent handlers " "use incompatible predicate logic that undermines coherence. " @@ -335,7 +335,7 @@ def test_normalize_batch_result_accepts_dismissed_concern_entries() -> None: "dimension_judgment": { "logic_clarity": { "strengths": ["the reviewer checked the signal and explained the outcome"], - "issue_character": "Most concerns are real, but some detector signals are intentionally acceptable seams.", + "dimension_character": "Most concerns are real, but some detector signals are intentionally acceptable seams.", "score_rationale": ( "The code remains understandable, and the review includes explicit adjudication " "of detector concerns instead of silently dropping them. That keeps the score " @@ -389,7 +389,7 @@ def test_normalize_batch_result_accepts_legacy_findings_alias(): "dimension_judgment": { "logic_clarity": { "strengths": ["legacy payload shape is still parseable"], - "issue_character": "The contract is clear but legacy paths increase ambiguity.", + "dimension_character": "The contract is clear but legacy paths increase ambiguity.", "score_rationale": ( "The importer retains strong structural expectations, but alias handling " "adds historical complexity that can obscure canonical usage. " @@ -472,7 +472,7 @@ def test_normalize_batch_result_rejects_incomplete_dimension_judgment_entry(): "dimension_judgment": { "logic_clarity": { "strengths": ["handler structure is predictable"], - "issue_character": "some divergence exists", + "dimension_character": "some divergence exists", } }, "issues": [ @@ -512,7 +512,7 @@ def test_normalize_batch_result_accepts_legacy_unreported_risk_key(): "dimension_judgment": { "logic_clarity": { "strengths": ["legacy and canonical fields are reconciled"], - "issue_character": "Compatibility handling is explicit but adds branching cost.", + "dimension_character": "Compatibility handling is explicit but adds branching cost.", "score_rationale": ( "Normalization logic remains understandable because compatibility keys are " "handled in one place, but each legacy path increases cognitive load. " @@ -558,7 +558,7 @@ def test_normalize_batch_result_normalizes_context_updates() -> None: "dimension_judgment": { "logic_clarity": { "strengths": ["keeps valid updates"], - "issue_character": "context updates are accepted when structured", + "dimension_character": "context updates are accepted when structured", "score_rationale": ( "The payload should preserve valid additions and header-based mutations " "while dropping malformed entries." diff --git a/desloppify/tests/commands/review/test_review_importing_support_direct.py b/desloppify/tests/commands/review/test_review_importing_support_direct.py index 7f5292c0..bb780ce7 100644 --- a/desloppify/tests/commands/review/test_review_importing_support_direct.py +++ b/desloppify/tests/commands/review/test_review_importing_support_direct.py @@ -233,7 +233,7 @@ def test_import_holistic_issues_ignores_unknown_context_update_dimensions() -> N "dimension_judgment": { "naming_quality": { "strengths": ["Names are mostly precise."], - "issue_character": "Minor drift remains localized.", + "dimension_character": "Minor drift remains localized.", "score_rationale": "The naming is mostly dependable with a few rough edges.", } }, diff --git a/desloppify/tests/commands/review/test_review_merge_command_direct.py b/desloppify/tests/commands/review/test_review_merge_command_direct.py index 92ca8413..0fa0dd40 100644 --- a/desloppify/tests/commands/review/test_review_merge_command_direct.py +++ b/desloppify/tests/commands/review/test_review_merge_command_direct.py @@ -55,7 +55,7 @@ def test_do_merge_dry_run_reports_groups_without_persisting( related_files=["desloppify/app/commands/helpers/runtime.py"], ) state = state_mod.empty_state() - state["issues"] = {first["id"]: first, second["id"]: second} + state["work_items"] = {first["id"]: first, second["id"]: second} runtime = _runtime_with_state(state, tmp_path / "state.json") monkeypatch.setattr(merge_mod, "command_runtime", lambda _args: runtime) @@ -67,8 +67,8 @@ def test_do_merge_dry_run_reports_groups_without_persisting( args = argparse.Namespace(similarity=0.3, dry_run=True) merge_mod.do_merge(args) - assert state["issues"][first["id"]]["status"] == "open" - assert state["issues"][second["id"]]["status"] == "open" + assert state["work_items"][first["id"]]["status"] == "open" + assert state["work_items"][second["id"]]["status"] == "open" assert "Dry run only" in capsys.readouterr().out @@ -84,7 +84,7 @@ def test_do_merge_marks_duplicates_and_persists_state(monkeypatch, tmp_path: Pat related_files=["desloppify/app/commands/resolve/plan_load.py"], ) state = state_mod.empty_state() - state["issues"] = {first["id"]: first, second["id"]: second} + state["work_items"] = {first["id"]: first, second["id"]: second} runtime = _runtime_with_state(state, tmp_path / "state.json") saved: list[tuple[dict, Path | None]] = [] query_payloads: list[dict] = [] @@ -106,9 +106,9 @@ def test_do_merge_marks_duplicates_and_persists_state(monkeypatch, tmp_path: Pat assert saved == [(state, runtime.state_path)] assert query_payloads and query_payloads[0]["duplicates_merged"] == 1 - open_issues = [issue for issue in state["issues"].values() if issue["status"] == "open"] + open_issues = [issue for issue in state["work_items"].values() if issue["status"] == "open"] auto_resolved = [ - issue for issue in state["issues"].values() if issue["status"] == "auto_resolved" + issue for issue in state["work_items"].values() if issue["status"] == "auto_resolved" ] assert len(open_issues) == 1 assert len(auto_resolved) == 1 diff --git a/desloppify/tests/commands/review/test_review_preflight.py b/desloppify/tests/commands/review/test_review_preflight.py index 223e1219..cf3038f9 100644 --- a/desloppify/tests/commands/review/test_review_preflight.py +++ b/desloppify/tests/commands/review/test_review_preflight.py @@ -147,7 +147,7 @@ def test_blocked_when_open_objective_items(capsys): def test_subjective_review_backlog_blocks_preflight(capsys): """Open review findings in scored dimensions block rerun preflight.""" state = _state_with_prior_review() - state["issues"] = { + state["work_items"] = { "review::naming": _review_issue( issue_id="review::naming", dimension="naming_quality", @@ -168,7 +168,7 @@ def test_subjective_review_backlog_blocks_preflight(capsys): def test_subjective_concerns_backlog_blocks_preflight(capsys): """Open concerns findings in scored dimensions block rerun preflight.""" state = _state_with_prior_review() - state["issues"] = { + state["work_items"] = { "concerns::naming": _concern_issue( issue_id="concerns::naming", dimension="naming_quality", @@ -189,7 +189,7 @@ def test_subjective_concerns_backlog_blocks_preflight(capsys): def test_subjective_review_backlog_is_dimension_filtered(): """Rerun targeting one scored dimension ignores review backlog in others.""" state = _state_with_prior_review() - state["issues"] = { + state["work_items"] = { "review::logic": _review_issue( issue_id="review::logic", dimension="logic_clarity", diff --git a/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py b/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py index 0fc5fb59..746eeb4d 100644 --- a/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py +++ b/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py @@ -157,13 +157,24 @@ def test_core_normalize_helpers_and_batch_normalization() -> None: "naming_quality", { "strengths": ["clear modules"], - "issue_character": "mostly local", + "dimension_character": "mostly local", "score_rationale": "x" * 60, }, log_fn=lambda _msg: None, ) assert judgment is not None - assert judgment["issue_character"] == "mostly local" + assert judgment["dimension_character"] == "mostly local" + + aliased_judgment = core_normalize_mod._validate_dimension_judgment( + "logic_clarity", + { + "issue_character": "legacy alias still parses", + "score_rationale": "y" * 60, + }, + log_fn=lambda _msg: None, + ) + assert aliased_judgment is not None + assert aliased_judgment["dimension_character"] == "legacy alias still parses" quality = core_normalize_mod._compute_batch_quality( assessments={"naming_quality": 80.0}, @@ -212,7 +223,7 @@ def test_core_normalize_helpers_and_batch_normalization() -> None: "dimension_judgment": { "naming_quality": { "strengths": ["Naming conventions are mostly consistent."], - "issue_character": "Inconsistency is isolated to a few ambiguous identifiers.", + "dimension_character": "Inconsistency is isolated to a few ambiguous identifiers.", "score_rationale": ( "Most modules use descriptive names and consistent style, but a handful of " "generic names still obscure intent at handoff points. " diff --git a/desloppify/tests/commands/test_cmd_autofix.py b/desloppify/tests/commands/test_cmd_autofix.py index f7cce16f..860f79ae 100644 --- a/desloppify/tests/commands/test_cmd_autofix.py +++ b/desloppify/tests/commands/test_cmd_autofix.py @@ -80,9 +80,10 @@ class TestResolveFixerResults: """_resolve_fixer_results marks matching issues as fixed.""" def _make_state_with_issues(self, *issues): - state = {"issues": {}} + work_items: dict[str, dict] = {} + state = {"work_items": work_items, "issues": work_items} for fid, status in issues: - state["issues"][fid] = { + work_items[fid] = { "id": fid, "status": status, "detector": "unused", @@ -104,8 +105,8 @@ def test_resolves_matching_open_issues(self, monkeypatch): results = [{"file": "a.ts", "removed": ["foo"]}] resolved = _resolve_fixer_results(state, results, "unused", "unused-imports") assert resolved == ["unused::a.ts::foo"] - assert state["issues"]["unused::a.ts::foo"]["status"] == "fixed" - assert state["issues"]["unused::a.ts::bar"]["status"] == "open" + assert state["work_items"]["unused::a.ts::foo"]["status"] == "fixed" + assert state["work_items"]["unused::a.ts::bar"]["status"] == "open" def test_skips_already_fixed(self, monkeypatch): monkeypatch.setattr(fix_apply_mod, "rel", lambda p: p) @@ -131,7 +132,7 @@ def test_adds_auto_fix_note(self, monkeypatch): state = self._make_state_with_issues(("unused::a.ts::foo", "open")) results = [{"file": "a.ts", "removed": ["foo"]}] _resolve_fixer_results(state, results, "unused", "unused-imports") - note = state["issues"]["unused::a.ts::foo"]["note"] + note = state["work_items"]["unused::a.ts::foo"]["note"] assert "auto-fixed" in note assert "unused-imports" in note @@ -142,7 +143,7 @@ def test_multiple_files(self, monkeypatch): ("unused::a.ts::foo", "open"), ("unused::b.ts::bar", "open"), ) - state["issues"]["unused::b.ts::bar"]["file"] = "b.ts" + state["work_items"]["unused::b.ts::bar"]["file"] = "b.ts" results = [ {"file": "a.ts", "removed": ["foo"]}, diff --git a/desloppify/tests/commands/test_cmd_exclude.py b/desloppify/tests/commands/test_cmd_exclude.py index c3f7061c..9de519d1 100644 --- a/desloppify/tests/commands/test_cmd_exclude.py +++ b/desloppify/tests/commands/test_cmd_exclude.py @@ -91,8 +91,8 @@ def test_cmd_exclude_prunes_matching_issues_and_plan( exclude_mod.cmd_exclude(_args(".claude", runtime)) - assert removed_id not in state["issues"] - assert kept_id in state["issues"] + assert removed_id not in state["work_items"] + assert kept_id in state["work_items"] assert state["subjective_assessments"]["naming_quality"]["score"] == 81 assert saved_state["path"] == state_file diff --git a/desloppify/tests/commands/test_lifecycle_transitions.py b/desloppify/tests/commands/test_lifecycle_transitions.py index 567800c0..f9f32aa1 100644 --- a/desloppify/tests/commands/test_lifecycle_transitions.py +++ b/desloppify/tests/commands/test_lifecycle_transitions.py @@ -77,8 +77,10 @@ def _build_state( overall_score: float | None = None, objective_score: float | None = None, ) -> dict: + work_items = {i["id"]: dict(i) for i in issues} state: dict = { - "issues": {i["id"]: dict(i) for i in issues}, + "work_items": work_items, + "issues": work_items, "scan_count": 1, "dimension_scores": {}, "subjective_assessments": {}, @@ -137,9 +139,11 @@ def _complete_endgame_subjective_reruns(state: dict) -> None: def _add_review_issues(state: dict) -> None: """Mutate state in place: add review detector issues that trigger triage.""" + work_items = state.setdefault("work_items", state.get("issues", {})) + state["issues"] = work_items for key in ("naming_quality", "logic_clarity"): fid = f"review-{key}" - state["issues"][fid] = { + work_items[fid] = { "id": fid, "detector": "review", "file": "src/app.py", "status": "open", "detail": {"dimension": key}, } @@ -219,8 +223,8 @@ def test_workflow_items_injected_on_next_scan(self, monkeypatch): # After completing objectives, postflight sequence begins. # Subjective reruns come before workflow items in the lifecycle. - state["issues"]["obj-1"]["status"] = "fixed" - state["issues"]["obj-2"]["status"] = "fixed" + state["work_items"]["obj-1"]["status"] = "fixed" + state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) # Subjective reruns visible first (stale assessments) assert any(fid.startswith("subjective::") for fid in ids), f"Expected subjective: {ids}" @@ -302,8 +306,8 @@ def test_triage_after_review_issues_on_scan(self, monkeypatch): # Once objective queue drains, lifecycle enters postflight. # Review issues are non-objective, but they stay behind triage. - state["issues"]["obj-1"]["status"] = "fixed" - state["issues"]["obj-2"]["status"] = "fixed" + state["work_items"]["obj-1"]["status"] = "fixed" + state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) # Subjective reruns surface first. assert any(fid.startswith("subjective::") for fid in ids), ids @@ -322,7 +326,7 @@ def test_triage_after_review_issues_on_scan(self, monkeypatch): # After triage completes for the live review issue set, the findings surface. plan.setdefault("epic_triage_meta", {})["triaged_ids"] = sorted( - fid for fid in state["issues"] if state["issues"][fid].get("detector") == "review" + fid for fid in state["work_items"] if state["work_items"][fid].get("detector") == "review" ) purge_ids(plan, TRIAGE_STAGE_IDS) ids = _queue_ids(state, plan) @@ -364,8 +368,8 @@ def test_golden_path(self, monkeypatch): assert WORKFLOW_COMMUNICATE_SCORE_ID not in ids, f"Scan 2: {ids}" # ── Between scans: complete objectives to unlock postflight ── - state["issues"]["obj-1"]["status"] = "fixed" - state["issues"]["obj-2"]["status"] = "fixed" + state["work_items"]["obj-1"]["status"] = "fixed" + state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) # Subjective reruns come first in postflight assert any(fid.startswith("subjective::") for fid in ids), f"Post-objectives: {ids}" @@ -382,8 +386,8 @@ def test_golden_path(self, monkeypatch): assert not any(fid.startswith("workflow::") for fid in ids), f"Post-workflow: {ids}" # ── Scan 3: add review issues + reopen objectives for mid-cycle test ── - state["issues"]["obj-1"]["status"] = "open" - state["issues"]["obj-2"]["status"] = "open" + state["work_items"]["obj-1"]["status"] = "open" + state["work_items"]["obj-2"]["status"] = "open" _add_review_issues(state) plan = _reconcile(state, plan, monkeypatch) ids = _queue_ids(state, plan) @@ -397,8 +401,8 @@ def test_golden_path(self, monkeypatch): # ── Complete objective queue → rescan injects triage in plan, but # postflight still starts with workflow items ── - state["issues"]["obj-1"]["status"] = "fixed" - state["issues"]["obj-2"]["status"] = "fixed" + state["work_items"]["obj-1"]["status"] = "fixed" + state["work_items"]["obj-2"]["status"] = "fixed" plan = _reconcile(state, plan, monkeypatch) ids = _queue_ids(state, plan) workflow_ids = [fid for fid in ids if fid.startswith("workflow::")] @@ -415,7 +419,7 @@ def test_golden_path(self, monkeypatch): # ── Complete triage → review findings finally become executable ── plan.setdefault("epic_triage_meta", {})["triaged_ids"] = sorted( - fid for fid in state["issues"] if state["issues"][fid].get("detector") == "review" + fid for fid in state["work_items"] if state["work_items"][fid].get("detector") == "review" ) purge_ids(plan, list(TRIAGE_STAGE_IDS)) ids = _queue_ids(state, plan) diff --git a/desloppify/tests/commands/test_queue_count_consistency.py b/desloppify/tests/commands/test_queue_count_consistency.py index 6cb64dfa..13f6786e 100644 --- a/desloppify/tests/commands/test_queue_count_consistency.py +++ b/desloppify/tests/commands/test_queue_count_consistency.py @@ -38,8 +38,10 @@ def _issue( def _state_with_issues(*issues: dict) -> dict: + work_items = {f["id"]: f for f in issues} return { - "issues": {f["id"]: f for f in issues}, + "work_items": work_items, + "issues": work_items, "scan_count": 5, } @@ -581,19 +583,21 @@ class TestClusterFocusDoesNotTriggerRunScan: def _make_state_and_plan(self): """Two open issues, one in cluster 'auth', one outside.""" - state: dict = { - "issues": { - "f1": { - "id": "f1", "detector": "unused", "status": "open", - "file": "src/auth.ts", "tier": 1, "confidence": "high", - "summary": "in cluster", "detail": {}, - }, - "f2": { - "id": "f2", "detector": "unused", "status": "open", - "file": "src/utils.ts", "tier": 1, "confidence": "high", - "summary": "outside cluster", "detail": {}, - }, + work_items = { + "f1": { + "id": "f1", "detector": "unused", "status": "open", + "file": "src/auth.ts", "tier": 1, "confidence": "high", + "summary": "in cluster", "detail": {}, + }, + "f2": { + "id": "f2", "detector": "unused", "status": "open", + "file": "src/utils.ts", "tier": 1, "confidence": "high", + "summary": "outside cluster", "detail": {}, }, + } + state: dict = { + "work_items": work_items, + "issues": work_items, "scan_count": 5, } plan = { @@ -632,7 +636,7 @@ def test_no_run_scan_when_items_exist_outside_cluster(self): ) state, plan = self._make_state_and_plan() - state["issues"]["f1"]["status"] = "resolved" + state["work_items"]["f1"]["status"] = "resolved" result = build_work_queue( state, options=QueueBuildOptions(status="open", count=None, plan=plan), @@ -651,7 +655,7 @@ def test_breakdown_not_affected_by_active_cluster(self): ) state, plan = self._make_state_and_plan() - state["issues"]["f1"]["status"] = "resolved" + state["work_items"]["f1"]["status"] = "resolved" breakdown = plan_aware_queue_breakdown(state, plan=plan) assert breakdown.objective_actionable >= 1, ( "active_cluster must not hide items from lifecycle breakdown" @@ -669,8 +673,8 @@ def test_run_scan_injected_when_globally_empty(self): ) state, plan = self._make_state_and_plan() - state["issues"]["f1"]["status"] = "resolved" - state["issues"]["f2"]["status"] = "resolved" + state["work_items"]["f1"]["status"] = "resolved" + state["work_items"]["f2"]["status"] = "resolved" result = build_work_queue( state, options=QueueBuildOptions(status="open", count=None, plan=plan), diff --git a/desloppify/tests/commands/test_queue_order_guard.py b/desloppify/tests/commands/test_queue_order_guard.py index 7f627f5a..5ca38898 100644 --- a/desloppify/tests/commands/test_queue_order_guard.py +++ b/desloppify/tests/commands/test_queue_order_guard.py @@ -58,9 +58,9 @@ def _get_guard_fn(): # --------------------------------------------------------------------------- def _state_with_issues(*ids: str) -> dict: - issues = {} + work_items = {} for fid in ids: - issues[fid] = { + work_items[fid] = { "id": fid, "status": "open", "detector": "unused", @@ -69,7 +69,7 @@ def _state_with_issues(*ids: str) -> dict: "confidence": "high", "summary": f"Issue {fid}", } - return {"issues": issues, "scan_count": 5} + return {"work_items": work_items, "issues": work_items, "scan_count": 5} def _setup_plan(tmp_path, monkeypatch, queue_order: list[str], clusters: dict | None = None): @@ -224,7 +224,7 @@ def test_guard_skips_resolved_ids_in_queue_order(tmp_path, monkeypatch): """Resolved (non-open) IDs at the front of queue_order should not block.""" state = _state_with_issues("a", "b") # Mark "a" as fixed — it's still in state but no longer open - state["issues"]["a"]["status"] = "fixed" + state["work_items"]["a"]["status"] = "fixed" _setup_plan(tmp_path, monkeypatch, ["a", "b"]) # "b" should be next since "a" is resolved diff --git a/desloppify/tests/commands/test_transitive_engine.py b/desloppify/tests/commands/test_transitive_engine.py index c56df7dc..89fe4fc1 100644 --- a/desloppify/tests/commands/test_transitive_engine.py +++ b/desloppify/tests/commands/test_transitive_engine.py @@ -131,14 +131,14 @@ def test_merge_new_issues(self, mock_recompute): diff = merge_scan(state, issues, MergeScanOptions(lang="python")) assert diff["new"] == 1 assert diff["total_current"] == 1 - assert "smells::foo.py::debug_tag" in state["issues"] + assert "smells::foo.py::debug_tag" in state["work_items"] @patch.object(merge_mod, "_recompute_stats") def test_merge_keeps_disappeared_open_issue_open(self, mock_recompute): """Old open issues not in current scan stay open until manually resolved.""" mock_recompute.return_value = None state = self._make_state() - state["issues"]["smells::old.py::leftover"] = { + state["work_items"]["smells::old.py::leftover"] = { "id": "smells::old.py::leftover", "detector": "smells", "file": "old.py", @@ -158,7 +158,7 @@ def test_merge_keeps_disappeared_open_issue_open(self, mock_recompute): state, [], MergeScanOptions(lang="python", force_resolve=True) ) assert diff["auto_resolved"] == 0 - assert state["issues"]["smells::old.py::leftover"]["status"] == "open" + assert state["work_items"]["smells::old.py::leftover"]["status"] == "open" @patch.object(merge_mod, "_recompute_stats") def test_merge_with_ignore_patterns(self, mock_recompute): @@ -190,7 +190,7 @@ def test_merge_with_ignore_patterns(self, mock_recompute): assert diff["ignored"] == 1 assert diff["raw_issues"] == 1 # Issue is inserted but suppressed: - f = state["issues"]["smells::vendor/lib.py::debug"] + f = state["work_items"]["smells::vendor/lib.py::debug"] assert f["suppressed"] is True @patch.object(merge_mod, "_recompute_stats") diff --git a/desloppify/tests/engine/test_sync_split_modules_direct.py b/desloppify/tests/engine/test_sync_split_modules_direct.py index 630318b0..2f5947df 100644 --- a/desloppify/tests/engine/test_sync_split_modules_direct.py +++ b/desloppify/tests/engine/test_sync_split_modules_direct.py @@ -584,6 +584,7 @@ def test_pending_import_scores_meta_ignores_malformed_refresh_state() -> None: "timestamp": "2026-03-10T10:00:00+00:00", "mode": "issues_only", "import_file": "/tmp/review.json", + "packet_sha256": "hash-from-audit", } ] } @@ -592,6 +593,7 @@ def test_pending_import_scores_meta_ignores_malformed_refresh_state() -> None: assert meta is not None assert meta.import_file == "/tmp/review.json" + assert meta.packet_sha256 == "hash-from-audit" def test_sync_communicate_score_reinjects_after_trusted_score_import() -> None: diff --git a/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py b/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py index e7424157..c0765df3 100644 --- a/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py +++ b/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py @@ -96,7 +96,7 @@ def test_holistic_cache_update_and_resolution_helpers(monkeypatch) -> None: ) # naming_quality is assessed, so its issue should be resolved assert diff["auto_resolved"] == 1 - assert state["issues"]["subjective_review::.::naming_quality"]["status"] == "fixed" + assert state["work_items"]["subjective_review::.::naming_quality"]["status"] == "fixed" # resolve_reviewed_file_coverage_issues is now a no-op diff = {"auto_resolved": 0} @@ -168,7 +168,7 @@ def test_issue_flow_build_collect_and_auto_resolve_paths(monkeypatch) -> None: full_sweep_included=False, ) assert diff["auto_resolved"] == 1 - assert state["issues"]["review::old"]["status"] == "fixed" + assert state["work_items"]["review::old"]["status"] == "fixed" def test_resolution_and_state_helper_utilities() -> None: @@ -188,7 +188,7 @@ def test_resolution_and_state_helper_utilities() -> None: utc_now_fn=lambda: "2026-03-09T00:00:00+00:00", ) assert diff["auto_resolved"] == 1 - assert state["issues"]["id1"]["status"] == "fixed" + assert state["work_items"]["id1"]["status"] == "fixed" cache = state_helpers_mod.ensure_review_file_cache({}) assert cache == {} diff --git a/desloppify/tests/narrative/test_action_engine_routing_direct.py b/desloppify/tests/narrative/test_action_engine_routing_direct.py index 0c2a8f2b..4158fe7a 100644 --- a/desloppify/tests/narrative/test_action_engine_routing_direct.py +++ b/desloppify/tests/narrative/test_action_engine_routing_direct.py @@ -62,7 +62,7 @@ def test_build_refactor_entry_handles_special_detectors(monkeypatch) -> None: lambda _detector, _count: 0.8, ) assert subjective["command"] == "desloppify review --prepare" - assert "subjective dimension" in subjective["description"] + assert "assessment request" in subjective["description"] review = routing_mod._build_refactor_entry( "review", @@ -79,7 +79,7 @@ def test_build_refactor_entry_handles_special_detectors(monkeypatch) -> None: 2, lambda _detector, _count: 1.2, ) - assert generic["description"] == "2 smells issues — clean up" + assert generic["description"] == "2 smells work items — clean up" def test_append_refactor_actions_and_debt_action(monkeypatch) -> None: @@ -136,5 +136,3 @@ def test_assign_priorities_and_cluster_annotation() -> None: assert auto["clusters"] == ["clusterA"] assert auto["command"] == "desloppify next" assert "cluster(s)" in auto["description"] - - diff --git a/desloppify/tests/narrative/test_narrative_actions.py b/desloppify/tests/narrative/test_narrative_actions.py index 9921d925..8f1c068c 100644 --- a/desloppify/tests/narrative/test_narrative_actions.py +++ b/desloppify/tests/narrative/test_narrative_actions.py @@ -189,7 +189,7 @@ def test_smells_with_no_useeffect_issues_gets_manual_fix(self, empty_state): """When smells issues exist but none are dead_useeffect, no auto-fix for it.""" # State has a non-useeffect smell but by_detector still shows smells count state = dict(empty_state) - state["issues"] = { + state["work_items"] = { "smells::server.ts::debug_tag": { "status": "open", "detector": "smells", @@ -214,7 +214,7 @@ def test_smells_with_no_useeffect_issues_gets_manual_fix(self, empty_state): def test_smells_with_dead_useeffect_issue_gets_auto_fix(self, empty_state): """When a dead_useeffect issue exists, dead-useeffect fixer is suggested.""" state = dict(empty_state) - state["issues"] = { + state["work_items"] = { "smells::app.tsx::dead_useeffect": { "status": "open", "detector": "smells", @@ -238,7 +238,7 @@ def test_smells_with_dead_useeffect_issue_gets_auto_fix(self, empty_state): def test_smells_with_empty_if_chain_issue_gets_correct_fixer(self, empty_state): """When only empty_if_chain issues exist, empty-if-chain fixer is suggested.""" state = dict(empty_state) - state["issues"] = { + state["work_items"] = { "smells::util.ts::empty_if_chain": { "status": "open", "detector": "smells", diff --git a/desloppify/tests/narrative/test_narrative_strategy_and_review.py b/desloppify/tests/narrative/test_narrative_strategy_and_review.py index c9e2db42..55587353 100644 --- a/desloppify/tests/narrative/test_narrative_strategy_and_review.py +++ b/desloppify/tests/narrative/test_narrative_strategy_and_review.py @@ -990,15 +990,17 @@ class TestReviewReminders: """Review-related reminders: pending issues + re-review needed.""" def _base_state(self): - return { - "issues": { - "r1": {"status": "open", "detector": "review", "detail": {}}, - "r2": { - "status": "open", - "detector": "review", - "detail": {"investigation": "done"}, - }, + work_items = { + "r1": {"status": "open", "detector": "review", "detail": {}}, + "r2": { + "status": "open", + "detector": "review", + "detail": {"investigation": "done"}, }, + } + return { + "work_items": work_items, + "issues": work_items, "reminder_history": {}, } @@ -1015,7 +1017,7 @@ def test_review_issues_pending_reminder(self): def test_no_review_pending_when_all_investigated(self): state = self._base_state() - state["issues"]["r1"]["detail"]["investigation"] = "done too" + state["work_items"]["r1"]["detail"]["investigation"] = "done too" reminders, _ = compute_reminders( state, "typescript", "middle_grind", {}, [], {}, {}, "scan" ) diff --git a/desloppify/tests/narrative/test_recovered_state_headline.py b/desloppify/tests/narrative/test_recovered_state_headline.py index 83333004..14b2192f 100644 --- a/desloppify/tests/narrative/test_recovered_state_headline.py +++ b/desloppify/tests/narrative/test_recovered_state_headline.py @@ -9,7 +9,7 @@ def test_compute_narrative_does_not_claim_first_scan_for_reconstructed_state() -> None: state = empty_state() state["stats"] = {"open": 2} - state["issues"] = { + state["work_items"] = { "review::src/foo.ts::abcd1234": { "id": "review::src/foo.ts::abcd1234", "status": "open", diff --git a/desloppify/tests/plan/test_auto_cluster.py b/desloppify/tests/plan/test_auto_cluster.py index 30b53089..782fc3d8 100644 --- a/desloppify/tests/plan/test_auto_cluster.py +++ b/desloppify/tests/plan/test_auto_cluster.py @@ -50,7 +50,7 @@ def _state_with(*issues: dict) -> dict: fmap = {} for f in issues: fmap[f["id"]] = f - return {"issues": fmap, "scan_count": 5} + return {"work_items": fmap, "issues": fmap, "scan_count": 5} # --------------------------------------------------------------------------- @@ -1150,7 +1150,7 @@ def test_judgment_required_issues_still_in_state(): auto_cluster_issues(plan, state) # smells issues still exist in state - assert "s1" in state["issues"] - assert "s2" in state["issues"] + assert "s1" in state["work_items"] + assert "s2" in state["work_items"] # unused auto-clusters normally assert "auto/unused" in plan["clusters"] diff --git a/desloppify/tests/plan/test_epic_triage.py b/desloppify/tests/plan/test_epic_triage.py index 4d67f717..6750ab5c 100644 --- a/desloppify/tests/plan/test_epic_triage.py +++ b/desloppify/tests/plan/test_epic_triage.py @@ -30,9 +30,9 @@ def _state_with_review_issues(*ids: str) -> dict: """Build minimal state with open review issues.""" - issues = {} + work_items = {} for fid in ids: - issues[fid] = { + work_items[fid] = { "status": "open", "detector": "review", "file": "test.py", @@ -41,11 +41,12 @@ def _state_with_review_issues(*ids: str) -> dict: "tier": 2, "detail": {"dimension": "abstraction_fitness"}, } - return {"issues": issues, "scan_count": 5, "dimension_scores": {}} + return {"work_items": work_items, "issues": work_items, "scan_count": 5, "dimension_scores": {}} def _state_empty() -> dict: - return {"issues": {}, "scan_count": 1, "dimension_scores": {}} + work_items: dict[str, dict] = {} + return {"work_items": work_items, "issues": work_items, "scan_count": 1, "dimension_scores": {}} # --------------------------------------------------------------------------- @@ -174,7 +175,7 @@ def test_re_triggers_on_resolved_issue(self): plan = empty_plan() plan["epic_triage_meta"] = {"issue_snapshot_hash": h} # Resolve r2 - state["issues"]["r2"]["status"] = "fixed" + state["work_items"]["r2"]["status"] = "fixed" result = sync_triage_needed(plan, state) assert result.injected @@ -549,7 +550,7 @@ class TestCollectTriageInput: def test_collects_open_review_issues(self): plan = empty_plan() state = _state_with_review_issues("r1", "r2") - state["issues"]["u1"] = {"status": "open", "detector": "unused"} + state["work_items"]["u1"] = {"status": "open", "detector": "unused"} si = collect_triage_input(plan, state) assert len(si.review_issues) == 2 assert "r1" in si.review_issues @@ -584,7 +585,7 @@ def test_collects_non_epic_auto_clusters_separately(self): "action": "desloppify autofix import-cleanup --dry-run", } state = _state_with_review_issues("r1") - state["issues"]["u1"] = {"status": "open", "detector": "unused"} + state["work_items"]["u1"] = {"status": "open", "detector": "unused"} si = collect_triage_input(plan, state) diff --git a/desloppify/tests/plan/test_stale_dimensions.py b/desloppify/tests/plan/test_stale_dimensions.py index 679f8469..87ac4528 100644 --- a/desloppify/tests/plan/test_stale_dimensions.py +++ b/desloppify/tests/plan/test_stale_dimensions.py @@ -39,8 +39,10 @@ def _state_with_stale_dimensions(*dim_keys: str, score: float = 50.0) -> dict: "refresh_reason": "mechanical_issues_changed", "stale_since": "2025-01-01T00:00:00+00:00", } + work_items: dict[str, dict] = {} return { - "issues": {}, + "work_items": work_items, + "issues": work_items, "scan_count": 5, "dimension_scores": dim_scores, "subjective_assessments": assessments, @@ -69,8 +71,10 @@ def _state_with_unscored_dimensions(*dim_keys: str) -> dict: "source": "scan_reset_subjective", "placeholder": True, } + work_items: dict[str, dict] = {} return { - "issues": {}, + "work_items": work_items, + "issues": work_items, "scan_count": 1, "dimension_scores": dim_scores, "subjective_assessments": assessments, @@ -98,8 +102,10 @@ def _state_with_under_target_dimensions(*dim_keys: str, score: float = 50.0) -> "score": score, "needs_review_refresh": False, } + work_items: dict[str, dict] = {} return { - "issues": {}, + "work_items": work_items, + "issues": work_items, "scan_count": 5, "dimension_scores": dim_scores, "subjective_assessments": assessments, @@ -206,7 +212,8 @@ def test_unscored_sync_does_not_prune_stale_ids(): def test_unscored_no_injection_when_no_dimension_scores(): plan = _plan_with_queue() - state = {"issues": {}, "scan_count": 1} + work_items: dict[str, dict] = {} + state = {"work_items": work_items, "issues": work_items, "scan_count": 1} result = sync_subjective_dimensions(plan, state) assert result.injected == [] @@ -267,7 +274,7 @@ def test_no_injection_when_queue_has_real_items(): plan = _plan_with_queue("some_issue::file.py::abc123") state = _state_with_stale_dimensions("design_coherence") # Add an actual open objective issue to state (source of truth) - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -286,7 +293,7 @@ def test_stale_ids_evicted_when_objective_backlog_exists(): "some_issue::file.py::abc123", ) state = _state_with_stale_dimensions("design_coherence", "error_consistency") - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -306,7 +313,7 @@ def test_stale_ids_inject_when_backlog_clears(): """Stale IDs inject when objective backlog clears.""" plan = _plan_with_queue("some_issue::file.py::abc123") state = _state_with_stale_dimensions("design_coherence") - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -317,7 +324,7 @@ def test_stale_ids_inject_when_backlog_clears(): assert r1.injected == [] # Objective backlog clears - state["issues"]["some_issue::file.py::abc123"]["status"] = "done" + state["work_items"]["some_issue::file.py::abc123"]["status"] = "done" r2 = sync_subjective_dimensions(plan, state) assert "subjective::design_coherence" in r2.injected @@ -579,7 +586,7 @@ def test_under_target_evicted_mid_cycle_with_objective_backlog(): stale=[], under_target=["naming_quality"], ) - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -602,7 +609,7 @@ def test_under_target_reinjected_after_objective_backlog_clears(): stale=[], under_target=["naming_quality", "error_handling"], ) - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -614,7 +621,7 @@ def test_under_target_reinjected_after_objective_backlog_clears(): assert "subjective::naming_quality" not in plan["queue_order"] # Step 2: objective backlog clears - state["issues"]["some_issue::file.py::abc123"]["status"] = "done" + state["work_items"]["some_issue::file.py::abc123"]["status"] = "done" # Step 3: under_target IDs injected r2 = sync_subjective_dimensions(plan, state) @@ -634,7 +641,7 @@ def test_escalation_mid_cycle_reinserts_evicted_ids(): plan = _plan_with_queue("some_issue::file.py::abc123") plan["plan_start_scores"] = {"strict": 50.0} # mid-cycle state = _state_with_under_target_dimensions("naming_quality") - state["issues"] = { + state["work_items"] = { "some_issue::file.py::abc123": { "id": "some_issue::file.py::abc123", "status": "open", diff --git a/desloppify/tests/plan/test_stale_dimensions_cycle_and_queue_order.py b/desloppify/tests/plan/test_stale_dimensions_cycle_and_queue_order.py index 4262c367..71441567 100644 --- a/desloppify/tests/plan/test_stale_dimensions_cycle_and_queue_order.py +++ b/desloppify/tests/plan/test_stale_dimensions_cycle_and_queue_order.py @@ -49,7 +49,7 @@ def test_cycle_completed_injects_stale_despite_objective_backlog(): """After a completed cycle, stale dims inject even with new objective issues.""" plan = _plan_with_queue("some_issue::file.py::abc123") state = _state_with_stale_dimensions("design_coherence", "error_consistency") - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -73,7 +73,7 @@ def test_cycle_completed_appends_to_back(): """Post-cycle stale injection appends to back, preserving existing order.""" plan = _plan_with_queue("issue_a", "issue_b") state = _state_with_stale_dimensions("design_coherence") - state["issues"]["issue_a"] = { + state["work_items"]["issue_a"] = { "id": "issue_a", "status": "open", "detector": "smells", } @@ -90,7 +90,7 @@ def test_cycle_completed_injects_under_target_dims(): # Dimension is below target but NOT stale (no needs_review_refresh) state = _state_with_stale_dimensions("design_coherence") state["subjective_assessments"]["design_coherence"]["needs_review_refresh"] = False - state["issues"]["some_issue::file.py::abc123"] = { + state["work_items"]["some_issue::file.py::abc123"] = { "id": "some_issue::file.py::abc123", "status": "open", "detector": "smells", @@ -121,7 +121,8 @@ def test_under_target_injected_when_no_objective_backlog(): def test_cycle_completed_no_stale_dims_no_injection(): """cycle_just_completed has no effect when no stale dims exist.""" plan = _plan_with_queue("some_issue::file.py::abc123") - state = {"issues": {}, "scan_count": 5} + work_items: dict[str, dict] = {} + state = {"work_items": work_items, "issues": work_items, "scan_count": 5} result = sync_subjective_dimensions(plan, state, cycle_just_completed=True) assert result.injected == [] @@ -164,10 +165,12 @@ def test_triage_appends_to_back(): plan = _plan_with_queue("issue_a", "issue_b") plan["epic_triage_meta"] = {"issue_snapshot_hash": "old_hash"} + work_items = { + "review::file.py::abc": {"status": "open", "detector": "review"}, + } state = { - "issues": { - "review::file.py::abc": {"status": "open", "detector": "review"}, - }, + "work_items": work_items, + "issues": work_items, "scan_count": 5, } diff --git a/desloppify/tests/plan/test_unified_status_lifecycle.py b/desloppify/tests/plan/test_unified_status_lifecycle.py index b9596d35..19e3a16d 100644 --- a/desloppify/tests/plan/test_unified_status_lifecycle.py +++ b/desloppify/tests/plan/test_unified_status_lifecycle.py @@ -212,9 +212,9 @@ def test_triage_apply_sets_triaged_out_in_state(self): result = apply_triage_to_plan(plan, state, triage, trigger="test") assert result.issues_dismissed == 1 # State status should be updated - assert state["issues"]["b"]["status"] == "triaged_out" + assert state["work_items"]["b"]["status"] == "triaged_out" # Non-dismissed issue should stay open - assert state["issues"]["a"]["status"] == "open" + assert state["work_items"]["a"]["status"] == "open" # --------------------------------------------------------------------------- @@ -299,9 +299,9 @@ def test_reconcile_syncs_open_skipped_to_deferred(self): "scan_count": 5, } reconcile_plan_after_scan(plan, state) - assert state["issues"]["a"]["status"] == "deferred" - assert state["issues"]["b"]["status"] == "triaged_out" - assert state["issues"]["c"]["status"] == "open" + assert state["work_items"]["a"]["status"] == "deferred" + assert state["work_items"]["b"]["status"] == "triaged_out" + assert state["work_items"]["c"]["status"] == "open" def test_reconcile_does_not_re_sync_already_correct(self): plan = empty_plan() @@ -315,7 +315,7 @@ def test_reconcile_does_not_re_sync_already_correct(self): "scan_count": 5, } reconcile_plan_after_scan(plan, state) - assert state["issues"]["a"]["status"] == "deferred" + assert state["work_items"]["a"]["status"] == "deferred" def test_reconcile_resurfaces_and_reopens(self): plan = empty_plan() @@ -336,7 +336,7 @@ def test_reconcile_resurfaces_and_reopens(self): result = reconcile_plan_after_scan(plan, state) assert "a" in result.resurfaced # State should be reopened from deferred back to open - assert state["issues"]["a"]["status"] == "open" + assert state["work_items"]["a"]["status"] == "open" # --------------------------------------------------------------------------- @@ -444,7 +444,7 @@ def test_triage_dismiss_unskip_roundtrip(self): dismissed_issues=[DismissedIssue(issue_id="x", reason="not needed")], ) apply_triage_to_plan(plan, state, triage, trigger="test") - assert state["issues"]["x"]["status"] == "triaged_out" + assert state["work_items"]["x"]["status"] == "triaged_out" assert "x" in plan["skipped"] # Unskip diff --git a/desloppify/tests/review/context/test_holistic_review.py b/desloppify/tests/review/context/test_holistic_review.py index 8a0adfdc..5c1894bf 100644 --- a/desloppify/tests/review/context/test_holistic_review.py +++ b/desloppify/tests/review/context/test_holistic_review.py @@ -526,7 +526,7 @@ def test_prepare_holistic_review_filters_out_of_scope_batch_files( lang = _mock_lang([in_scope_file]) lang.name = "python" state = empty_state() - state["issues"] = { + state["work_items"] = { "in_scope_structural": { "id": "in_scope_structural", "detector": "structural", @@ -616,7 +616,7 @@ def test_basic_import(self): diff = _call_import_holistic_issues(issues_data, state, "python") assert diff["new"] == 1 - issues = list(state["issues"].values()) + issues = list(state["work_items"].values()) assert len(issues) == 1 f = issues[0] assert f["file"] == "." @@ -639,7 +639,7 @@ def test_invalid_dimension_rejected(self): diff = _call_import_holistic_issues(issues_data, state, "python") assert diff["new"] == 0 - assert len(state["issues"]) == 0 + assert len(state["work_items"]) == 0 def test_missing_fields_rejected(self): state = empty_state() @@ -677,7 +677,7 @@ def test_multiple_issues(self): diff = _call_import_holistic_issues(issues_data, state, "python") assert diff["new"] == 2 - assert len(state["issues"]) == 2 + assert len(state["work_items"]) == 2 def test_holistic_cache_updated(self): state = empty_state() @@ -734,7 +734,7 @@ def test_reviewed_files_auto_resolves_per_file_coverage_markers(self, tmp_path): state = empty_state() coverage_id = "subjective_review::.::high_level_elegance" - state["issues"][coverage_id] = { + state["work_items"][coverage_id] = { "id": coverage_id, "detector": "subjective_review", "file": ".", @@ -763,7 +763,7 @@ def test_reviewed_files_auto_resolves_per_file_coverage_markers(self, tmp_path): diff = _call_import_holistic_issues(payload, state, "python", project_root=tmp_path) assert diff["auto_resolved"] >= 1 - assert state["issues"][coverage_id]["status"] == "fixed" + assert state["work_items"][coverage_id]["status"] == "fixed" def test_holistic_potential_added(self): state = empty_state() @@ -800,7 +800,7 @@ def test_issue_id_contains_holistic(self): _call_import_holistic_issues(issues_data, state, "python") - fid = list(state["issues"].keys())[0] + fid = list(state["work_items"].keys())[0] assert "holistic" in fid def test_positive_observation_skipped(self): @@ -841,7 +841,7 @@ def test_positive_observation_skipped(self): # Only the actual defect should be imported assert diff["new"] == 1 assert diff.get("skipped", 0) == 2 - issues = list(state["issues"].values()) + issues = list(state["work_items"].values()) assert len(issues) == 1 assert "vague_name" in issues[0]["id"] diff --git a/desloppify/tests/review/context/test_holistic_review_dimensions_and_structure.py b/desloppify/tests/review/context/test_holistic_review_dimensions_and_structure.py index f702f91b..9885e957 100644 --- a/desloppify/tests/review/context/test_holistic_review_dimensions_and_structure.py +++ b/desloppify/tests/review/context/test_holistic_review_dimensions_and_structure.py @@ -91,7 +91,7 @@ def _state_with_holistic_issues(*issues_args): state["objective_score"] = 45.0 state["strict_score"] = 38.0 for fid, conf, dim, summary in issues_args: - state["issues"][fid] = { + state["work_items"][fid] = { "id": fid, "file": ".", "status": "open", @@ -242,7 +242,7 @@ def test_resolved_issues_excluded(self): ), ) # Add a resolved issue that should NOT appear - state["issues"]["review::.::holistic::test::def"] = { + state["work_items"]["review::.::holistic::test::def"] = { "id": "review::.::holistic::test::def", "file": ".", "status": "fixed", diff --git a/desloppify/tests/review/context/test_issue_history_context.py b/desloppify/tests/review/context/test_issue_history_context.py index 49dd466e..004d9f6d 100644 --- a/desloppify/tests/review/context/test_issue_history_context.py +++ b/desloppify/tests/review/context/test_issue_history_context.py @@ -75,7 +75,7 @@ def test_issue_history_returns_flat_recent_issues(): note="blocked by migration dependency", resolved_at="2026-02-24T12:00:00+00:00", ) - state["issues"] = { + state["work_items"] = { f_open["id"]: f_open, f_fixed["id"]: f_fixed, f_wontfix["id"]: f_wontfix, @@ -122,7 +122,7 @@ def test_issue_history_strips_auto_resolve_notes(): note="not reported in latest holistic re-import", resolved_at="2026-02-24T11:00:00+00:00", ) - state["issues"] = {f["id"]: f} + state["work_items"] = {f["id"]: f} history = build_issue_history_context(state) assert history["recent_issues"][0]["note"] == "" @@ -130,7 +130,7 @@ def test_issue_history_strips_auto_resolve_notes(): def test_issue_history_respects_max_issues(): state = empty_state() - state["issues"] = {} + state["work_items"] = {} for idx in range(10): f = _review_issue( issue_id=f"review::.::holistic::abstraction_fitness::issue_{idx}", @@ -139,7 +139,7 @@ def test_issue_history_respects_max_issues(): summary=f"Issue number {idx}", last_seen=f"2026-02-{20 + idx % 5}T10:00:00+00:00", ) - state["issues"][f["id"]] = f + state["work_items"][f["id"]] = f history = build_issue_history_context( state, options=ReviewHistoryOptions(max_issues=5) @@ -164,7 +164,7 @@ def test_issue_history_sorted_by_last_seen(): last_seen="2026-02-24T10:00:00+00:00", ) state = empty_state() - state["issues"] = {f_old["id"]: f_old, f_new["id"]: f_new} + state["work_items"] = {f_old["id"]: f_old, f_new["id"]: f_new} history = build_issue_history_context(state) issues = history["recent_issues"] @@ -181,7 +181,7 @@ def test_issue_history_empty_state(): def test_prepare_holistic_review_optional_issue_history_payload(): state = empty_state() - state["issues"] = { + state["work_items"] = { "review::.::holistic::error_consistency::mixed_error_channels_console_vs_pipeline": _review_issue( issue_id="review::.::holistic::error_consistency::mixed_error_channels_console_vs_pipeline", dimension="error_consistency", diff --git a/desloppify/tests/review/context/test_mechanical_evidence.py b/desloppify/tests/review/context/test_mechanical_evidence.py index 58ac1085..14f57675 100644 --- a/desloppify/tests/review/context/test_mechanical_evidence.py +++ b/desloppify/tests/review/context/test_mechanical_evidence.py @@ -589,7 +589,7 @@ def test_auto_resolved_detector_marks_its_dimensions_stale(self): # Manually resolve the issue so verify_disappeared will process it # (open issues are now user-controlled and skip verification) - state["issues"]["structural::big.py::large_file"]["status"] = "fixed" + state["work_items"]["structural::big.py::large_file"]["status"] = "fixed" # Second scan: structural issue absent → scan-verified, detector changed merge_scan(state, [], MergeScanOptions(force_resolve=True)) diff --git a/desloppify/tests/review/import_scoring/test_review_import_scoring.py b/desloppify/tests/review/import_scoring/test_review_import_scoring.py index df494370..3c54ae03 100644 --- a/desloppify/tests/review/import_scoring/test_review_import_scoring.py +++ b/desloppify/tests/review/import_scoring/test_review_import_scoring.py @@ -21,7 +21,7 @@ def test_import_valid_issues(self, empty_state, sample_issues_data): diff = import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") assert diff["new"] == 3 # Check issues were added to state - issues = empty_state["issues"] + issues = empty_state["work_items"] assert len(issues) == 3 # Check issue IDs follow the pattern ids = list(issues.keys()) @@ -55,7 +55,7 @@ def test_import_validates_confidence(self, empty_state): } ] import_review_issues(_as_review_payload(data), empty_state, "typescript") - issue = list(empty_state["issues"].values())[0] + issue = list(empty_state["work_items"].values())[0] assert issue["confidence"] == "low" def test_import_validates_dimension(self, empty_state): @@ -109,7 +109,7 @@ def test_import_preserves_wontfix_issues(self, empty_state, sample_issues_data): # First import import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") # Mark one as wontfix - for f in empty_state["issues"].values(): + for f in empty_state["work_items"].values(): if "naming_quality" in f["id"]: f["status"] = "wontfix" f["note"] = "intentionally generic" @@ -117,25 +117,25 @@ def test_import_preserves_wontfix_issues(self, empty_state, sample_issues_data): # Second import with same issues import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") # Wontfix should NOT be auto-resolved (it's still in current issues) - assert any(f["status"] == "wontfix" for f in empty_state["issues"].values()) + assert any(f["status"] == "wontfix" for f in empty_state["work_items"].values()) # The issue still exists assert any( - "naming_quality" in f["id"] for f in empty_state["issues"].values() + "naming_quality" in f["id"] for f in empty_state["work_items"].values() ) def test_import_sets_lang(self, empty_state, sample_issues_data): import_review_issues(_as_review_payload(sample_issues_data), empty_state, "python") - for f in empty_state["issues"].values(): + for f in empty_state["work_items"].values(): assert f["lang"] == "python" def test_import_sets_tier_3(self, empty_state, sample_issues_data): import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") - for f in empty_state["issues"].values(): + for f in empty_state["work_items"].values(): assert f["tier"] == 3 def test_import_stores_detail(self, empty_state, sample_issues_data): import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") - for f in empty_state["issues"].values(): + for f in empty_state["work_items"].values(): assert "dimension" in f["detail"] assert "suggestion" in f["detail"] @@ -164,7 +164,7 @@ def test_id_collision_different_summaries(self, empty_state): # Same file + dimension + identifier = same issue ID, even with different summaries. # The second entry overwrites the first (last-writer wins during import). assert diff["new"] == 1 - assert len(empty_state["issues"]) == 1 + assert len(empty_state["work_items"]) == 1 def test_id_stable_for_same_summary(self, empty_state): """Same summary should produce the same issue ID (stable identifier).""" @@ -178,12 +178,12 @@ def test_id_stable_for_same_summary(self, empty_state): } ] import_review_issues(_as_review_payload(data), empty_state, "typescript") - ids_first = set(empty_state["issues"].keys()) + ids_first = set(empty_state["work_items"].keys()) # Import again — should match same IDs (no new issues) diff = import_review_issues(_as_review_payload(data), empty_state, "typescript") assert diff["new"] == 0 - assert set(empty_state["issues"].keys()) == ids_first + assert set(empty_state["work_items"].keys()) == ids_first # ── Scoring integration tests ───────────────────────────────────── @@ -201,7 +201,7 @@ def test_review_issues_appear_in_scoring(self, empty_state, sample_issues_data): } potentials = {"review": 2} dim_scores = compute_dimension_scores( - empty_state["issues"], potentials, subjective_assessments=assessments + empty_state["work_items"], potentials, subjective_assessments=assessments ) assert "Naming quality" in dim_scores assert dim_scores["Naming quality"]["score"] == 75.0 @@ -215,7 +215,7 @@ def test_review_issues_not_auto_resolved_by_scan( import_review_issues(_as_review_payload(sample_issues_data), empty_state, "typescript") review_ids = { f["id"] - for f in empty_state["issues"].values() + for f in empty_state["work_items"].values() if f["detector"] == "review" } @@ -231,8 +231,8 @@ def test_review_issues_not_auto_resolved_by_scan( # Review issues should still be open (not auto-resolved) for fid in review_ids: - if fid in empty_state["issues"]: - assert empty_state["issues"][fid]["status"] == "open" + if fid in empty_state["work_items"]: + assert empty_state["work_items"][fid]["status"] == "open" def test_review_in_file_based_detectors(self): assert "review" in FILE_BASED_DETECTORS @@ -267,7 +267,7 @@ def test_import_new_format_with_assessments(self): } diff = import_review_issues(_as_review_payload(data), state, "typescript") assert diff["new"] == 1 - assert len(state["issues"]) == 1 + assert len(state["work_items"]) == 1 assessments = state["subjective_assessments"] assert "naming_quality" in assessments assert assessments["naming_quality"]["score"] == 75 diff --git a/desloppify/tests/review/review_commands_cases.py b/desloppify/tests/review/review_commands_cases.py index f68df3df..0158e4fd 100644 --- a/desloppify/tests/review/review_commands_cases.py +++ b/desloppify/tests/review/review_commands_cases.py @@ -169,12 +169,11 @@ def mock_save(state, sp): lang = MagicMock() lang.name = "typescript" - # save_state is imported lazily: from ..state import save_state - with patch("desloppify.state.save_state", mock_save): + with patch("desloppify.app.commands.review.importing.cmd.save_state", mock_save): _do_import(str(issues_file), empty_state, lang, "fake_sp") assert saved["sp"] == "fake_sp" - assert len(empty_state["issues"]) == 1 + assert len(empty_state["work_items"]) == 1 def test_do_prepare_prints_narrative_reminders(self, mock_lang_with_zones, empty_state, tmp_path, capsys): from unittest.mock import MagicMock, patch @@ -318,7 +317,7 @@ def mock_save(state, sp): lang = MagicMock() lang.name = "typescript" - with patch("desloppify.state.save_state", mock_save): + with patch("desloppify.app.commands.review.importing.cmd.save_state", mock_save): _do_import( str(issues_file), empty_state, @@ -592,6 +591,7 @@ def test_attested_external_import_applies_durable_assessment( audit = empty_state.get("assessment_import_audit", []) assert audit and audit[-1]["mode"] == "attested_external" assert audit[-1]["attested_external"] is True + assert audit[-1]["packet_sha256"] == packet_hash def test_do_validate_import_reports_mode_without_state_mutation( self, empty_state, tmp_path, capsys @@ -706,12 +706,12 @@ def test_do_import_fails_closed_on_skipped_issues(self, empty_state, tmp_path): lang = MagicMock() lang.name = "typescript" - with patch("desloppify.state.save_state") as mock_save: + with patch("desloppify.app.commands.review.importing.cmd.save_state") as mock_save: with pytest.raises(CommandError): _do_import(str(issues_file), empty_state, lang, "sp") assert mock_save.called is False assert empty_state.get("subjective_assessments", {}) == {} - assert empty_state.get("issues", {}) == {} + assert empty_state.get("work_items", {}) == {} def test_do_import_allow_partial_persists_when_overridden( self, empty_state, tmp_path @@ -736,7 +736,7 @@ def test_do_import_allow_partial_persists_when_overridden( lang = MagicMock() lang.name = "typescript" - with patch("desloppify.state.save_state") as mock_save: + with patch("desloppify.app.commands.review.importing.cmd.save_state") as mock_save: _do_import( str(issues_file), empty_state, @@ -969,7 +969,7 @@ def fake_subprocess_run( "dimension_judgment": { "high_level_elegance": { "strengths": ["consistent module boundaries"], - "issue_character": "structural coupling between subsystems", + "dimension_character": "structural coupling between subsystems", "score_rationale": "Orchestration seams cross module boundaries creating coupling that impacts maintainability.", }, }, @@ -1001,7 +1001,7 @@ def fake_subprocess_run( "dimension_judgment": { "mid_level_elegance": { "strengths": ["clear module separation"], - "issue_character": "adapter protocol inconsistency across sibling modules", + "dimension_character": "adapter protocol inconsistency across sibling modules", "score_rationale": "Handoff adapters diverge between sibling modules making the integration boundary harder to reason about.", }, }, @@ -1033,7 +1033,7 @@ def fake_subprocess_run( "dimension_judgment": { "high_level_elegance": { "strengths": ["orchestration seams are mostly aligned"], - "issue_character": "brittle edge seams in module boundary handling", + "dimension_character": "brittle edge seams in module boundary handling", "score_rationale": "Most orchestration boundaries are consistent but edge seams remain brittle enough to risk regressions.", }, }, @@ -1065,7 +1065,7 @@ def fake_subprocess_run( "dimension_judgment": { "low_level_elegance": { "strengths": ["concise local internals"], - "issue_character": "repetitive branching boilerplate in local flow", + "dimension_character": "repetitive branching boilerplate in local flow", "score_rationale": "Local function bodies are concise but repetitive branching patterns add unnecessary cognitive load.", }, }, @@ -1208,7 +1208,7 @@ def fake_subprocess_run( "dimension_judgment": { "mid_level_elegance": { "strengths": ["seam boundaries are explicit"], - "issue_character": "seam convention drift across adjacent modules", + "dimension_character": "seam convention drift across adjacent modules", "score_rationale": "Adjacent modules use mostly explicit seams but conventions drift enough to cause confusion at boundaries.", } }, @@ -1326,7 +1326,7 @@ def fake_subprocess_run( "dimension_judgment": { "mid_level_elegance": { "strengths": ["aligned seam conventions"], - "issue_character": "minor inconsistencies in seam boundary alignment", + "dimension_character": "minor inconsistencies in seam boundary alignment", "score_rationale": "Seam conventions are mostly aligned but minor inconsistencies remain at module boundaries.", } }, @@ -1441,7 +1441,7 @@ def test_do_run_batches_recovers_missing_raw_output_from_log( "dimension_judgment": { "mid_level_elegance": { "strengths": ["clear hook separation"], - "issue_character": "overlapping orchestration seams across sibling hooks", + "dimension_character": "overlapping orchestration seams across sibling hooks", "score_rationale": "Domain seams are split across sibling hooks causing overlapping orchestration that complicates reasoning.", } }, @@ -1597,7 +1597,7 @@ def fake_subprocess_run( "dimension_judgment": { "mid_level_elegance": { "strengths": ["explicit seam boundaries"], - "issue_character": "seam style drift across nearby modules", + "dimension_character": "seam style drift across nearby modules", "score_rationale": "Seam interfaces are explicit but style differences across nearby modules reduce consistency.", } }, @@ -1798,7 +1798,7 @@ def fake_subprocess_run( "dimension_judgment": { "abstraction_fitness": { "strengths": ["interfaces are mostly honest about their contracts"], - "issue_character": "excessive wrapper indirection before reaching domain logic", + "dimension_character": "excessive wrapper indirection before reaching domain logic", "score_rationale": "Three wrapper layers before domain calls add significant indirection cost that outweighs abstraction leverage.", }, }, @@ -2310,7 +2310,7 @@ def test_holistic_auto_resolve_on_reimport(self): diff1 = import_holistic_issues(_as_review_payload(data1), state, "typescript") assert diff1["new"] == 2 open_ids = [ - fid for fid, f in state["issues"].items() if f["status"] == "open" + fid for fid, f in state["work_items"].items() if f["status"] == "open" ] assert len(open_ids) == 2 @@ -2333,7 +2333,7 @@ def test_holistic_auto_resolve_on_reimport(self): # The 2 old issues should be marked fixed by the import. assert diff2["auto_resolved"] >= 2 still_open = [ - fid for fid, f in state["issues"].items() if f["status"] == "open" + fid for fid, f in state["work_items"].items() if f["status"] == "open" ] assert len(still_open) == 1 @@ -2365,7 +2365,7 @@ def test_partial_holistic_reimport_only_resolves_imported_dimensions(self): diff1 = import_holistic_issues(_as_review_payload(data1), state, "typescript") assert diff1["new"] == 2 - by_summary = {f["summary"]: fid for fid, f in state["issues"].items()} + by_summary = {f["summary"]: fid for fid, f in state["work_items"].items()} cross_mod_id = by_summary["too central"] abstraction_id = by_summary["dumping ground"] @@ -2389,8 +2389,8 @@ def test_partial_holistic_reimport_only_resolves_imported_dimensions(self): diff2 = import_holistic_issues(_as_review_payload(data2), state, "typescript") assert diff2["new"] == 1 assert diff2["auto_resolved"] >= 1 - assert state["issues"][abstraction_id]["status"] == "fixed" - assert state["issues"][cross_mod_id]["status"] == "open" + assert state["work_items"][abstraction_id]["status"] == "fixed" + assert state["work_items"][cross_mod_id]["status"] == "open" def test_per_file_auto_resolve_on_reimport(self): state = build_empty_state() @@ -2433,7 +2433,7 @@ def test_per_file_auto_resolve_on_reimport(self): # The comment_quality issue should be marked fixed by the explicit import. resolved = [ f - for f in state["issues"].values() + for f in state["work_items"].values() if f["status"] == "fixed" and "not reported in latest per-file" in (f.get("note") or "") ] @@ -2457,7 +2457,7 @@ def test_holistic_does_not_resolve_per_file(self): } import_review_issues(_as_review_payload(per_file), state, "typescript") per_file_ids = [ - fid for fid, f in state["issues"].items() if f["status"] == "open" + fid for fid, f in state["work_items"].items() if f["status"] == "open" ] assert len(per_file_ids) == 1 @@ -2465,4 +2465,4 @@ def test_holistic_does_not_resolve_per_file(self): holistic = {"issues": []} import_holistic_issues(_as_review_payload(holistic), state, "typescript") # Per-file issue should still be open - assert state["issues"][per_file_ids[0]]["status"] == "open" + assert state["work_items"][per_file_ids[0]]["status"] == "open" diff --git a/desloppify/tests/review/review_coverage_cases.py b/desloppify/tests/review/review_coverage_cases.py index c4094caa..6fa2c62e 100644 --- a/desloppify/tests/review/review_coverage_cases.py +++ b/desloppify/tests/review/review_coverage_cases.py @@ -387,7 +387,7 @@ def test_same_identifier_collapses_with_evidence_lines(self): _ = _call_import_review_issues(issues_data, state, "python") # Same file+dimension+identifier → same issue ID (last writer wins) - ids = list(state["issues"].keys()) + ids = list(state["work_items"].keys()) assert len(ids) == 1 def test_same_identifier_collapses_without_evidence_lines(self): @@ -417,7 +417,7 @@ def test_same_identifier_collapses_without_evidence_lines(self): state = empty_state() _ = _call_import_review_issues(issues_data, state, "python") - ids = list(state["issues"].keys()) + ids = list(state["work_items"].keys()) assert len(ids) == 1 def test_same_issue_same_id(self): @@ -436,7 +436,7 @@ def test_same_issue_same_id(self): ] state = empty_state() _call_import_review_issues(issues_data, state, "python") - id1 = list(state["issues"].keys())[0] + id1 = list(state["work_items"].keys())[0] # Re-import same issue state2 = empty_state() @@ -485,7 +485,7 @@ def test_new_dimensions_accepted_by_import(self): ] state = empty_state() _call_import_review_issues(issues_data, state, "python") - assert len(state["issues"]) == 1, f"Issue for {dim} was rejected" + assert len(state["work_items"]) == 1, f"Issue for {dim} was rejected" # ── Registry and scoring integration ───────────────────────────── diff --git a/desloppify/tests/review/review_submodules_cases.py b/desloppify/tests/review/review_submodules_cases.py index f37334d4..07f4b6a6 100644 --- a/desloppify/tests/review/review_submodules_cases.py +++ b/desloppify/tests/review/review_submodules_cases.py @@ -130,7 +130,7 @@ def test_empty_state(self, empty_state): assert get_file_issues(empty_state, "src/foo.ts") == [] def test_finds_matching(self, empty_state): - empty_state["issues"] = { + empty_state["work_items"] = { "f1": { "detector": "smells", "file": "src/foo.ts", diff --git a/desloppify/tests/review/review_submodules_import_and_remediation_cases.py b/desloppify/tests/review/review_submodules_import_and_remediation_cases.py index d337c2a5..7d60a99f 100644 --- a/desloppify/tests/review/review_submodules_import_and_remediation_cases.py +++ b/desloppify/tests/review/review_submodules_import_and_remediation_cases.py @@ -48,7 +48,7 @@ def test_valid_issue(self, empty_state): # Issue should be in state assert any( f.get("detector") == "review" - for f in empty_state.get("issues", {}).values() + for f in empty_state.get("work_items", {}).values() ) def test_skips_missing_fields(self, empty_state): @@ -80,7 +80,7 @@ def test_normalizes_invalid_confidence(self, empty_state): } ] _ = import_review_issues(_as_review_payload(data), empty_state, "typescript") - issues = list(empty_state.get("issues", {}).values()) + issues = list(empty_state.get("work_items", {}).values()) review_issues = [f for f in issues if f.get("detector") == "review"] assert len(review_issues) == 1 assert review_issues[0]["confidence"] == "low" @@ -117,7 +117,7 @@ def test_auto_resolves_missing_issues(self, empty_state): detail={"dimension": "naming_quality"}, ) old["lang"] = "typescript" - empty_state["issues"][old["id"]] = old + empty_state["work_items"][old["id"]] = old # Import new issues for same file, but different issue data = [ { @@ -130,7 +130,7 @@ def test_auto_resolves_missing_issues(self, empty_state): ] _ = import_review_issues(_as_review_payload(data), empty_state, "typescript") # Old issue should be marked fixed by the explicit import. - assert empty_state["issues"][old["id"]]["status"] == "fixed" + assert empty_state["work_items"][old["id"]]["status"] == "fixed" class TestImportHolisticIssues: @@ -147,7 +147,7 @@ def test_valid_holistic(self, empty_state): } ] import_holistic_issues(_as_review_payload(data), empty_state, "typescript") - issues = list(empty_state.get("issues", {}).values()) + issues = list(empty_state.get("work_items", {}).values()) holistic = [f for f in issues if f.get("detail", {}).get("holistic")] assert len(holistic) == 1 @@ -247,7 +247,7 @@ def test_with_issues(self, empty_state): "reasoning": "Reduces coupling", }, ) - empty_state["issues"][f["id"]] = f + empty_state["work_items"][f["id"]] = f empty_state["objective_score"] = 85.0 empty_state["strict_score"] = 84.0 empty_state["potentials"] = {"typescript": {"review": 50}} diff --git a/desloppify/tests/review/shared_review_fixtures.py b/desloppify/tests/review/shared_review_fixtures.py index 8b84a34e..fee8cf52 100644 --- a/desloppify/tests/review/shared_review_fixtures.py +++ b/desloppify/tests/review/shared_review_fixtures.py @@ -25,7 +25,7 @@ def empty_state(): @pytest.fixture def state_with_issues(): state = build_empty_state() - state["issues"] = { + state["work_items"] = { "unused::src/foo.ts::bar": { "id": "unused::src/foo.ts::bar", "detector": "unused", diff --git a/desloppify/tests/review/test_work_queue_issues_direct.py b/desloppify/tests/review/test_work_queue_issues_direct.py index 17cd93c3..d90a4a2f 100644 --- a/desloppify/tests/review/test_work_queue_issues_direct.py +++ b/desloppify/tests/review/test_work_queue_issues_direct.py @@ -48,7 +48,7 @@ def test_update_investigation_persists_detail_and_timestamp() -> None: updated = issues_mod.update_investigation(state, "review::a", "looked into this") assert updated is True - detail = state["issues"]["review::a"]["detail"] + detail = state["work_items"]["review::a"]["detail"] assert detail["existing"] == "value" assert detail["investigation"] == "looked into this" datetime.fromisoformat(detail["investigated_at"]) @@ -96,8 +96,8 @@ def test_mark_stale_holistic_marks_old_entries_stale_only() -> None: expired = issues_mod.mark_stale_holistic(state, max_age_days=30) assert expired == ["review::stale"] - stale_issue = state["issues"]["review::stale"] + stale_issue = state["work_items"]["review::stale"] assert stale_issue["status"] == "open" assert stale_issue["note"].startswith("holistic review stale") - assert state["issues"]["review::fresh"]["status"] == "open" - assert state["issues"]["review::bad-time"]["status"] == "open" + assert state["work_items"]["review::fresh"]["status"] == "open" + assert state["work_items"]["review::bad-time"]["status"] == "open" diff --git a/desloppify/tests/review/work_queue_cases.py b/desloppify/tests/review/work_queue_cases.py index 7240f4bd..ba779763 100644 --- a/desloppify/tests/review/work_queue_cases.py +++ b/desloppify/tests/review/work_queue_cases.py @@ -33,8 +33,10 @@ def _issue( def _state(issues: list[dict], *, dimension_scores: dict | None = None) -> dict: + work_items = {f["id"]: f for f in issues} return { - "issues": {f["id"]: f for f in issues}, + "work_items": work_items, + "issues": work_items, "dimension_scores": dimension_scores or {}, } @@ -772,7 +774,7 @@ def test_evidence_only_issue_still_in_state(): issues = [_issue("props::src/a.tsx::big", detector="props", confidence="low")] state = _state(issues) # Issue exists in state - assert "props::src/a.tsx::big" in state["issues"] + assert "props::src/a.tsx::big" in state["work_items"] # But not in queue queue = build_work_queue(state, count=None, include_subjective=False) assert len(queue["items"]) == 0 diff --git a/desloppify/tests/state/test_state.py b/desloppify/tests/state/test_state.py index 15e6605f..1b3f618c 100644 --- a/desloppify/tests/state/test_state.py +++ b/desloppify/tests/state/test_state.py @@ -298,6 +298,16 @@ def test_legacy_payload_gets_normalized(self, tmp_path): assert s["issues"]["x"]["origin"] == SCAN_ORIGIN validate_state_invariants(s) + def test_work_items_payload_gets_normalized(self, tmp_path): + p = tmp_path / "state.json" + p.write_text( + json.dumps({"version": 2, "work_items": {"x": {"id": "x", "tier": 3}}}) + ) + s = load_state(p) + assert s["issues"]["x"]["status"] == "open" + assert s["issues"]["x"]["work_item_kind"] == MECHANICAL_FINDING + validate_state_invariants(s) + def test_corrupt_json_tries_backup(self, tmp_path): p = tmp_path / "state.json" p.write_text("{bad json!!") @@ -345,6 +355,8 @@ def test_creates_file_and_writes_valid_json(self, tmp_path): assert p.exists() loaded = json.loads(p.read_text()) assert loaded["version"] == CURRENT_VERSION + assert "work_items" in loaded + assert "issues" not in loaded def test_creates_backup_of_previous(self, tmp_path): p = tmp_path / "state.json" @@ -376,6 +388,7 @@ def test_atomic_write_produces_valid_json(self, tmp_path): loaded = json.loads(p.read_text()) assert loaded["custom_set"] == [1, 2, 3] # sorted assert loaded["custom_path"] == "/tmp/hello" + assert "work_items" in loaded def test_invalid_status_gets_normalized_before_save(self, tmp_path): p = tmp_path / "state.json" @@ -384,7 +397,7 @@ def test_invalid_status_gets_normalized_before_save(self, tmp_path): ensure_state_defaults(st) save_state(st, p) loaded = json.loads(p.read_text()) - assert loaded["issues"]["x"]["status"] == "open" + assert loaded["work_items"]["x"]["status"] == "open" # --------------------------------------------------------------------------- diff --git a/desloppify/tests/state/test_state_internal_direct.py b/desloppify/tests/state/test_state_internal_direct.py index 9434f156..6e5bd1cb 100644 --- a/desloppify/tests/state/test_state_internal_direct.py +++ b/desloppify/tests/state/test_state_internal_direct.py @@ -90,18 +90,22 @@ def test_issue_semantics_normalize_legacy_detector_rows(): issue_semantics_mod.ensure_issue_semantics(request_issue) issue_semantics_mod.ensure_issue_semantics(mechanical_issue) + assert review_issue["work_item_kind"] == issue_semantics_mod.REVIEW_DEFECT assert review_issue["issue_kind"] == issue_semantics_mod.REVIEW_FINDING assert review_issue["origin"] == issue_semantics_mod.REVIEW_IMPORT_ORIGIN + assert concern_issue["work_item_kind"] == issue_semantics_mod.REVIEW_CONCERN assert concern_issue["issue_kind"] == issue_semantics_mod.CONCERN_FINDING + assert request_issue["work_item_kind"] == issue_semantics_mod.ASSESSMENT_REQUEST assert request_issue["issue_kind"] == issue_semantics_mod.REVIEW_REQUEST - assert request_issue["origin"] == issue_semantics_mod.SYNTHETIC_REQUEST_ORIGIN + assert request_issue["origin"] == issue_semantics_mod.SYNTHETIC_TASK_ORIGIN + assert mechanical_issue["work_item_kind"] == issue_semantics_mod.MECHANICAL_DEFECT assert mechanical_issue["issue_kind"] == issue_semantics_mod.MECHANICAL_FINDING assert mechanical_issue["origin"] == issue_semantics_mod.SCAN_ORIGIN def test_validate_state_invariants_rejects_invalid_issue_semantics(): state = schema_mod.empty_state() - state["issues"] = { + state["work_items"] = { "bad": { "id": "bad", "detector": "unused", @@ -124,7 +128,7 @@ def test_validate_state_invariants_rejects_invalid_issue_semantics(): try: schema_mod.validate_state_invariants(state) except ValueError as exc: - assert "issue_kind" in str(exc) + assert "work_item_kind" in str(exc) else: raise AssertionError("validate_state_invariants should reject invalid issue_kind") @@ -177,7 +181,7 @@ def test_match_and_resolve_issues_updates_state(): ) hidden_issue["suppressed"] = True - state["issues"] = { + state["work_items"] = { open_issue["id"]: open_issue, hidden_issue["id"]: hidden_issue, } @@ -195,7 +199,7 @@ def test_match_and_resolve_issues_updates_state(): ) assert resolved_ids == [open_issue["id"]] - resolved = state["issues"][open_issue["id"]] + resolved = state["work_items"][open_issue["id"]] assert resolved["status"] == "fixed" assert resolved["note"] == "done" assert resolved["resolved_at"] is not None @@ -250,7 +254,7 @@ def test_resolve_fixed_review_marks_assessment_stale_preserves_score(): summary="naming issue", detail={"dimension": "naming_quality"}, ) - state["issues"] = {review_issue["id"]: review_issue} + state["work_items"] = {review_issue["id"]: review_issue} state["subjective_assessments"] = { "naming_quality": {"score": 82, "source": "holistic"}, "logic_clarity": {"score": 74, "source": "holistic"}, @@ -288,7 +292,7 @@ def test_resolve_wontfix_review_marks_assessment_stale(): summary="naming issue", detail={"dimension": "naming_quality"}, ) - state["issues"] = {review_issue["id"]: review_issue} + state["work_items"] = {review_issue["id"]: review_issue} state["subjective_assessments"] = { "naming_quality": {"score": 82, "source": "holistic"} } @@ -320,7 +324,7 @@ def test_resolve_false_positive_review_marks_assessment_stale(): summary="naming issue", detail={"dimension": "naming_quality"}, ) - state["issues"] = {review_issue["id"]: review_issue} + state["work_items"] = {review_issue["id"]: review_issue} state["subjective_assessments"] = { "naming_quality": {"score": 82, "source": "holistic"} } @@ -350,7 +354,7 @@ def test_resolve_non_review_issue_does_not_mark_stale(): confidence="high", summary="unused name", ) - state["issues"] = {issue["id"]: issue} + state["work_items"] = {issue["id"]: issue} state["subjective_assessments"] = { "naming_quality": {"score": 82, "source": "holistic"} } @@ -380,7 +384,7 @@ def test_resolve_wontfix_captures_snapshot_metadata(): summary="large module", detail={"loc": 210, "complexity_score": 42}, ) - state["issues"] = {issue["id"]: issue} + state["work_items"] = {issue["id"]: issue} resolution_mod.resolve_issues( state, @@ -390,7 +394,7 @@ def test_resolve_wontfix_captures_snapshot_metadata(): attestation="I have actually reviewed this and I am not gaming the score.", ) - resolved = state["issues"][issue["id"]] + resolved = state["work_items"][issue["id"]] assert resolved["status"] == "wontfix" assert resolved["wontfix_scan_count"] == 17 assert resolved["wontfix_snapshot"]["scan_count"] == 17 @@ -425,7 +429,7 @@ def test_resolve_stale_wontfix_refreshes_original_wontfix_snapshot(): summary="stale wontfix", detail={"original_issue_id": original["id"], "reasons": ["scan_decay"]}, ) - state["issues"] = { + state["work_items"] = { original["id"]: original, stale["id"]: stale, } @@ -438,7 +442,7 @@ def test_resolve_stale_wontfix_refreshes_original_wontfix_snapshot(): attestation="I have actually re-reviewed this wontfix and I am not gaming the score.", ) - refreshed = state["issues"][original["id"]] + refreshed = state["work_items"][original["id"]] assert refreshed["status"] == "wontfix" assert refreshed["wontfix_scan_count"] == 24 assert refreshed["wontfix_snapshot"]["scan_count"] == 24 @@ -461,7 +465,7 @@ def test_resolve_open_reopens_non_open_issue_and_increments_reopen_count(): issue["resolved_at"] = "2026-01-01T10:00:00+00:00" issue["note"] = "fixed earlier" issue["reopen_count"] = 2 - state["issues"] = {issue["id"]: issue} + state["work_items"] = {issue["id"]: issue} resolved_ids = resolution_mod.resolve_issues( state, @@ -472,7 +476,7 @@ def test_resolve_open_reopens_non_open_issue_and_increments_reopen_count(): ) assert resolved_ids == [issue["id"]] - reopened = state["issues"][issue["id"]] + reopened = state["work_items"][issue["id"]] assert reopened["status"] == "open" assert reopened["resolved_at"] is None assert reopened["note"] == "needs deeper fix" diff --git a/desloppify/tests/state/test_suppression_scoring.py b/desloppify/tests/state/test_suppression_scoring.py index e4eed052..5d0eadcc 100644 --- a/desloppify/tests/state/test_suppression_scoring.py +++ b/desloppify/tests/state/test_suppression_scoring.py @@ -163,7 +163,7 @@ def test_fixed_stays_fixed(self): state = _minimal_state(issues) removed = remove_ignored_issues(state, "src/a.ts") assert removed == 1 - f = state["issues"]["unused::src/a.ts::foo"] + f = state["work_items"]["unused::src/a.ts::foo"] assert f["suppressed"] is True assert f["status"] == "fixed" # NOT reopened to "open" @@ -177,7 +177,7 @@ def test_auto_resolved_stays_auto_resolved(self): } state = _minimal_state(issues) remove_ignored_issues(state, "src/a.ts") - f = state["issues"]["unused::src/a.ts::bar"] + f = state["work_items"]["unused::src/a.ts::bar"] assert f["suppressed"] is True assert f["status"] == "auto_resolved" @@ -191,7 +191,7 @@ def test_false_positive_stays_false_positive(self): } state = _minimal_state(issues) remove_ignored_issues(state, "src/a.ts") - f = state["issues"]["unused::src/a.ts::baz"] + f = state["work_items"]["unused::src/a.ts::baz"] assert f["suppressed"] is True assert f["status"] == "false_positive" @@ -218,15 +218,15 @@ def test_directory_pattern_matches_descendants(self): removed_worktrees = remove_ignored_issues(state, ".claude/worktrees") assert removed_worktrees == 1 assert ( - state["issues"]["security::.claude/worktrees/a/file.py::b101"]["suppressed"] + state["work_items"]["security::.claude/worktrees/a/file.py::b101"]["suppressed"] is True ) - assert state["issues"]["security::.claude/file.py::b101"]["suppressed"] is False + assert state["work_items"]["security::.claude/file.py::b101"]["suppressed"] is False removed_claude = remove_ignored_issues(state, ".claude") assert removed_claude == 2 - assert state["issues"]["security::.claude/file.py::b101"]["suppressed"] is True - assert state["issues"]["security::src/app.py::b101"]["suppressed"] is False + assert state["work_items"]["security::.claude/file.py::b101"]["suppressed"] is True + assert state["work_items"]["security::src/app.py::b101"]["suppressed"] is False # --------------------------------------------------------------------------- @@ -295,21 +295,21 @@ def test_suppressed_issues_invisible_to_scoring(self): # Simulate ignore: suppress the issue remove_ignored_issues(state, "src/a.ts") - f = state["issues"]["unused::src/a.ts::foo"] + f = state["work_items"]["unused::src/a.ts::foo"] assert f["suppressed"] is True assert f["status"] == "fixed" # preserved # _count_issues should not see it - counters, _ = _count_issues(state["issues"]) + counters, _ = _count_issues(state["work_items"]) assert counters.get("open", 0) == 0 assert counters.get("fixed", 0) == 0 # suppressed => invisible # _iter_scoring_candidates should not yield it candidates = list( - _iter_scoring_candidates("unused", state["issues"], frozenset()) + _iter_scoring_candidates("unused", state["work_items"], frozenset()) ) assert candidates == [] # open_scope_breakdown should not count it - breakdown = open_scope_breakdown(state["issues"], ".") + breakdown = open_scope_breakdown(state["work_items"], ".") assert breakdown["global"] == 0 From 6bfca00365d85e6f83a76d6bf1169df80c11cfce Mon Sep 17 00:00:00 2001 From: POM Date: Fri, 13 Mar 2026 04:13:06 +0100 Subject: [PATCH 03/15] feat: queue ownership, cluster semantics, lifecycle phase improvements Adds cluster_semantics module, refines issue semantics, updates work queue snapshot and plan ordering for phase isolation. Extends lifecycle phase handling and auto-cluster sync. Updates tests across plan, state, review, and narrative modules. Co-Authored-By: Claude Opus 4.6 --- desloppify/app/commands/helpers/guardrails.py | 4 +- .../app/commands/helpers/queue_progress.py | 1 + desloppify/app/commands/next/render.py | 15 +- desloppify/app/commands/next/render_nudges.py | 9 +- .../app/commands/next/render_support.py | 3 +- .../app/commands/next/render_workflow.py | 2 +- desloppify/app/commands/plan/override_misc.py | 2 +- .../commands/plan/override_resolve_helpers.py | 12 +- desloppify/app/commands/plan/override_skip.py | 6 +- .../commands/plan/triage/display/layout.py | 3 +- .../commands/plan/triage/stages/helpers.py | 3 +- desloppify/app/commands/resolve/cmd.py | 1 + .../app/commands/resolve/living_plan.py | 3 +- .../app/commands/review/importing/output.py | 6 +- .../commands/review/importing/plan_sync.py | 12 +- .../app/commands/scan/plan_reconcile.py | 15 +- .../app/commands/show/dimension_views.py | 4 +- desloppify/app/commands/status/render.py | 4 +- .../engine/_plan/auto_cluster_sync_issue.py | 7 + desloppify/engine/_plan/cluster_semantics.py | 157 +++++++++++++++ desloppify/engine/_plan/cluster_strategy.py | 6 +- desloppify/engine/_plan/constants.py | 18 ++ desloppify/engine/_plan/operations/cluster.py | 6 + desloppify/engine/_plan/refresh_lifecycle.py | 40 +++- desloppify/engine/_plan/schema/__init__.py | 7 +- desloppify/engine/_plan/schema/normalize.py | 3 + desloppify/engine/_plan/sync/dimensions.py | 11 +- desloppify/engine/_plan/triage/prompt.py | 4 +- desloppify/engine/_plan/triage/snapshot.py | 5 +- desloppify/engine/_state/filtering.py | 4 +- desloppify/engine/_state/issue_semantics.py | 66 +----- desloppify/engine/_state/merge.py | 4 +- desloppify/engine/_state/merge_issues.py | 4 +- desloppify/engine/_state/recovery.py | 4 +- desloppify/engine/_state/schema.py | 4 +- desloppify/engine/_work_queue/helpers.py | 20 +- desloppify/engine/_work_queue/plan_order.py | 33 ++- desloppify/engine/_work_queue/ranking.py | 1 + desloppify/engine/_work_queue/snapshot.py | 133 ++++++++---- desloppify/engine/_work_queue/types.py | 7 +- desloppify/engine/plan_triage.py | 8 +- desloppify/intelligence/integrity.py | 6 +- desloppify/intelligence/narrative/headline.py | 4 +- .../narrative/reminders_rules_followup.py | 2 +- desloppify/intelligence/narrative/signals.py | 6 +- .../plan/test_triage_display_direct.py | 2 +- .../test_review_importing_support_direct.py | 10 +- .../commands/test_lifecycle_transitions.py | 52 +++-- desloppify/tests/commands/test_next_render.py | 7 +- .../engine/test_sync_split_modules_direct.py | 189 ++++++++++++++++++ .../test_narrative_strategy_and_review.py | 14 +- desloppify/tests/plan/test_auto_cluster.py | 24 +++ .../tests/plan/test_refresh_lifecycle.py | 41 ++++ desloppify/tests/review/review_misc_cases.py | 2 +- .../review_misc_cases_headline_bugfix.py | 4 +- .../test_work_queue_plan_order_and_triage.py | 96 +++++++++ desloppify/tests/state/test_state.py | 8 +- .../tests/state/test_state_internal_direct.py | 16 +- 58 files changed, 851 insertions(+), 289 deletions(-) create mode 100644 desloppify/engine/_plan/cluster_semantics.py diff --git a/desloppify/app/commands/helpers/guardrails.py b/desloppify/app/commands/helpers/guardrails.py index 9d92eacd..50852365 100644 --- a/desloppify/app/commands/helpers/guardrails.py +++ b/desloppify/app/commands/helpers/guardrails.py @@ -70,7 +70,7 @@ def triage_guardrail_messages( messages: list[str] = [] if result.new_ids: messages.append( - f"{len(result.new_ids)} new review issue(s) not yet triaged." + f"{len(result.new_ids)} new review work item(s) not yet triaged." " Run the staged triage runner to incorporate them " f"(`{TRIAGE_CMD_RUN_STAGES_CODEX}` or `{TRIAGE_CMD_RUN_STAGES_CLAUDE}`)." ) @@ -115,7 +115,7 @@ def require_triage_current_or_exit( new_ids = result.new_ids lines = [ - f"BLOCKED: {len(new_ids) or 'some'} new review issue(s) have not been triaged." + f"BLOCKED: {len(new_ids) or 'some'} new review work item(s) have not been triaged." ] if new_ids: for fid in sorted(new_ids)[:5]: diff --git a/desloppify/app/commands/helpers/queue_progress.py b/desloppify/app/commands/helpers/queue_progress.py index 03680a78..c52b353c 100644 --- a/desloppify/app/commands/helpers/queue_progress.py +++ b/desloppify/app/commands/helpers/queue_progress.py @@ -236,6 +236,7 @@ def _snapshot_item_ids(snapshot: object) -> set[str] | None: partition_names = ( "all_objective_items", "all_initial_review_items", + "all_postflight_assessment_items", "all_postflight_review_items", "all_scan_items", "all_postflight_workflow_items", diff --git a/desloppify/app/commands/next/render.py b/desloppify/app/commands/next/render.py index aeb3feef..1124c521 100644 --- a/desloppify/app/commands/next/render.py +++ b/desloppify/app/commands/next/render.py @@ -12,9 +12,12 @@ ) from desloppify.engine._state.issue_semantics import ( is_review_finding, - is_review_request, + is_assessment_request, +) +from desloppify.engine._work_queue.helpers import ( + is_auto_fix_item, + workflow_stage_name, ) -from desloppify.engine._work_queue.helpers import workflow_stage_name from .render_support import is_auto_fix_command from .render_support import render_cluster_item as _render_cluster_item @@ -195,16 +198,16 @@ def _render_item_type(item: dict) -> None: if is_review_finding(item): print(colorize(" Type: Design review (requires judgment)", "dim")) return - if is_review_request(item): - print(colorize(" Type: Review request", "dim")) + if is_assessment_request(item): + print(colorize(" Type: Assessment request", "dim")) return - if is_auto_fix_command(item.get("primary_command")): + if is_auto_fix_item(item): print(colorize(" Type: Auto-fixable", "dim")) def _render_auto_fix_batch_hint(item: dict, issues_scoped: dict) -> None: auto_fix_command = item.get("primary_command") - if not is_auto_fix_command(auto_fix_command): + if not is_auto_fix_item(item) or not is_auto_fix_command(auto_fix_command): return detector_name = item.get("detector", "") similar_count = sum( diff --git a/desloppify/app/commands/next/render_nudges.py b/desloppify/app/commands/next/render_nudges.py index 6d510661..9e3c31e7 100644 --- a/desloppify/app/commands/next/render_nudges.py +++ b/desloppify/app/commands/next/render_nudges.py @@ -16,8 +16,9 @@ from desloppify.base.output.terminal import colorize, log from desloppify.base.output.user_message import print_user_message from desloppify.engine._scoring.results.core import compute_health_breakdown -from desloppify.engine._state.issue_semantics import is_review_request +from desloppify.engine._state.issue_semantics import is_assessment_request from desloppify.engine._work_queue.core import ATTEST_EXAMPLE +from desloppify.engine._work_queue.helpers import is_auto_fix_item from desloppify.intelligence.integrity import ( unassessed_subjective_dimensions, ) @@ -61,7 +62,7 @@ def render_single_item_resolution_hint(items: list[dict]) -> None: if kind != "issue": return item = items[0] - if is_review_request(item): + if is_assessment_request(item): dim_key = (item.get("detail") or {}).get("dimension", "") primary = item.get("primary_command", "") if not primary: @@ -84,7 +85,7 @@ def render_single_item_resolution_hint(items: list[dict]) -> None: return primary = item.get("primary_command", "") - if is_auto_fix_command(primary): + if is_auto_fix_item(item) and is_auto_fix_command(primary): print(colorize("\n Fix with:", "dim")) print(f" {primary}") print(colorize(" Or resolve individually:", "dim")) @@ -215,7 +216,7 @@ def _subjective_summary_parts( parts.append(f"{unassessed_count} unassessed") if open_review_count: parts.append( - f"{open_review_count} review issue{'s' if open_review_count != 1 else ''} open" + f"{open_review_count} review work item{'s' if open_review_count != 1 else ''} open" ) if coverage_open > 0: parts.append(f"{coverage_open} file{'s' if coverage_open != 1 else ''} need review") diff --git a/desloppify/app/commands/next/render_support.py b/desloppify/app/commands/next/render_support.py index ccf49ef9..004f3b86 100644 --- a/desloppify/app/commands/next/render_support.py +++ b/desloppify/app/commands/next/render_support.py @@ -8,6 +8,7 @@ from desloppify.app.commands.helpers.queue_progress import format_plan_delta from desloppify.base.output.terminal import colorize from desloppify.engine._state.issue_semantics import is_review_finding +from desloppify.engine._work_queue.helpers import is_auto_fix_item from desloppify.engine.work_queue import group_queue_items from desloppify.engine.planning.scorecard_projection import ( scorecard_subjective_entries, @@ -68,7 +69,7 @@ def effort_tag(item: dict) -> str: """Return a short effort/type tag for a queue item.""" if is_review_finding(item): return "[review]" - if is_auto_fix_command(item.get("primary_command")): + if is_auto_fix_item(item): return "[auto]" return "" diff --git a/desloppify/app/commands/next/render_workflow.py b/desloppify/app/commands/next/render_workflow.py index a2f76a05..37b5aef9 100644 --- a/desloppify/app/commands/next/render_workflow.py +++ b/desloppify/app/commands/next/render_workflow.py @@ -91,7 +91,7 @@ def render_workflow_stage(item: dict, *, colorize_fn, workflow_stage_name_fn) -> print(f" {colorize_fn(item.get('summary', ''), 'yellow')}") total = detail.get("total_review_issues", 0) if total: - print(colorize_fn(f" {total} review issues to analyze", "dim")) + print(colorize_fn(f" {total} review work items to analyze", "dim")) if blocked: _print_blocked_stage_actions( blocked_by=item.get("blocked_by", []), diff --git a/desloppify/app/commands/plan/override_misc.py b/desloppify/app/commands/plan/override_misc.py index 3be5f658..73416f57 100644 --- a/desloppify/app/commands/plan/override_misc.py +++ b/desloppify/app/commands/plan/override_misc.py @@ -113,7 +113,7 @@ def cmd_plan_reopen(args: argparse.Namespace) -> None: count += 1 append_log_entry(plan, "reopen", issue_ids=reopened, actor="user") - clear_postflight_scan_completion(plan, issue_ids=reopened) + clear_postflight_scan_completion(plan, issue_ids=reopened, state=state_data) save_plan_state_transactional( plan=plan, plan_path=plan_file, diff --git a/desloppify/app/commands/plan/override_resolve_helpers.py b/desloppify/app/commands/plan/override_resolve_helpers.py index 3f39fd98..c5b48cab 100644 --- a/desloppify/app/commands/plan/override_resolve_helpers.py +++ b/desloppify/app/commands/plan/override_resolve_helpers.py @@ -6,6 +6,7 @@ from desloppify.base.output.terminal import colorize from desloppify.engine._plan.constants import ( confirmed_triage_stage_names, + is_synthetic_id, recorded_unconfirmed_triage_stage_names, ) from desloppify.engine.plan_triage import ( @@ -69,17 +70,6 @@ def print_cluster_guard(cluster_name: str, issue_ids: list[str], state: dict) -> "dim", ) ) - - -def is_synthetic_id(issue_id: str) -> bool: - """Return True if the ID is a synthetic workflow/triage item.""" - return ( - issue_id.startswith("triage::") - or issue_id.startswith("workflow::") - or issue_id.startswith("subjective::") - ) - - def split_synthetic_patterns(patterns: list[str]) -> tuple[list[str], list[str]]: """Partition synthetic workflow/triage patterns from real issue patterns.""" synthetic = [pattern for pattern in patterns if is_synthetic_id(pattern)] diff --git a/desloppify/app/commands/plan/override_skip.py b/desloppify/app/commands/plan/override_skip.py index 3a287bcc..3b3be764 100644 --- a/desloppify/app/commands/plan/override_skip.py +++ b/desloppify/app/commands/plan/override_skip.py @@ -245,7 +245,7 @@ def cmd_plan_skip(args: argparse.Namespace) -> None: note=note, detail={"kind": kind, "reason": reason}, ) - clear_postflight_scan_completion(plan, issue_ids=issue_ids) + clear_postflight_scan_completion(plan, issue_ids=issue_ids, state=state) _save_skip_plan_state( plan=plan, plan_file=plan_file, @@ -304,7 +304,7 @@ def cmd_plan_unskip(args: argparse.Namespace) -> None: actor="user", detail={"need_reopen": need_reopen}, ) - clear_postflight_scan_completion(plan, issue_ids=unskipped_ids) + clear_postflight_scan_completion(plan, issue_ids=unskipped_ids, state=state) reopened: list[str] = [] if need_reopen: @@ -374,7 +374,7 @@ def cmd_plan_backlog(args: argparse.Namespace) -> None: issue_ids=removed, actor="user", ) - clear_postflight_scan_completion(plan, issue_ids=removed) + clear_postflight_scan_completion(plan, issue_ids=removed, state=state_data) if reopen_ids: save_plan_state_transactional( diff --git a/desloppify/app/commands/plan/triage/display/layout.py b/desloppify/app/commands/plan/triage/display/layout.py index 7dbea906..a27947fb 100644 --- a/desloppify/app/commands/plan/triage/display/layout.py +++ b/desloppify/app/commands/plan/triage/display/layout.py @@ -5,6 +5,7 @@ from collections import defaultdict from desloppify.app.commands.helpers.issue_id_display import short_issue_id +from desloppify.engine._plan.constants import is_synthetic_id from desloppify.engine.plan_triage import TriageSnapshot from desloppify.engine.plan_triage import ( TRIAGE_CMD_CLUSTER_ADD, @@ -302,7 +303,7 @@ def show_plan_summary(plan: dict, state: dict) -> None: queue_order = [ fid for fid in plan.get("queue_order", []) - if not fid.startswith("triage::") and not fid.startswith("workflow::") + if not is_synthetic_id(fid) ] if queue_order: show = min(15, len(queue_order)) diff --git a/desloppify/app/commands/plan/triage/stages/helpers.py b/desloppify/app/commands/plan/triage/stages/helpers.py index 08deabd6..1df5d1e4 100644 --- a/desloppify/app/commands/plan/triage/stages/helpers.py +++ b/desloppify/app/commands/plan/triage/stages/helpers.py @@ -3,6 +3,7 @@ from __future__ import annotations from desloppify.base.output.terminal import colorize +from desloppify.engine._plan.constants import is_synthetic_id from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine.plan_triage import TRIAGE_IDS @@ -107,7 +108,7 @@ def unclustered_review_issues(plan: dict, state: dict | None = None) -> list[str else: review_ids = [ fid for fid in plan.get("queue_order", []) - if not fid.startswith("triage::") and not fid.startswith("workflow::") + if not is_synthetic_id(fid) and (fid.startswith("review::") or fid.startswith("concerns::")) ] diff --git a/desloppify/app/commands/resolve/cmd.py b/desloppify/app/commands/resolve/cmd.py index 7ff69870..871eb2ae 100644 --- a/desloppify/app/commands/resolve/cmd.py +++ b/desloppify/app/commands/resolve/cmd.py @@ -134,6 +134,7 @@ def cmd_resolve(args: argparse.Namespace) -> None: args=args, all_resolved=all_resolved, attestation=attestation, + state=state, state_file=state_file, ) mid_cluster = ( diff --git a/desloppify/app/commands/resolve/living_plan.py b/desloppify/app/commands/resolve/living_plan.py index 06179966..05b87698 100644 --- a/desloppify/app/commands/resolve/living_plan.py +++ b/desloppify/app/commands/resolve/living_plan.py @@ -60,6 +60,7 @@ def update_living_plan_after_resolve( args: argparse.Namespace, all_resolved: list[str], attestation: str | None, + state: dict | None = None, state_file: Path | str | None = None, ) -> tuple[dict | None, ClusterContext]: """Apply resolve side effects to the living plan when it exists.""" @@ -95,7 +96,7 @@ def update_living_plan_after_resolve( add_uncommitted_issues(plan, all_resolved) elif args.status == "open": purge_uncommitted_ids(plan, all_resolved) - clear_postflight_scan_completion(plan, issue_ids=all_resolved) + clear_postflight_scan_completion(plan, issue_ids=all_resolved, state=state) save_plan(plan, plan_path) if purged: print(colorize(f" Plan updated: {purged} item(s) removed from queue.", "dim")) diff --git a/desloppify/app/commands/review/importing/output.py b/desloppify/app/commands/review/importing/output.py index 0aa49f03..28001461 100644 --- a/desloppify/app/commands/review/importing/output.py +++ b/desloppify/app/commands/review/importing/output.py @@ -297,7 +297,7 @@ def print_assessments_summary(state: StateModel, *, colorize_fn) -> None: def print_open_review_summary(state: StateModel, *, colorize_fn) -> str: - """Print current open review issue count and return next command.""" + """Print current open review work item count and return next command.""" work_items = state.get("work_items") or state.get("issues", {}) open_review = [ issue @@ -308,8 +308,8 @@ def print_open_review_summary(state: StateModel, *, colorize_fn) -> str: return "desloppify scan" print( colorize_fn( - f"\n {len(open_review)} review issue{'s' if len(open_review) != 1 else ''} open total " - f"({len(open_review)} review issue{'s' if len(open_review) != 1 else ''} open total)", + f"\n {len(open_review)} review work item{'s' if len(open_review) != 1 else ''} open total " + f"({len(open_review)} review work item{'s' if len(open_review) != 1 else ''} open total)", "bold", ) ) diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index e58cff6b..1a5de798 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -11,7 +11,7 @@ from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS from desloppify.base.output.terminal import colorize from desloppify.engine._plan.auto_cluster import auto_cluster_issues -from desloppify.engine._plan.constants import QueueSyncResult +from desloppify.engine._plan.constants import QueueSyncResult, is_triage_id from desloppify.engine._plan.operations.meta import append_log_entry from desloppify.engine._plan.persistence import ( has_living_plan, @@ -40,7 +40,7 @@ TRIAGE_CMD_RUN_STAGES_CODEX, ) from desloppify.engine._state.issue_semantics import ( - is_review_request, + is_assessment_request, is_triage_finding, ) from desloppify.intelligence.review.importing.contracts_types import ( @@ -80,7 +80,7 @@ def _has_postflight_review_work(state: dict, *, policy) -> bool: if any( isinstance(issue, dict) and issue.get("status") == "open" - and (is_triage_finding(issue) or is_review_request(issue)) + and (is_triage_finding(issue) or is_assessment_request(issue)) for issue in issues.values() ): return True @@ -113,7 +113,7 @@ def _sync_lifecycle_phase_after_import(plan: dict, state: dict, *, policy) -> bo ) ), has_triage=any( - isinstance(item_id, str) and item_id.startswith("triage::") + isinstance(item_id, str) and is_triage_id(item_id) for item_id in plan.get("queue_order", []) ), has_deferred=_has_deferred_disposition_work(plan), @@ -139,7 +139,7 @@ def _print_new_review_items(state: dict, new_ids: list[str]) -> None: if not new_ids: return print(colorize( - f" Plan updated: {len(new_ids)} new review issue(s) added to queue.", + f" Plan updated: {len(new_ids)} new review work item(s) added to queue.", "bold", )) issues = (state.get("work_items") or state.get("issues", {})) @@ -154,7 +154,7 @@ def _print_stale_review_prunes(stale_pruned: list[str]) -> None: if not stale_pruned: return print(colorize( - f" Plan updated: {len(stale_pruned)} stale review issue(s) removed from queue.", + f" Plan updated: {len(stale_pruned)} stale review work item(s) removed from queue.", "bold", )) diff --git a/desloppify/app/commands/scan/plan_reconcile.py b/desloppify/app/commands/scan/plan_reconcile.py index 409b511d..341b9bf4 100644 --- a/desloppify/app/commands/scan/plan_reconcile.py +++ b/desloppify/app/commands/scan/plan_reconcile.py @@ -12,8 +12,9 @@ from desloppify.base.output.terminal import colorize from desloppify.engine._plan.auto_cluster import auto_cluster_issues from desloppify.engine._plan.constants import ( - SYNTHETIC_PREFIXES, WORKFLOW_COMMUNICATE_SCORE_ID, + is_synthetic_id, + is_triage_id, ) from desloppify.engine._plan.operations.meta import append_log_entry from desloppify.engine._plan.persistence import ( @@ -38,7 +39,7 @@ from desloppify.engine._work_queue.snapshot import coarse_phase_name from desloppify.engine.work_queue import build_deferred_disposition_item from desloppify.engine._state.issue_semantics import ( - is_review_request, + is_assessment_request, is_triage_finding, ) @@ -53,7 +54,7 @@ def _reset_cycle_for_force_rescan(plan: dict[str, object]) -> bool: metadata are all stale and must be removed. """ order: list[str] = plan.get("queue_order", []) - synthetic = [item for item in order if any(item.startswith(p) for p in SYNTHETIC_PREFIXES)] + synthetic = [item for item in order if is_synthetic_id(item)] if not synthetic and not plan.get("plan_start_scores"): return False for item in synthetic: @@ -302,7 +303,7 @@ def _sync_triage_and_log( if meta.get("triage_recommended"): print( colorize( - " Plan: review issues changed — triage recommended after current work.", + " Plan: review work items changed — triage recommended after current work.", "dim", ) ) @@ -312,7 +313,7 @@ def _sync_triage_and_log( if triage_sync.injected: print( colorize( - " Plan: planning mode needed — review issues changed since last triage.", + " Plan: planning mode needed — review work items changed since last triage.", "cyan", ) ) @@ -407,7 +408,7 @@ def _has_postflight_review_work( has_review_like_issue = any( isinstance(issue, dict) and issue.get("status") == "open" - and (is_triage_finding(issue) or is_review_request(issue)) + and (is_triage_finding(issue) or is_assessment_request(issue)) for issue in issues.values() ) if has_review_like_issue: @@ -430,7 +431,7 @@ def _has_postflight_workflow_items(plan: dict[str, object]) -> bool: def _has_triage_items(plan: dict[str, object]) -> bool: return any( - isinstance(item_id, str) and item_id.startswith("triage::") + isinstance(item_id, str) and is_triage_id(item_id) for item_id in plan.get("queue_order", []) ) diff --git a/desloppify/app/commands/show/dimension_views.py b/desloppify/app/commands/show/dimension_views.py index 924e6f31..df6bd703 100644 --- a/desloppify/app/commands/show/dimension_views.py +++ b/desloppify/app/commands/show/dimension_views.py @@ -80,7 +80,7 @@ def _render_subjective_dimension( if dim_reviews: print( colorize( - f" {len(dim_reviews)} open review issue(s). " + f" {len(dim_reviews)} open review work item(s). " "Run `show review --status open`.", "dim", ) @@ -162,7 +162,7 @@ def _render_subjective_views_guide(entity) -> None: "subjective_review", ): print(colorize(" Related views:", "dim")) - print(colorize(" `show review --status open` Per-file design review issues", "dim")) + print(colorize(" `show review --status open` Per-file design review work items", "dim")) print(colorize(" `show subjective_review --status open` Files needing re-review", "dim")) diff --git a/desloppify/app/commands/status/render.py b/desloppify/app/commands/status/render.py index d7553cae..82473dfc 100644 --- a/desloppify/app/commands/status/render.py +++ b/desloppify/app/commands/status/render.py @@ -321,7 +321,7 @@ def show_structural_areas(state: StateModel) -> None: def show_review_summary(state: StateModel) -> None: - """Show review issues summary if any exist.""" + """Show review work items summary if any exist.""" issues = (state.get("work_items") or state.get("issues", {})) review_open = [ f @@ -341,7 +341,7 @@ def show_review_summary(state: StateModel) -> None: if "Test health" in dim_scores: print( colorize( - " Test health tracks coverage + review; review issues track issues found.", + " Test health tracks coverage + review; review work items track issues found.", "dim", ) ) diff --git a/desloppify/engine/_plan/auto_cluster_sync_issue.py b/desloppify/engine/_plan/auto_cluster_sync_issue.py index 15e95a25..5cbd6ffb 100644 --- a/desloppify/engine/_plan/auto_cluster_sync_issue.py +++ b/desloppify/engine/_plan/auto_cluster_sync_issue.py @@ -6,6 +6,7 @@ from dataclasses import dataclass from desloppify.base.registry import DETECTORS +from desloppify.engine._plan.cluster_semantics import normalize_cluster_semantics from desloppify.engine._plan.cluster_strategy import ( cluster_name_from_key as _cluster_name_from_key, ) @@ -107,6 +108,7 @@ def _sync_auto_cluster( description: str, action: str, now: str, + detector: str = "", optional: bool = False, ) -> AutoClusterSyncResult: """Create/update one auto-cluster and report the mutation outcome. @@ -133,6 +135,9 @@ def _sync_auto_cluster( cluster["action"] = action cluster["updated_at"] = now changes = 1 + if normalize_cluster_semantics(cluster, detector=detector): + cluster["updated_at"] = now + changes = 1 else: new_cluster = { "name": cluster_name, @@ -147,6 +152,7 @@ def _sync_auto_cluster( } if optional: new_cluster["optional"] = True + normalize_cluster_semantics(new_cluster, detector=detector) clusters[cluster_name] = new_cluster existing_by_key[cluster_key] = cluster_name changes = 1 @@ -224,6 +230,7 @@ def sync_issue_clusters( description=description, action=action, now=now, + detector=detector, ) changes += int(sync_result.changed) diff --git a/desloppify/engine/_plan/cluster_semantics.py b/desloppify/engine/_plan/cluster_semantics.py new file mode 100644 index 00000000..2fc90a96 --- /dev/null +++ b/desloppify/engine/_plan/cluster_semantics.py @@ -0,0 +1,157 @@ +"""Canonical semantic helpers for plan clusters. + +Cluster behavior should be derived from explicit semantic metadata rather than +from command-string sniffing spread across queue assembly and rendering code. +""" + +from __future__ import annotations + +from collections.abc import MutableMapping +from typing import Any + +from desloppify.base.registry import DETECTORS + +ACTION_TYPE_AUTO_FIX = "auto_fix" +ACTION_TYPE_REFACTOR = "refactor" +ACTION_TYPE_MANUAL_FIX = "manual_fix" +ACTION_TYPE_REORGANIZE = "reorganize" +VALID_ACTION_TYPES = frozenset( + { + ACTION_TYPE_AUTO_FIX, + ACTION_TYPE_REFACTOR, + ACTION_TYPE_MANUAL_FIX, + ACTION_TYPE_REORGANIZE, + } +) + +EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE = "ephemeral_autopromote" +EXECUTION_POLICY_PLANNED_ONLY = "planned_only" +VALID_EXECUTION_POLICIES = frozenset( + { + EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE, + EXECUTION_POLICY_PLANNED_ONLY, + } +) + + +def _action_text(cluster: MutableMapping[str, Any] | dict[str, Any]) -> str: + return str(cluster.get("action") or "").strip() + + +def infer_cluster_action_type( + cluster: MutableMapping[str, Any] | dict[str, Any], + *, + detector: str = "", +) -> str: + """Return the canonical action type for a cluster.""" + explicit = str(cluster.get("action_type") or "").strip() + if explicit in VALID_ACTION_TYPES: + return explicit + + action = _action_text(cluster) + if action.startswith("desloppify autofix ") and "--dry-run" in action: + return ACTION_TYPE_AUTO_FIX + if action == "desloppify move": + return ACTION_TYPE_REORGANIZE + + meta = DETECTORS.get(detector) + if meta is not None: + # Legacy safeguard: a detector may be auto-fixable in principle, but + # if the stored action is not an autofix command, keep cluster handling + # conservative and render it as refactor work. + if meta.action_type == ACTION_TYPE_AUTO_FIX and action and ( + not action.startswith("desloppify autofix ") + or "--dry-run" not in action + ): + return ACTION_TYPE_REFACTOR + if meta.action_type in VALID_ACTION_TYPES: + return meta.action_type + + return ACTION_TYPE_MANUAL_FIX + + +def infer_cluster_execution_policy( + cluster: MutableMapping[str, Any] | dict[str, Any], + *, + detector: str = "", +) -> str: + """Return how a cluster is allowed to surface in the execution queue.""" + explicit = str(cluster.get("execution_policy") or "").strip() + if explicit in VALID_EXECUTION_POLICIES: + return explicit + if ( + cluster.get("auto") + and infer_cluster_action_type(cluster, detector=detector) == ACTION_TYPE_AUTO_FIX + ): + return EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE + return EXECUTION_POLICY_PLANNED_ONLY + + +def normalize_cluster_semantics( + cluster: MutableMapping[str, Any], + *, + detector: str = "", +) -> bool: + """Populate canonical semantic fields and report whether anything changed.""" + explicit_action_type = str(cluster.get("action_type") or "").strip() + explicit_execution_policy = str(cluster.get("execution_policy") or "").strip() + if ( + explicit_action_type not in VALID_ACTION_TYPES + and explicit_execution_policy not in VALID_EXECUTION_POLICIES + and cluster.get("auto") + and not detector + ): + action = _action_text(cluster) + if action != "desloppify move" and not ( + action.startswith("desloppify autofix ") and "--dry-run" in action + ): + return False + + action_type = infer_cluster_action_type(cluster, detector=detector) + execution_policy = infer_cluster_execution_policy(cluster, detector=detector) + changed = False + if cluster.get("action_type") != action_type: + cluster["action_type"] = action_type + changed = True + if cluster.get("execution_policy") != execution_policy: + cluster["execution_policy"] = execution_policy + changed = True + return changed + + +def cluster_allows_ephemeral_execution( + cluster: MutableMapping[str, Any] | dict[str, Any], + *, + detector: str = "", +) -> bool: + return bool(cluster.get("auto")) and ( + infer_cluster_execution_policy(cluster, detector=detector) + == EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE + ) + + +def cluster_autofix_hint( + cluster: MutableMapping[str, Any] | dict[str, Any], + *, + detector: str = "", +) -> str | None: + """Return the autofix command to suggest for a cluster when semantically valid.""" + if infer_cluster_action_type(cluster, detector=detector) != ACTION_TYPE_AUTO_FIX: + return None + action = _action_text(cluster) + return action or None + + +__all__ = [ + "ACTION_TYPE_AUTO_FIX", + "ACTION_TYPE_MANUAL_FIX", + "ACTION_TYPE_REFACTOR", + "ACTION_TYPE_REORGANIZE", + "EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE", + "EXECUTION_POLICY_PLANNED_ONLY", + "cluster_allows_ephemeral_execution", + "cluster_autofix_hint", + "infer_cluster_action_type", + "infer_cluster_execution_policy", + "normalize_cluster_semantics", +] diff --git a/desloppify/engine/_plan/cluster_strategy.py b/desloppify/engine/_plan/cluster_strategy.py index 09a86e5c..baae1ac3 100644 --- a/desloppify/engine/_plan/cluster_strategy.py +++ b/desloppify/engine/_plan/cluster_strategy.py @@ -6,7 +6,7 @@ from desloppify.engine._plan.constants import AUTO_PREFIX from desloppify.engine._state.issue_semantics import ( is_review_finding, - is_review_request, + is_assessment_request, ) @@ -21,7 +21,7 @@ def grouping_key(issue: dict, meta: DetectorMeta | None) -> str | None: if meta is None: return f"detector::{detector}" - if is_review_finding(issue) or is_review_request(issue): + if is_review_finding(issue) or is_assessment_request(issue): detail = issue.get("detail") or {} dimension = detail.get("dimension", "") if dimension: @@ -58,7 +58,7 @@ def generate_description( count = len(members) detector = members[0].get("detector", "") if members else "" - if is_review_finding(members[0]) or is_review_request(members[0]): + if is_review_finding(members[0]) or is_assessment_request(members[0]): detail = (members[0].get("detail") or {}) if members else {} dimension = detail.get("dimension", detector) return f"Address {count} {dimension} review issues" diff --git a/desloppify/engine/_plan/constants.py b/desloppify/engine/_plan/constants.py index 4c1c45c3..77fd90cc 100644 --- a/desloppify/engine/_plan/constants.py +++ b/desloppify/engine/_plan/constants.py @@ -55,6 +55,21 @@ SYNTHETIC_PREFIXES = ("triage::", "workflow::", "subjective::") +def is_synthetic_id(issue_id: str) -> bool: + """Return True when a raw plan ID refers to synthetic queue work.""" + return any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + + +def is_workflow_id(issue_id: str) -> bool: + """Return True when a raw plan ID is a workflow synthetic.""" + return issue_id.startswith(WORKFLOW_PREFIX) + + +def is_triage_id(issue_id: str) -> bool: + """Return True when a raw plan ID is a triage synthetic.""" + return issue_id.startswith(TRIAGE_PREFIX) + + @dataclass class QueueSyncResult: """Unified result for all queue sync operations.""" @@ -134,6 +149,9 @@ def normalize_queue_workflow_and_triage_prefix(queue_order: list[str]) -> None: "QueueSyncResult", "normalize_queue_workflow_and_triage_prefix", "confirmed_triage_stage_names", + "is_synthetic_id", + "is_triage_id", + "is_workflow_id", "recorded_unconfirmed_triage_stage_names", "SUBJECTIVE_PREFIX", "SYNTHETIC_PREFIXES", diff --git a/desloppify/engine/_plan/operations/cluster.py b/desloppify/engine/_plan/operations/cluster.py index e624b439..34578dc6 100644 --- a/desloppify/engine/_plan/operations/cluster.py +++ b/desloppify/engine/_plan/operations/cluster.py @@ -2,6 +2,10 @@ from __future__ import annotations +from desloppify.engine._plan.cluster_semantics import ( + ACTION_TYPE_MANUAL_FIX, + EXECUTION_POLICY_PLANNED_ONLY, +) from desloppify.engine._plan.operations.lifecycle import clear_focus_if_cluster_empty from desloppify.engine._plan.operations.queue import move_items from desloppify.engine._plan.schema import Cluster, PlanModel, ensure_plan_defaults @@ -79,6 +83,8 @@ def create_cluster( "auto": False, "cluster_key": "", "action": action, + "action_type": ACTION_TYPE_MANUAL_FIX, + "execution_policy": EXECUTION_POLICY_PLANNED_ONLY, "user_modified": False, } plan["clusters"][name] = cluster diff --git a/desloppify/engine/_plan/refresh_lifecycle.py b/desloppify/engine/_plan/refresh_lifecycle.py index ca947c9f..4e982663 100644 --- a/desloppify/engine/_plan/refresh_lifecycle.py +++ b/desloppify/engine/_plan/refresh_lifecycle.py @@ -12,6 +12,7 @@ from desloppify.engine._plan.constants import SYNTHETIC_PREFIXES from desloppify.engine._plan.schema import PlanModel, ensure_plan_defaults +from desloppify.engine._state.issue_semantics import counts_toward_objective_backlog _POSTFLIGHT_SCAN_KEY = "postflight_scan_completed_at_scan_count" _LIFECYCLE_PHASE_KEY = "lifecycle_phase" @@ -45,6 +46,38 @@ def _is_real_queue_issue(issue_id: str) -> bool: return not any(str(issue_id).startswith(prefix) for prefix in SYNTHETIC_PREFIXES) +def _touches_objective_issue( + *, + issue_ids: Iterable[str] | None, + state: dict[str, object] | None, +) -> bool: + if issue_ids is None: + return True + + real_issue_ids = [ + issue_id + for issue_id in issue_ids + if _is_real_queue_issue(str(issue_id)) + ] + if not real_issue_ids: + return False + if not isinstance(state, dict): + return True + + issues = state.get("work_items") or state.get("issues", {}) + if not isinstance(issues, dict): + return True + + objective_seen = False + for issue_id in real_issue_ids: + issue = issues.get(issue_id) + if not isinstance(issue, dict): + return True + if counts_toward_objective_backlog(issue): + objective_seen = True + return objective_seen + + def current_lifecycle_phase(plan: PlanModel) -> str | None: """Return the persisted lifecycle phase, falling back for legacy plans.""" refresh_state = plan.get("refresh_state") @@ -151,11 +184,10 @@ def clear_postflight_scan_completion( plan: PlanModel, *, issue_ids: Iterable[str] | None = None, + state: dict[str, object] | None = None, ) -> bool: - """Require a fresh scan after queue-changing work on real issues.""" - if issue_ids is not None and not any( - _is_real_queue_issue(issue_id) for issue_id in issue_ids - ): + """Require a fresh scan after queue-changing work on objective issues.""" + if not _touches_objective_issue(issue_ids=issue_ids, state=state): return False refresh_state = _refresh_state(plan) if _POSTFLIGHT_SCAN_KEY not in refresh_state: diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 15c71812..017778a9 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -56,6 +56,8 @@ class Cluster(TypedDict, total=False): auto: bool # True for auto-generated clusters cluster_key: str # Deterministic grouping key (for regeneration) action: str | None # Primary resolution command/guidance text + action_type: str + execution_policy: str user_modified: bool # True when user manually edits membership optional: bool thesis: str @@ -345,6 +347,7 @@ def executable_objective_ids( if issue_id not in skipped_ids and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) } + queued_objective_ids = all_objective_ids & queued_ids has_active_plan_structure = bool( plan.get("queue_order") or plan.get("clusters") or plan.get("overrides") ) @@ -352,8 +355,8 @@ def executable_objective_ids( return set(all_objective_ids) - skipped_ids if not tracked_objective_ids: return set(all_objective_ids) - skipped_ids - if queued_ids: - return all_objective_ids & queued_ids + if queued_objective_ids: + return queued_objective_ids if not has_active_plan_structure: return set(all_objective_ids) - skipped_ids return set() diff --git a/desloppify/engine/_plan/schema/normalize.py b/desloppify/engine/_plan/schema/normalize.py index 4753a8b9..17cd9399 100644 --- a/desloppify/engine/_plan/schema/normalize.py +++ b/desloppify/engine/_plan/schema/normalize.py @@ -5,6 +5,8 @@ import re from typing import Any +from desloppify.engine._plan.cluster_semantics import normalize_cluster_semantics + _HEX_SUFFIX_RE = re.compile(r"^[0-9a-f]{8}$") @@ -206,6 +208,7 @@ def normalize_cluster_defaults(plan: dict[str, Any]) -> None: cluster.setdefault("cluster_key", "") cluster.setdefault("action", None) cluster.setdefault("user_modified", False) + normalize_cluster_semantics(cluster) def _append_normalized_issue_id( diff --git a/desloppify/engine/_plan/sync/dimensions.py b/desloppify/engine/_plan/sync/dimensions.py index b7c71039..37535175 100644 --- a/desloppify/engine/_plan/sync/dimensions.py +++ b/desloppify/engine/_plan/sync/dimensions.py @@ -18,7 +18,12 @@ from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE from desloppify.engine._plan.policy import stale as stale_policy_mod -from desloppify.engine._plan.constants import SUBJECTIVE_PREFIX, QueueSyncResult +from desloppify.engine._plan.constants import ( + SUBJECTIVE_PREFIX, + QueueSyncResult, + is_triage_id, + is_workflow_id, +) from desloppify.engine._plan.schema import PlanModel, ensure_plan_defaults from desloppify.engine._plan.policy.subjective import SubjectiveVisibility from desloppify.engine._state.schema import StateModel @@ -167,9 +172,7 @@ def _promote_subjective_ids(order: list[str], ids: list[str]) -> int: insert_at = 0 while insert_at < len(order): current = str(order[insert_at]) - if not ( - current.startswith("workflow::") or current.startswith("triage::") - ): + if not (is_workflow_id(current) or is_triage_id(current)): break insert_at += 1 diff --git a/desloppify/engine/_plan/triage/prompt.py b/desloppify/engine/_plan/triage/prompt.py index 31f04966..2774d92a 100644 --- a/desloppify/engine/_plan/triage/prompt.py +++ b/desloppify/engine/_plan/triage/prompt.py @@ -5,6 +5,7 @@ from dataclasses import dataclass, field from typing import Any +from desloppify.engine._plan.cluster_semantics import cluster_autofix_hint from desloppify.engine._plan.schema import ( Cluster, EPIC_PREFIX, @@ -526,8 +527,7 @@ def _append_mechanical_backlog_section( def _cluster_autofix_hint(cluster: dict[str, Any]) -> str: - action = str(cluster.get("action", "")) - return action if "desloppify autofix" in action else "" + return cluster_autofix_hint(cluster) or "" def _cluster_backlog_summary(name: str, cluster: dict[str, Any], member_count: int) -> str: diff --git a/desloppify/engine/_plan/triage/snapshot.py b/desloppify/engine/_plan/triage/snapshot.py index c5dba950..2a307bfb 100644 --- a/desloppify/engine/_plan/triage/snapshot.py +++ b/desloppify/engine/_plan/triage/snapshot.py @@ -4,7 +4,7 @@ from dataclasses import dataclass -from desloppify.engine._plan.constants import TRIAGE_IDS +from desloppify.engine._plan.constants import TRIAGE_IDS, is_synthetic_id from desloppify.engine._plan.policy.stale import open_review_ids from desloppify.engine._plan.triage.playbook import TriageProgress, compute_triage_progress from desloppify.engine._state.schema import StateModel @@ -58,8 +58,7 @@ def plan_review_ids(plan: dict) -> list[str]: issue_id for issue_id in plan.get("queue_order", []) if isinstance(issue_id, str) - and not issue_id.startswith("triage::") - and not issue_id.startswith("workflow::") + and not is_synthetic_id(issue_id) and (issue_id.startswith("review::") or issue_id.startswith("concerns::")) ] diff --git a/desloppify/engine/_state/filtering.py b/desloppify/engine/_state/filtering.py index 3a164d47..c1a4bc7b 100644 --- a/desloppify/engine/_state/filtering.py +++ b/desloppify/engine/_state/filtering.py @@ -17,7 +17,7 @@ ] from desloppify.base.discovery.file_paths import rel -from desloppify.engine._state.issue_semantics import ensure_issue_semantics +from desloppify.engine._state.issue_semantics import ensure_work_item_semantics from desloppify.engine._state.schema import ( Issue, StateModel, @@ -175,7 +175,7 @@ def make_issue( "resolved_at": None, "reopen_count": 0, } - ensure_issue_semantics(issue) + ensure_work_item_semantics(issue) return issue diff --git a/desloppify/engine/_state/issue_semantics.py b/desloppify/engine/_state/issue_semantics.py index 527afa35..1da50dba 100644 --- a/desloppify/engine/_state/issue_semantics.py +++ b/desloppify/engine/_state/issue_semantics.py @@ -39,16 +39,6 @@ } ) -# Legacy semantic aliases kept for compatibility while the repo moves to the -# work-item terminology. -MECHANICAL_FINDING = MECHANICAL_DEFECT -REVIEW_FINDING = REVIEW_DEFECT -CONCERN_FINDING = REVIEW_CONCERN -REVIEW_REQUEST = ASSESSMENT_REQUEST -SYNTHETIC_REQUEST_ORIGIN = SYNTHETIC_TASK_ORIGIN -ISSUE_KINDS = WORK_ITEM_KINDS -ISSUE_ORIGINS = WORK_ITEM_ORIGINS - _LEGACY_KIND_ALIASES: dict[str, str] = { "mechanical_finding": MECHANICAL_DEFECT, "review_finding": REVIEW_DEFECT, @@ -115,24 +105,6 @@ def infer_work_item_origin( return SCAN_ORIGIN -def infer_issue_kind( - detector: object, - *, - detail: Mapping[str, Any] | None = None, -) -> WorkItemKind: - """Backward-compatible alias for canonical work-item kind inference.""" - return infer_work_item_kind(detector, detail=detail) - - -def infer_issue_origin( - detector: object, - *, - detail: Mapping[str, Any] | None = None, -) -> WorkItemOrigin: - """Backward-compatible alias for canonical work-item origin inference.""" - return infer_work_item_origin(detector, detail=detail) - - def normalized_work_item_kind(issue: Mapping[str, Any]) -> WorkItemKind: """Return the canonical work-item kind, inferring from legacy data when needed.""" raw_kind = str( @@ -145,11 +117,6 @@ def normalized_work_item_kind(issue: Mapping[str, Any]) -> WorkItemKind: return infer_work_item_kind(issue.get("detector", ""), detail=_detail_dict(issue)) -def normalized_issue_kind(issue: Mapping[str, Any]) -> WorkItemKind: - """Backward-compatible alias for canonical work-item kind normalization.""" - return normalized_work_item_kind(issue) - - def normalized_work_item_origin(issue: Mapping[str, Any]) -> WorkItemOrigin: """Return the canonical work-item origin, inferring from legacy data when needed.""" raw_origin = str(issue.get("origin", "")).strip() @@ -160,17 +127,12 @@ def normalized_work_item_origin(issue: Mapping[str, Any]) -> WorkItemOrigin: return infer_work_item_origin(issue.get("detector", ""), detail=_detail_dict(issue)) -def normalized_issue_origin(issue: Mapping[str, Any]) -> WorkItemOrigin: - """Backward-compatible alias for canonical work-item origin normalization.""" - return normalized_work_item_origin(issue) - - -def ensure_issue_semantics(issue: dict[str, Any]) -> None: +def ensure_work_item_semantics(issue: dict[str, Any]) -> None: """Populate canonical semantic fields in-place. Both ``work_item_kind`` and legacy ``issue_kind`` are written so current - in-repo callers can migrate incrementally while persisted state moves - toward the work-item terminology. + persisted data and old state files remain readable while canonical runtime + semantics use the work-item terminology. """ kind = normalized_work_item_kind(issue) origin = normalized_work_item_origin(issue) @@ -179,11 +141,6 @@ def ensure_issue_semantics(issue: dict[str, Any]) -> None: issue["origin"] = origin -def ensure_work_item_semantics(issue: dict[str, Any]) -> None: - """Preferred name for semantic normalization.""" - ensure_issue_semantics(issue) - - def is_defect_work_item(issue: Mapping[str, Any]) -> bool: return normalized_work_item_kind(issue) in { MECHANICAL_DEFECT, @@ -216,10 +173,6 @@ def is_assessment_request(issue: Mapping[str, Any]) -> bool: return normalized_work_item_kind(issue) == ASSESSMENT_REQUEST -def is_review_request(issue: Mapping[str, Any]) -> bool: - return is_assessment_request(issue) - - def is_non_objective_issue(issue: Mapping[str, Any]) -> bool: return not is_objective_finding(issue) @@ -244,27 +197,17 @@ def _detail_dict(issue: Mapping[str, Any]) -> Mapping[str, Any]: __all__ = [ "ASSESSMENT_REQUEST", - "CONCERN_FINDING", - "ISSUE_KINDS", - "ISSUE_ORIGINS", "MECHANICAL_DEFECT", - "MECHANICAL_FINDING", "REVIEW_CONCERN", "REVIEW_DEFECT", - "REVIEW_FINDING", "REVIEW_IMPORT_ORIGIN", - "REVIEW_REQUEST", "SCAN_ORIGIN", "SCORING_EXCLUDED_DETECTORS", "SYNTHETIC_TASK_ORIGIN", - "SYNTHETIC_REQUEST_ORIGIN", "counts_toward_objective_backlog", "ensure_work_item_semantics", - "ensure_issue_semantics", "infer_work_item_kind", "infer_work_item_origin", - "infer_issue_kind", - "infer_issue_origin", "is_assessment_request", "is_concern_finding", "is_defect_work_item", @@ -272,14 +215,11 @@ def _detail_dict(issue: Mapping[str, Any]) -> Mapping[str, Any]: "is_non_objective_issue", "is_objective_finding", "is_review_finding", - "is_review_request", "is_review_work_item", "is_scoring_excluded_detector", "is_triage_finding", "normalized_work_item_kind", "normalized_work_item_origin", - "normalized_issue_kind", - "normalized_issue_origin", "WORK_ITEM_KINDS", "WORK_ITEM_ORIGINS", ] diff --git a/desloppify/engine/_state/merge.py b/desloppify/engine/_state/merge.py index fb381c67..614c09df 100644 --- a/desloppify/engine/_state/merge.py +++ b/desloppify/engine/_state/merge.py @@ -11,7 +11,7 @@ ] from desloppify.base.registry import DETECTORS -from desloppify.engine._state.issue_semantics import ensure_issue_semantics +from desloppify.engine._state.issue_semantics import ensure_work_item_semantics from desloppify.engine._state.merge_history import ( _append_scan_history, _build_merge_diff, @@ -113,7 +113,7 @@ def merge_scan( ensure_state_defaults(state) for issue in current_issues: if isinstance(issue, dict): - ensure_issue_semantics(issue) + ensure_work_item_semantics(issue) resolved_options = options or MergeScanOptions() now = utc_now() diff --git a/desloppify/engine/_state/merge_issues.py b/desloppify/engine/_state/merge_issues.py index 5459250c..a0c6faac 100644 --- a/desloppify/engine/_state/merge_issues.py +++ b/desloppify/engine/_state/merge_issues.py @@ -6,7 +6,7 @@ from desloppify.engine._state.filtering import matched_ignore_pattern from desloppify.engine._state.issue_semantics import ( is_import_only_issue, - is_review_request, + is_assessment_request, ) @@ -221,7 +221,7 @@ def upsert_issues( # completed by an agent import, skip reopening to avoid a # resolve-then-reopen loop on the same scan cycle. if ( - is_review_request(previous) + is_assessment_request(previous) and previous["status"] in {"fixed", "auto_resolved"} and (previous.get("resolution_attestation") or {}).get("kind") == "agent_import" ): diff --git a/desloppify/engine/_state/recovery.py b/desloppify/engine/_state/recovery.py index 62871840..9108e4a7 100644 --- a/desloppify/engine/_state/recovery.py +++ b/desloppify/engine/_state/recovery.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.engine._state.issue_semantics import ensure_issue_semantics +from desloppify.engine._state.issue_semantics import ensure_work_item_semantics from desloppify.engine._state.schema import ensure_state_defaults, scan_source @@ -115,7 +115,7 @@ def _hydrate_saved_issue_ids( "recovered_from_plan": True, }, } - ensure_issue_semantics(recovered_issues[issue_id]) + ensure_work_item_semantics(recovered_issues[issue_id]) recovered["work_items"] = recovered_issues recovered["issues"] = recovered_issues diff --git a/desloppify/engine/_state/schema.py b/desloppify/engine/_state/schema.py index 875aea9f..05d13afc 100644 --- a/desloppify/engine/_state/schema.py +++ b/desloppify/engine/_state/schema.py @@ -9,7 +9,7 @@ from desloppify.base.discovery.paths import get_project_root from desloppify.base.enums import Status, canonical_issue_status, issue_status_tokens from desloppify.engine._state.issue_semantics import ( - ensure_issue_semantics, + ensure_work_item_semantics, WORK_ITEM_KINDS, WORK_ITEM_ORIGINS, ) @@ -222,7 +222,7 @@ def ensure_state_defaults(state: StateModel | dict) -> None: issue.setdefault("id", issue_id) issue.setdefault("detector", "unknown") - ensure_issue_semantics(issue) + ensure_work_item_semantics(issue) issue.setdefault("file", "") issue.setdefault("tier", 3) issue.setdefault("confidence", "low") diff --git a/desloppify/engine/_work_queue/helpers.py b/desloppify/engine/_work_queue/helpers.py index a8863e85..46de3f0c 100644 --- a/desloppify/engine/_work_queue/helpers.py +++ b/desloppify/engine/_work_queue/helpers.py @@ -8,9 +8,11 @@ from desloppify.base.enums import issue_status_tokens from desloppify.base.registry import DETECTORS +from desloppify.engine._plan.cluster_semantics import ACTION_TYPE_AUTO_FIX +from desloppify.engine._plan.constants import is_triage_id from desloppify.engine._state.issue_semantics import ( is_review_finding, - is_review_request, + is_assessment_request, ) from desloppify.engine._state.schema import StateModel from desloppify.engine._work_queue.types import WorkQueueItem @@ -34,7 +36,7 @@ def status_matches(item_status: str, status_filter: str) -> bool: def is_subjective_issue(item: WorkQueueItem | dict[str, Any]) -> bool: - return is_review_request(item) + return is_assessment_request(item) def is_review_issue(item: WorkQueueItem | dict[str, Any]) -> bool: @@ -53,6 +55,15 @@ def is_subjective_queue_item(item: WorkQueueItem | dict[str, Any]) -> bool: return False +def is_auto_fix_item(item: WorkQueueItem | dict[str, Any]) -> bool: + """Return True when a queue item semantically represents auto-fix work.""" + action_type = str(item.get("action_type") or "").strip() + if action_type: + return action_type == ACTION_TYPE_AUTO_FIX + command = str(item.get("primary_command") or "").strip() + return command.startswith("desloppify autofix ") and "--dry-run" in command + + def review_issue_weight(item: WorkQueueItem | dict[str, Any]) -> float: """Return review issue weight aligned with issues list ordering.""" confidence = str(item.get("confidence", "low")).lower() @@ -118,7 +129,7 @@ def workflow_stage_name(item: WorkQueueItem | dict[str, Any]) -> str: return stage_name item_id = str(item.get("id", "")).strip() - if item_id.startswith("triage::"): + if is_triage_id(item_id): return item_id.split("::", 1)[1] return "" @@ -161,7 +172,7 @@ def primary_command_for_issue( ] if available_fixers: return f"desloppify autofix {available_fixers[0]} --dry-run" - if is_review_request(item): + if is_assessment_request(item): dim_key = (item.get("detail") or {}).get("dimension", "") if dim_key: return f"desloppify review --prepare --dimensions {dim_key}" @@ -173,6 +184,7 @@ def primary_command_for_issue( "ALL_STATUSES", "ATTEST_EXAMPLE", "detail_dict", + "is_auto_fix_item", "is_review_issue", "is_subjective_issue", "is_subjective_queue_item", diff --git a/desloppify/engine/_work_queue/plan_order.py b/desloppify/engine/_work_queue/plan_order.py index 45505674..d355fe20 100644 --- a/desloppify/engine/_work_queue/plan_order.py +++ b/desloppify/engine/_work_queue/plan_order.py @@ -4,7 +4,11 @@ from typing import Any -from desloppify.base.registry import DETECTORS +from desloppify.engine._plan.cluster_semantics import ( + cluster_autofix_hint, + infer_cluster_action_type, + infer_cluster_execution_policy, +) from desloppify.engine.plan_ops import ( get_issue_description, get_issue_note, @@ -141,28 +145,12 @@ def stamp_positions(items: list[WorkQueueItem], plan: dict) -> None: item["plan_skip_reason"] = skip_reason -def action_type_for_detector(detector: str) -> str: - """Look up the action_type for a detector from the registry.""" - meta = DETECTORS.get(detector) - if meta: - return meta.action_type - return "manual_fix" - - def _build_cluster_meta( cluster_name: str, members: list[WorkQueueItem], cluster_data: dict[str, Any] ) -> WorkQueueItem: """Build a cluster meta-item from its member items.""" detector = members[0].get("detector", "") if members else "" - action = cluster_data.get("action") or "" - if "desloppify autofix" in action: - action_type = "auto_fix" - elif "desloppify move" in action: - action_type = "reorganize" - else: - action_type = action_type_for_detector(detector) - if action_type == "auto_fix" and "desloppify autofix" not in action: - action_type = "refactor" + action_type = infer_cluster_action_type(cluster_data, detector=detector) stored_desc = cluster_data.get("description") or "" total_in_cluster = len(_cluster_issue_ids(cluster_data)) @@ -172,12 +160,11 @@ def _build_cluster_meta( summary = stored_desc or f"{len(members)} issues" action = cluster_data.get("action") or "" - if "desloppify autofix" in action: + autofix_hint = cluster_autofix_hint(cluster_data, detector=detector) + if autofix_hint: primary_command = f"desloppify next --cluster {cluster_name} --count 10" - autofix_hint = action else: primary_command = action or f"desloppify next --cluster {cluster_name} --count 10" - autofix_hint = None estimated_impact = max( (m.get("estimated_impact", 0.0) for m in members), default=0.0 @@ -195,6 +182,10 @@ def _build_cluster_meta( "cluster_name": cluster_name, "cluster_auto": bool(cluster_data.get("auto")), "cluster_optional": bool(cluster_data.get("optional")), + "execution_policy": infer_cluster_execution_policy( + cluster_data, + detector=detector, + ), "confidence": "high", "detector": detector, "file": "", diff --git a/desloppify/engine/_work_queue/ranking.py b/desloppify/engine/_work_queue/ranking.py index 971c71f6..5030fda1 100644 --- a/desloppify/engine/_work_queue/ranking.py +++ b/desloppify/engine/_work_queue/ranking.py @@ -155,6 +155,7 @@ def build_issue_items( item = cast(WorkQueueItem, dict(issue)) item["id"] = issue_id item["kind"] = "issue" + item["action_type"] = meta.action_type if meta is not None else "manual_fix" item["is_review"] = is_review_issue(item) item["is_subjective"] = is_subjective_issue(item) item["review_weight"] = ( diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index 0024480b..2e55e970 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -7,6 +7,9 @@ from typing import Any from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE +from desloppify.engine._plan.cluster_semantics import ( + cluster_allows_ephemeral_execution, +) from desloppify.engine._plan.constants import ( WORKFLOW_DEFERRED_DISPOSITION_ID, WORKFLOW_RUN_SCAN_ID, @@ -19,7 +22,7 @@ from desloppify.engine._state.filtering import path_scoped_issues from desloppify.engine._state.issue_semantics import ( counts_toward_objective_backlog, - is_review_request, + is_assessment_request, is_triage_finding, ) from desloppify.engine._state.schema import StateModel @@ -41,6 +44,7 @@ PHASE_REVIEW_INITIAL = "review_initial" PHASE_EXECUTE = "execute" PHASE_SCAN = "scan" +PHASE_ASSESSMENT_POSTFLIGHT = "assessment_postflight" PHASE_REVIEW_POSTFLIGHT = "review_postflight" PHASE_WORKFLOW_POSTFLIGHT = "workflow_postflight" PHASE_TRIAGE_POSTFLIGHT = "triage_postflight" @@ -53,6 +57,7 @@ class QueueSnapshot: phase: str all_objective_items: tuple[WorkQueueItem, ...] all_initial_review_items: tuple[WorkQueueItem, ...] + all_postflight_assessment_items: tuple[WorkQueueItem, ...] all_postflight_review_items: tuple[WorkQueueItem, ...] all_scan_items: tuple[WorkQueueItem, ...] all_postflight_workflow_items: tuple[WorkQueueItem, ...] @@ -64,6 +69,7 @@ class QueueSnapshot: objective_execution_count: int objective_backlog_count: int subjective_initial_count: int + assessment_postflight_count: int subjective_postflight_count: int workflow_postflight_count: int triage_pending_count: int @@ -107,10 +113,10 @@ def _review_issue_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueItem]: ] -def _review_request_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueItem]: +def _assessment_request_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueItem]: return [ item for item in items - if is_review_request(item) + if is_assessment_request(item) ] @@ -121,10 +127,9 @@ def _auto_promoted_autofix_ids(plan: dict | None) -> set[str]: autofix_ids: set[str] = set() skipped_ids = set(plan.get("skipped", {}).keys()) for cluster in plan.get("clusters", {}).values(): - if not isinstance(cluster, dict) or not cluster.get("auto"): + if not isinstance(cluster, dict): continue - action = str(cluster.get("action", "")) - if "desloppify autofix" not in action: + if not cluster_allows_ephemeral_execution(cluster): continue for issue_id in cluster.get("issue_ids", []): if isinstance(issue_id, str) and issue_id and issue_id not in skipped_ids: @@ -132,6 +137,51 @@ def _auto_promoted_autofix_ids(plan: dict | None) -> set[str]: return autofix_ids +def _merge_execution_candidates( + *, + all_issue_items: list[WorkQueueItem], + explicit_objective_items: list[WorkQueueItem], + plan: dict | None, + skipped_ids: set[str], + review_issue_ids: set[str], + executable_review_ids: set[str], + assessment_request_ids: set[str], +) -> tuple[list[WorkQueueItem], list[WorkQueueItem]]: + """Merge plan-anchored and auto-promoted execution candidates.""" + explicit_queue_ids = { + str(issue_id) + for issue_id in (plan or {}).get("queue_order", []) + if isinstance(issue_id, str) and issue_id + } - skipped_ids + auto_promoted_ids = _auto_promoted_autofix_ids(plan) + explicit_queue_ids |= auto_promoted_ids + + queued_non_review_items = [ + item + for item in all_issue_items + if item.get("id", "") in explicit_queue_ids + and item.get("id", "") not in assessment_request_ids + and item.get("id", "") not in review_issue_ids + ] + + execution_candidates: list[WorkQueueItem] = [] + seen_execution_ids: set[str] = set() + for item in [*explicit_objective_items, *queued_non_review_items]: + item_id = str(item.get("id", "")) + if not item_id or item_id in seen_execution_ids: + continue + seen_execution_ids.add(item_id) + execution_candidates.append(item) + + anchored_execution_ids = (_tracked_plan_ids(plan) | auto_promoted_ids) - skipped_ids + anchored_execution_items = [ + item + for item in execution_candidates + if item.get("id", "") in anchored_execution_ids + ] + return execution_candidates, anchored_execution_items + + def _executable_review_issue_items( plan: dict | None, state: StateModel, @@ -198,6 +248,7 @@ def _phase_for_snapshot( anchored_execution_items: list[WorkQueueItem], explicit_queue_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], + postflight_assessment_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], postflight_workflow_items: list[WorkQueueItem], triage_items: list[WorkQueueItem], @@ -212,6 +263,8 @@ def _phase_for_snapshot( return PHASE_EXECUTE if postflight_review_items: return PHASE_REVIEW_POSTFLIGHT + if postflight_assessment_items: + return PHASE_ASSESSMENT_POSTFLIGHT if postflight_workflow_items: return PHASE_WORKFLOW_POSTFLIGHT if triage_items: @@ -225,6 +278,7 @@ def _execution_items_for_phase( explicit_queue_items: list[WorkQueueItem], initial_review_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], + postflight_assessment_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], postflight_workflow_items: list[WorkQueueItem], triage_items: list[WorkQueueItem], @@ -244,6 +298,8 @@ def _execution_items_for_phase( item for item in scan_items if item.get("id") == WORKFLOW_RUN_SCAN_ID ] + if phase == PHASE_ASSESSMENT_POSTFLIGHT: + return postflight_assessment_items if phase == PHASE_REVIEW_POSTFLIGHT: return postflight_review_items if phase == PHASE_WORKFLOW_POSTFLIGHT: @@ -291,7 +347,7 @@ def build_queue_snapshot( if item.get("id", "") in executable_objective_ids ] review_issue_items = _review_issue_items(all_issue_items) - review_request_items = _review_request_items(all_issue_items) + assessment_request_items = _assessment_request_items(all_issue_items) executable_review_items = _executable_review_issue_items( effective_plan, state, @@ -299,45 +355,26 @@ def build_queue_snapshot( ) review_issue_ids = {item.get("id", "") for item in review_issue_items} executable_review_ids = {item.get("id", "") for item in executable_review_items} - review_request_ids = {item.get("id", "") for item in review_request_items} - explicit_queue_ids = { - str(issue_id) - for issue_id in (effective_plan or {}).get("queue_order", []) - if isinstance(issue_id, str) and issue_id - } - skipped_ids - auto_promoted_ids = _auto_promoted_autofix_ids(effective_plan) - explicit_queue_ids |= auto_promoted_ids - queued_extra_items = [ - item for item in all_issue_items - if item.get("id", "") in explicit_queue_ids - and ( - item.get("id", "") not in review_issue_ids - or item.get("id", "") in executable_review_ids - ) - and item.get("id", "") not in review_issue_ids - and item.get("id", "") not in review_request_ids - ] - explicit_queue_items: list[WorkQueueItem] = [] - seen_execution_ids: set[str] = set() - for item in [*explicit_objective_items, *queued_extra_items]: - item_id = str(item.get("id", "")) - if not item_id or item_id in seen_execution_ids: - continue - seen_execution_ids.add(item_id) - explicit_queue_items.append(item) - anchored_execution_ids = (_tracked_plan_ids(effective_plan) | auto_promoted_ids) - skipped_ids - anchored_execution_items = [ - item for item in explicit_queue_items - if item.get("id", "") in anchored_execution_ids - ] + assessment_request_ids = {item.get("id", "") for item in assessment_request_items} + explicit_queue_items, anchored_execution_items = _merge_execution_candidates( + all_issue_items=all_issue_items, + explicit_objective_items=explicit_objective_items, + plan=effective_plan, + skipped_ids=skipped_ids, + review_issue_ids=review_issue_ids, + executable_review_ids=executable_review_ids, + assessment_request_ids=assessment_request_ids, + ) initial_review_items, subjective_postflight_items = _subjective_partitions( state, scoped_issues=scoped_issues, threshold=target_strict, ) - postflight_review_items = [ + postflight_assessment_items = [ *subjective_postflight_items, - *review_request_items, + *assessment_request_items, + ] + postflight_review_items = [ *executable_review_items, ] scan_items, postflight_workflow_items, triage_items = _workflow_partitions( @@ -352,6 +389,7 @@ def build_queue_snapshot( anchored_execution_items=anchored_execution_items, explicit_queue_items=explicit_queue_items, scan_items=scan_items, + postflight_assessment_items=postflight_assessment_items, postflight_review_items=postflight_review_items, postflight_workflow_items=postflight_workflow_items, triage_items=triage_items, @@ -361,6 +399,7 @@ def build_queue_snapshot( explicit_queue_items=explicit_queue_items, initial_review_items=initial_review_items, scan_items=scan_items, + postflight_assessment_items=postflight_assessment_items, postflight_review_items=postflight_review_items, postflight_workflow_items=postflight_workflow_items, triage_items=triage_items, @@ -372,8 +411,7 @@ def build_queue_snapshot( [ *objective_items, *initial_review_items, - *subjective_postflight_items, - *review_request_items, + *postflight_assessment_items, *review_issue_items, *scan_items, *postflight_workflow_items, @@ -391,6 +429,7 @@ def build_queue_snapshot( phase=phase, all_objective_items=tuple(objective_items), all_initial_review_items=tuple(initial_review_items), + all_postflight_assessment_items=tuple(postflight_assessment_items), all_postflight_review_items=tuple(postflight_review_items), all_scan_items=tuple(scan_items), all_postflight_workflow_items=tuple(postflight_workflow_items), @@ -407,7 +446,8 @@ def build_queue_snapshot( ), objective_backlog_count=objective_backlog_count, subjective_initial_count=len(initial_review_items), - subjective_postflight_count=len(postflight_review_items), + assessment_postflight_count=len(postflight_assessment_items), + subjective_postflight_count=len(subjective_postflight_items), workflow_postflight_count=len(postflight_workflow_items), triage_pending_count=len(triage_items), has_unplanned_objective_blockers=has_unplanned_objective_blockers, @@ -416,7 +456,11 @@ def build_queue_snapshot( def coarse_phase_name(phase: str) -> str: """Map internal queue phases to the persisted coarse lifecycle value.""" - if phase == PHASE_REVIEW_INITIAL or phase == PHASE_REVIEW_POSTFLIGHT: + if phase in { + PHASE_REVIEW_INITIAL, + PHASE_ASSESSMENT_POSTFLIGHT, + PHASE_REVIEW_POSTFLIGHT, + }: return "review" if phase == PHASE_WORKFLOW_POSTFLIGHT: return "workflow" @@ -426,6 +470,7 @@ def coarse_phase_name(phase: str) -> str: __all__ = [ + "PHASE_ASSESSMENT_POSTFLIGHT", "PHASE_EXECUTE", "PHASE_REVIEW_INITIAL", "PHASE_REVIEW_POSTFLIGHT", diff --git a/desloppify/engine/_work_queue/types.py b/desloppify/engine/_work_queue/types.py index 19532600..d7a767bb 100644 --- a/desloppify/engine/_work_queue/types.py +++ b/desloppify/engine/_work_queue/types.py @@ -57,6 +57,7 @@ class QueueItemCommon(QueueItemBase, total=False): estimated_impact: float primary_command: str action_type: str + execution_policy: str explain: dict[str, Any] # Plan-order metadata @@ -103,10 +104,6 @@ class WorkItemQueueItem(QueueItemCommon, total=False): tier: int -# Legacy alias retained while imports move to the new name. -IssueQueueItem = WorkItemQueueItem - - class ClusterQueueItem(QueueItemCommon, total=False): """Collapsed plan/work queue cluster item.""" @@ -190,6 +187,7 @@ class SerializedQueueItem(TypedDict, total=False): members_truncated: bool members_sample_limit: int autofix_hint: str + execution_policy: str action_steps: list[dict[str, Any]] @@ -205,7 +203,6 @@ class SerializedQueueItem(TypedDict, total=False): __all__ = [ "ClusterQueueItem", - "IssueQueueItem", "PlanClusterRef", "QueueItemBase", "QueueItemCommon", diff --git a/desloppify/engine/plan_triage.py b/desloppify/engine/plan_triage.py index f389d6a3..2ad1a830 100644 --- a/desloppify/engine/plan_triage.py +++ b/desloppify/engine/plan_triage.py @@ -84,12 +84,12 @@ def triage_phase_banner( if undispositioned: return ( "TRIAGE RECOVERY NEEDED — " - f"{undispositioned} review issue(s) still need cluster/skip dispositions. " + f"{undispositioned} review work item(s) still need cluster/skip dispositions. " f"{run_hint}" ) if resolved_snapshot.is_triage_stale or meta.get("triage_recommended"): return ( - "TRIAGE RECOMMENDED — review issues changed since last triage. " + "TRIAGE RECOMMENDED — review work items changed since last triage. " f"{run_hint}" ) return "" @@ -99,7 +99,7 @@ def triage_phase_banner( if undispositioned: return ( "TRIAGE PENDING — " - f"{undispositioned} review issue(s) still need cluster/skip dispositions after current work. " + f"{undispositioned} review work item(s) still need cluster/skip dispositions after current work. " f"{run_hint}" ) return ( @@ -113,7 +113,7 @@ def triage_phase_banner( f"complete all stages to exit. {run_hint}" ) return ( - "TRIAGE MODE — review issues need analysis before fixing. " + "TRIAGE MODE — review work items need analysis before fixing. " f"{run_hint}" ) diff --git a/desloppify/intelligence/integrity.py b/desloppify/intelligence/integrity.py index d2b654a2..c8bd78c2 100644 --- a/desloppify/intelligence/integrity.py +++ b/desloppify/intelligence/integrity.py @@ -8,7 +8,7 @@ from collections.abc import Iterable, Mapping -from desloppify.engine._state.issue_semantics import is_review_request +from desloppify.engine._state.issue_semantics import is_assessment_request from desloppify.engine._scoring.policy.core import ( SUBJECTIVE_TARGET_MATCH_TOLERANCE, matches_target_score, @@ -51,7 +51,7 @@ def _iter_issues( def is_subjective_review_open(issue: dict) -> bool: """Return True when a issue is an open subjective-review signal.""" - return issue.get("status") == "open" and is_review_request(issue) + return issue.get("status") == "open" and is_assessment_request(issue) def is_holistic_subjective_issue(issue: dict, *, issue_id: str = "") -> bool: @@ -74,7 +74,7 @@ def is_holistic_subjective_issue(issue: dict, *, issue_id: str = "") -> bool: return True # Dimension-level issues are codebase-wide by nature - if is_review_request(issue) and detail.get("dimension"): + if is_assessment_request(issue) and detail.get("dimension"): return True return False diff --git a/desloppify/intelligence/narrative/headline.py b/desloppify/intelligence/narrative/headline.py index 67f870d4..13bd0c47 100644 --- a/desloppify/intelligence/narrative/headline.py +++ b/desloppify/intelligence/narrative/headline.py @@ -34,10 +34,10 @@ def compute_headline( uninvestigated = (open_by_detector or {}).get("review_uninvestigated", 0) if uninvestigated > 0: review_suffix = ( - f" ({review_count} review issue{s} \u2014 run `desloppify show review --status open`)" + f" ({review_count} review work item{s} \u2014 run `desloppify show review --status open`)" ) else: - review_suffix = f" ({review_count} review issue{s} pending)" + review_suffix = f" ({review_count} review work item{s} pending)" headline = _compute_headline_inner( phase, diff --git a/desloppify/intelligence/narrative/reminders_rules_followup.py b/desloppify/intelligence/narrative/reminders_rules_followup.py index a310b55c..e4d521c4 100644 --- a/desloppify/intelligence/narrative/reminders_rules_followup.py +++ b/desloppify/intelligence/narrative/reminders_rules_followup.py @@ -37,7 +37,7 @@ def _review_queue_reminders( { "type": "review_issues_pending", "message": ( - f"{len(uninvestigated)} review issue(s) need investigation. " + f"{len(uninvestigated)} review work item(s) need investigation. " "Run `desloppify show review --status open` to see the work queue." ), "command": "desloppify show review --status open", diff --git a/desloppify/intelligence/narrative/signals.py b/desloppify/intelligence/narrative/signals.py index 16d503e4..f21f30fa 100644 --- a/desloppify/intelligence/narrative/signals.py +++ b/desloppify/intelligence/narrative/signals.py @@ -15,7 +15,7 @@ from desloppify.base.discovery.paths import get_project_root from desloppify.engine._state.issue_semantics import ( is_review_finding, - is_review_request, + is_assessment_request, ) from desloppify.intelligence.narrative._constants import STRUCTURAL_MERGE from desloppify.intelligence.narrative.types import ( @@ -108,8 +108,8 @@ def count_open_by_detector(issues: dict) -> dict[str, int]: by_detector[detector] = by_detector.get(detector, 0) + 1 if is_review_finding(issue) and issue.get("detail", {}).get("holistic"): by_detector["review_holistic"] = by_detector.get("review_holistic", 0) + 1 - if is_review_request(issue): - by_detector["review_request"] = by_detector.get("review_request", 0) + 1 + if is_assessment_request(issue): + by_detector["assessment_request"] = by_detector.get("assessment_request", 0) + 1 if by_detector.get("review", 0) > 0: by_detector["review_uninvestigated"] = sum( 1 diff --git a/desloppify/tests/commands/plan/test_triage_display_direct.py b/desloppify/tests/commands/plan/test_triage_display_direct.py index 130973ff..8515750f 100644 --- a/desloppify/tests/commands/plan/test_triage_display_direct.py +++ b/desloppify/tests/commands/plan/test_triage_display_direct.py @@ -198,7 +198,7 @@ def test_triage_phase_banner_reports_recovery_gap() -> None: banner = triage_mod.triage_phase_banner(plan, state=state) assert "TRIAGE RECOVERY NEEDED" in banner - assert "3 review issue(s)" in banner + assert "3 review work item(s)" in banner def test_action_guidance_blocks_enrich_until_organize_confirmed(monkeypatch, capsys) -> None: diff --git a/desloppify/tests/commands/review/test_review_importing_support_direct.py b/desloppify/tests/commands/review/test_review_importing_support_direct.py index bb780ce7..2680354a 100644 --- a/desloppify/tests/commands/review/test_review_importing_support_direct.py +++ b/desloppify/tests/commands/review/test_review_importing_support_direct.py @@ -147,9 +147,9 @@ def test_print_review_import_sync_reports_new_ids_and_triage_commands(capsys) -> ) out = capsys.readouterr().out - assert "2 new review issue(s) added to queue" in out + assert "2 new review work item(s) added to queue" in out assert "Alpha summary" in out - assert "stale review issue(s) removed from queue" in out + assert "stale review work item(s) removed from queue" in out assert plan_sync_mod.TRIAGE_CMD_RUN_STAGES_CODEX in out assert plan_sync_mod.TRIAGE_CMD_RUN_STAGES_CLAUDE in out @@ -375,7 +375,7 @@ def fake_review_import(_plan, _state, policy=None): ) plan_sync_mod.sync_plan_after_import( - state={"issues": {"review::x": {"summary": "new review issue"}}}, + state={"issues": {"review::x": {"summary": "new review work item"}}}, diff={"new": 1, "reopened": 0}, assessment_mode="trusted_internal", ) @@ -478,7 +478,7 @@ def test_sync_plan_after_import_preserves_scan_phase_for_temporary_skips( ) plan_sync_mod.sync_plan_after_import( - state={"issues": {"review::new": {"summary": "new review issue"}}}, + state={"issues": {"review::new": {"summary": "new review work item"}}}, diff={"new": 1, "reopened": 0}, assessment_mode="issues_only", ) @@ -511,7 +511,7 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No ) plan_sync_mod.sync_plan_after_import( - state={"issues": {"review::new": {"summary": "new review issue"}}}, + state={"issues": {"review::new": {"summary": "new review work item"}}}, diff={"new": 1, "reopened": 0}, assessment_mode="issues_only", ) diff --git a/desloppify/tests/commands/test_lifecycle_transitions.py b/desloppify/tests/commands/test_lifecycle_transitions.py index f9f32aa1..1587b059 100644 --- a/desloppify/tests/commands/test_lifecycle_transitions.py +++ b/desloppify/tests/commands/test_lifecycle_transitions.py @@ -222,28 +222,27 @@ def test_workflow_items_injected_on_next_scan(self, monkeypatch): assert WORKFLOW_COMMUNICATE_SCORE_ID not in ids # After completing objectives, postflight sequence begins. - # Subjective reruns come before workflow items in the lifecycle. + # Workflow items surface before subjective follow-up. state["work_items"]["obj-1"]["status"] = "fixed" state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) - # Subjective reruns visible first (stale assessments) - assert any(fid.startswith("subjective::") for fid in ids), f"Expected subjective: {ids}" - - # After completing subjective reruns, workflow items become visible - _complete_endgame_subjective_reruns(state) - ids = _queue_ids(state, plan) assert WORKFLOW_COMMUNICATE_SCORE_ID in ids assert WORKFLOW_CREATE_PLAN_ID in ids assert ids.index(WORKFLOW_COMMUNICATE_SCORE_ID) < ids.index(WORKFLOW_CREATE_PLAN_ID) + # After completing workflow items, subjective follow-up becomes visible + purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID, WORKFLOW_CREATE_PLAN_ID]) + ids = _queue_ids(state, plan) + assert any(fid.startswith("subjective::") for fid in ids), f"Expected subjective: {ids}" + # --------------------------------------------------------------------------- -# Phase-order contract: subjective -> score -> triage (after objective drains) +# Phase-order contract: score -> triage -> review -> assessment (after objective drains) # --------------------------------------------------------------------------- class TestPhaseOrderInvariant: - def test_subjective_then_score_then_triage(self): + def test_score_then_assessment_when_no_review_followup(self): """Endgame queue order is fixed once objective backlog is drained.""" state = _build_state( [], @@ -262,19 +261,22 @@ def test_subjective_then_score_then_triage(self): # Mark postflight scan as done so it doesn't block plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 1} - # Subjective reruns must block score + triage until completed. + # Workflow items surface before subjective follow-up. + ids = _queue_ids(state, plan) + assert ids == [WORKFLOW_COMMUNICATE_SCORE_ID] + + # After workflow completion, subjective follow-up appears. + purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID]) ids = _queue_ids(state, plan) assert ids == ["subjective::naming_quality"] - # After subjective rerun completion, score workflow appears (triage gated behind it). + # After subjective follow-up completion, triage becomes visible. state["subjective_assessments"]["naming_quality"]["needs_review_refresh"] = False state["subjective_assessments"]["naming_quality"]["score"] = 100.0 state["dimension_scores"][DIM_DISPLAY["naming_quality"]]["score"] = 100.0 state["dimension_scores"][DIM_DISPLAY["naming_quality"]]["strict"] = 100.0 ids = _queue_ids(state, plan) - assert WORKFLOW_COMMUNICATE_SCORE_ID in ids - # Triage is gated behind workflow items in lifecycle - assert "triage::observe" not in ids + assert ids == ["triage::observe"] # --------------------------------------------------------------------------- @@ -305,16 +307,10 @@ def test_triage_after_review_issues_on_scan(self, monkeypatch): assert all(sid in plan["queue_order"] for sid in TRIAGE_STAGE_IDS) # Once objective queue drains, lifecycle enters postflight. - # Review issues are non-objective, but they stay behind triage. + # Workflow surfaces before triage/review/assessment. state["work_items"]["obj-1"]["status"] = "fixed" state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) - # Subjective reruns surface first. - assert any(fid.startswith("subjective::") for fid in ids), ids - - # After subjective reruns complete, workflow items surface before triage. - _complete_endgame_subjective_reruns(state) - ids = _queue_ids(state, plan) workflow_ids = [fid for fid in ids if fid.startswith("workflow::")] assert len(workflow_ids) > 0, f"Expected workflow items: {ids}" @@ -371,19 +367,19 @@ def test_golden_path(self, monkeypatch): state["work_items"]["obj-1"]["status"] = "fixed" state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) - # Subjective reruns come first in postflight - assert any(fid.startswith("subjective::") for fid in ids), f"Post-objectives: {ids}" - - # ── Complete subjective reruns to unlock workflow ── - _complete_endgame_subjective_reruns(state) - ids = _queue_ids(state, plan) + # Workflow comes first in postflight assert WORKFLOW_COMMUNICATE_SCORE_ID in ids, f"Post-subjective: {ids}" assert WORKFLOW_CREATE_PLAN_ID in ids, f"Post-subjective: {ids}" # ── Complete workflow items ── purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID, WORKFLOW_CREATE_PLAN_ID]) ids = _queue_ids(state, plan) - assert not any(fid.startswith("workflow::") for fid in ids), f"Post-workflow: {ids}" + assert any(fid.startswith("subjective::") for fid in ids), f"Post-workflow: {ids}" + + # ── Complete subjective follow-up ── + _complete_endgame_subjective_reruns(state) + ids = _queue_ids(state, plan) + assert not any(fid.startswith("workflow::") for fid in ids), f"Post-subjective: {ids}" # ── Scan 3: add review issues + reopen objectives for mid-cycle test ── state["work_items"]["obj-1"]["status"] = "open" diff --git a/desloppify/tests/commands/test_next_render.py b/desloppify/tests/commands/test_next_render.py index 4274e4f2..61304e57 100644 --- a/desloppify/tests/commands/test_next_render.py +++ b/desloppify/tests/commands/test_next_render.py @@ -63,7 +63,7 @@ def _cluster_item( def _workflow_stage_item( *, id: str = "triage::observe", - summary: str = "Observe patterns in review issues", + summary: str = "Observe patterns in review work items", stage_name: str = "observe", is_blocked: bool = False, blocked_by: list[str] | None = None, @@ -272,8 +272,9 @@ def test_render_auto_fix_type_label(monkeypatch, capsys) -> None: monkeypatch.setattr(render_mod, "colorize", lambda t, _s: t) item = _issue_item( - primary_command="desloppify autofix unused_import --dry-run", + primary_command='desloppify plan resolve "unused_import::a" --note "done" --confirm', detector="unused_import", + action_type="auto_fix", ) render_mod.render_terminal_items( [item], {}, {}, group="item", explain=False, @@ -431,7 +432,7 @@ def test_render_workflow_stage_with_review_issues(monkeypatch, capsys) -> None: [item], {}, {}, group="item", explain=False, ) out = capsys.readouterr().out - assert "12 review issues" in out + assert "12 review work items" in out def test_render_workflow_action(monkeypatch, capsys) -> None: diff --git a/desloppify/tests/engine/test_sync_split_modules_direct.py b/desloppify/tests/engine/test_sync_split_modules_direct.py index 2f5947df..0bbd42c1 100644 --- a/desloppify/tests/engine/test_sync_split_modules_direct.py +++ b/desloppify/tests/engine/test_sync_split_modules_direct.py @@ -719,6 +719,33 @@ def test_queue_snapshot_enforces_phase_boundaries() -> None: assert "unused::a" in backlog_ids +def test_queue_snapshot_keeps_executing_real_queue_items_before_postflight_scan() -> None: + state = { + "issues": { + "unused::a": { + "id": "unused::a", + "detector": "unused", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "unused import", + "detail": {}, + } + } + } + plan = { + "queue_order": ["unused::a", "workflow::communicate-score", "triage::observe"], + "plan_start_scores": {"strict": 80.0}, + "refresh_state": {"lifecycle_phase": "execute"}, + } + + snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == snapshot_mod.PHASE_EXECUTE + assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] + + def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queueing() -> None: state = { "issues": { @@ -741,6 +768,8 @@ def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queuein "issue_ids": ["unused::a"], "auto": True, "action": "desloppify autofix unused-imports --dry-run", + "action_type": "auto_fix", + "execution_policy": "ephemeral_autopromote", } }, "plan_start_scores": {"strict": 80.0}, @@ -753,6 +782,76 @@ def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queuein assert "unused::a" not in {item["id"] for item in snapshot.backlog_items} +def test_queue_snapshot_legacy_autofix_cluster_still_executes_via_normalized_semantics() -> None: + state = { + "issues": { + "unused::a": { + "id": "unused::a", + "detector": "unused", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "unused import", + "detail": {}, + } + } + } + plan = { + "queue_order": [], + "clusters": { + "auto/unused": { + "name": "auto/unused", + "issue_ids": ["unused::a"], + "auto": True, + "action": "desloppify autofix unused-imports --dry-run", + } + }, + "plan_start_scores": {"strict": 80.0}, + } + + snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == snapshot_mod.PHASE_EXECUTE + assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] + + +def test_queue_snapshot_non_autofix_auto_cluster_does_not_execute_without_queueing() -> None: + state = { + "issues": { + "dict_keys::a": { + "id": "dict_keys::a", + "detector": "dict_keys", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "dict key mismatch", + "detail": {}, + } + } + } + plan = { + "queue_order": [], + "clusters": { + "auto/dict_keys": { + "issue_ids": ["dict_keys::a"], + "auto": True, + "action": "review and refactor each issue", + "action_type": "refactor", + "execution_policy": "planned_only", + } + }, + "plan_start_scores": {"strict": 80.0}, + } + + snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) + + assert snapshot.phase != snapshot_mod.PHASE_EXECUTE + assert "dict_keys::a" not in [item["id"] for item in snapshot.execution_items] + assert "dict_keys::a" in {item["id"] for item in snapshot.backlog_items} + + def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: review_state = { "issues": { @@ -768,6 +867,47 @@ def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: } } } + assessment_state = { + "issues": { + "review::src/a.py::naming": { + "id": "review::src/a.py::naming", + "detector": "review", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "review finding", + "detail": {"dimension": "naming_quality"}, + }, + "subjective_review::naming_quality": { + "id": "subjective_review::naming_quality", + "detector": "subjective_review", + "status": "open", + "file": "src/a.py", + "tier": 1, + "confidence": "high", + "summary": "rerun request", + "detail": {"dimension": "naming_quality"}, + }, + }, + "dimension_scores": { + "Naming quality": { + "score": 70.0, + "strict": 70.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + }, + }, + "subjective_assessments": { + "naming_quality": { + "score": 70.0, + "needs_review_refresh": True, + "stale_since": "2026-01-01T00:00:00+00:00", + }, + }, + } scan_plan = { "queue_order": ["workflow::run-scan", "workflow::communicate-score", "triage::observe"], "plan_start_scores": {"strict": 80.0}, @@ -797,6 +937,54 @@ def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: assert triage_snapshot.phase == snapshot_mod.PHASE_TRIAGE_POSTFLIGHT assert [item["id"] for item in triage_snapshot.execution_items] == ["triage::observe"] + assessment_with_review_snapshot = snapshot_mod.build_queue_snapshot( + assessment_state, + plan={ + "queue_order": [], + "plan_start_scores": {"strict": 80.0}, + "refresh_state": {"postflight_scan_completed_at_scan_count": 1}, + "epic_triage_meta": {"triaged_ids": ["review::src/a.py::naming"]}, + }, + ) + assert assessment_with_review_snapshot.phase == snapshot_mod.PHASE_REVIEW_POSTFLIGHT + assert [item["id"] for item in assessment_with_review_snapshot.execution_items] == [ + "review::src/a.py::naming" + ] + assert "subjective::naming_quality" in { + item["id"] for item in assessment_with_review_snapshot.backlog_items + } + assert "subjective_review::naming_quality" in { + item["id"] for item in assessment_with_review_snapshot.backlog_items + } + + assessment_only_snapshot = snapshot_mod.build_queue_snapshot( + { + key: value + for key, value in assessment_state.items() + if key != "issues" + } + | { + "issues": { + "subjective_review::naming_quality": assessment_state["issues"][ + "subjective_review::naming_quality" + ] + } + }, + plan={ + "queue_order": [], + "plan_start_scores": {"strict": 80.0}, + "refresh_state": {"postflight_scan_completed_at_scan_count": 1}, + }, + ) + assert assessment_only_snapshot.phase == snapshot_mod.PHASE_ASSESSMENT_POSTFLIGHT + assert [item["id"] for item in assessment_only_snapshot.execution_items] == [ + "subjective::naming_quality", + "subjective_review::naming_quality", + ] + assert "review::src/a.py::naming" not in { + item["id"] for item in assessment_only_snapshot.backlog_items + } + post_triage_snapshot = snapshot_mod.build_queue_snapshot( review_state, plan={ @@ -847,6 +1035,7 @@ def test_queue_snapshot_prefers_deferred_disposition_over_run_scan() -> None: def test_coarse_phase_name_collapses_internal_review_workflow_and_triage() -> None: assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_REVIEW_INITIAL) == "review" + assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_ASSESSMENT_POSTFLIGHT) == "review" assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_REVIEW_POSTFLIGHT) == "review" assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_WORKFLOW_POSTFLIGHT) == "workflow" assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_TRIAGE_POSTFLIGHT) == "triage" diff --git a/desloppify/tests/narrative/test_narrative_strategy_and_review.py b/desloppify/tests/narrative/test_narrative_strategy_and_review.py index 55587353..26233fbb 100644 --- a/desloppify/tests/narrative/test_narrative_strategy_and_review.py +++ b/desloppify/tests/narrative/test_narrative_strategy_and_review.py @@ -884,7 +884,7 @@ def test_can_parallelize_false_single_lane(self): class TestReviewHeadline: - """Headline should mention review issues in all phases.""" + """Headline should mention review work items in all phases.""" def test_review_suffix_in_middle_grind(self): """Review suffix should appear even during middle_grind (not just maintenance).""" @@ -902,10 +902,10 @@ def test_review_suffix_in_middle_grind(self): open_by_detector=by_det, ) assert headline is not None - assert "review issue" in headline.lower() + assert "review work item" in headline.lower() def test_review_suffix_with_uninvestigated(self): - """Uninvestigated review issues should mention show review.""" + """Uninvestigated review work items should mention show review.""" by_det = {"review": 2, "review_uninvestigated": 2} headline = compute_headline( "maintenance", @@ -923,7 +923,7 @@ def test_review_suffix_with_uninvestigated(self): assert "desloppify show review" in headline def test_review_suffix_all_investigated(self): - """When all review issues are investigated, show 'pending' not 'issues'.""" + """When all review work items are investigated, show 'pending' not 'issues'.""" by_det = {"review": 2, "review_uninvestigated": 0} headline = compute_headline( "maintenance", @@ -957,7 +957,7 @@ def test_no_review_suffix_when_zero(self): ) # Should not mention review at all if headline: - assert "review issue" not in headline.lower() + assert "review work item" not in headline.lower() class TestReviewUninvestigatedCount: @@ -1012,7 +1012,7 @@ def test_review_issues_pending_reminder(self): types = [r["type"] for r in reminders] assert "review_issues_pending" in types msg = next(r for r in reminders if r["type"] == "review_issues_pending") - assert "1 review issue" in msg["message"] + assert "1 review work item" in msg["message"] assert "desloppify show review" in msg["message"] def test_no_review_pending_when_all_investigated(self): @@ -1054,7 +1054,7 @@ def test_no_rereview_without_assessments(self): class TestStrategyReviewHint: - """Strategy hint should mention review issues when issue_queue action exists.""" + """Strategy hint should mention review work items when issue_queue action exists.""" def test_review_appended_to_hint(self): issues = _issues_dict( diff --git a/desloppify/tests/plan/test_auto_cluster.py b/desloppify/tests/plan/test_auto_cluster.py index 782fc3d8..b6023034 100644 --- a/desloppify/tests/plan/test_auto_cluster.py +++ b/desloppify/tests/plan/test_auto_cluster.py @@ -6,6 +6,10 @@ _repair_ghost_cluster_refs, auto_cluster_issues, ) +from desloppify.engine._plan.cluster_semantics import ( + EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE, + EXECUTION_POLICY_PLANNED_ONLY, +) from desloppify.engine._plan.cluster_strategy import ( cluster_name_from_key, grouping_key, @@ -134,6 +138,8 @@ def test_auto_cluster_creates_cluster_from_issues(): assert cluster["auto"] is True assert set(cluster["issue_ids"]) == {"u1", "u2", "u3"} assert cluster["action"] is not None # should have fix command + assert cluster["action_type"] == "auto_fix" + assert cluster["execution_policy"] == EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE def test_auto_cluster_skips_singletons(): @@ -385,9 +391,27 @@ def test_ensure_plan_defaults_adds_cluster_fields(): assert cluster["auto"] is False assert cluster["cluster_key"] == "" assert cluster["action"] is None + assert cluster["action_type"] == "manual_fix" + assert cluster["execution_policy"] == EXECUTION_POLICY_PLANNED_ONLY assert cluster["user_modified"] is False +def test_ensure_plan_defaults_backfills_legacy_autofix_cluster_semantics(): + plan = empty_plan() + plan["clusters"]["auto/unused"] = { + "name": "auto/unused", + "auto": True, + "issue_ids": ["u1"], + "action": "desloppify autofix unused-imports --dry-run", + } + + ensure_plan_defaults(plan) + + cluster = plan["clusters"]["auto/unused"] + assert cluster["action_type"] == "auto_fix" + assert cluster["execution_policy"] == EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE + + # --------------------------------------------------------------------------- # Integration: build_work_queue with collapse # --------------------------------------------------------------------------- diff --git a/desloppify/tests/plan/test_refresh_lifecycle.py b/desloppify/tests/plan/test_refresh_lifecycle.py index 0d33efee..a2a3575c 100644 --- a/desloppify/tests/plan/test_refresh_lifecycle.py +++ b/desloppify/tests/plan/test_refresh_lifecycle.py @@ -47,6 +47,20 @@ def test_clearing_completion_for_real_issue_requires_new_scan() -> None: changed = clear_postflight_scan_completion( plan, issue_ids=["unused::src/app.ts::thing"], + state={ + "issues": { + "unused::src/app.ts::thing": { + "id": "unused::src/app.ts::thing", + "detector": "unused", + "status": "open", + "file": "src/app.ts", + "tier": 1, + "confidence": "high", + "summary": "unused import", + "detail": {}, + } + } + }, ) assert changed is True @@ -54,6 +68,33 @@ def test_clearing_completion_for_real_issue_requires_new_scan() -> None: assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_EXECUTE +def test_clearing_completion_for_review_issue_keeps_current_scan_boundary() -> None: + plan = empty_plan() + mark_postflight_scan_completed(plan, scan_count=5) + + changed = clear_postflight_scan_completion( + plan, + issue_ids=["review::src/app.ts::naming"], + state={ + "issues": { + "review::src/app.ts::naming": { + "id": "review::src/app.ts::naming", + "detector": "review", + "status": "open", + "file": "src/app.ts", + "tier": 1, + "confidence": "high", + "summary": "naming issue", + "detail": {"dimension": "naming_quality"}, + } + } + }, + ) + + assert changed is False + assert postflight_scan_pending(plan) is False + + def test_current_lifecycle_phase_falls_back_for_legacy_plans() -> None: plan = empty_plan() assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_SCAN diff --git a/desloppify/tests/review/review_misc_cases.py b/desloppify/tests/review/review_misc_cases.py index c35f89d4..fad5ccb7 100644 --- a/desloppify/tests/review/review_misc_cases.py +++ b/desloppify/tests/review/review_misc_cases.py @@ -235,7 +235,7 @@ def test_headline_includes_review_in_maintenance(self): open_by_detector={"review": 3}, ) assert headline is not None - assert "review issue" in headline.lower() + assert "review work item" in headline.lower() def test_headline_no_review_in_early_momentum(self): headline = compute_headline( diff --git a/desloppify/tests/review/review_misc_cases_headline_bugfix.py b/desloppify/tests/review/review_misc_cases_headline_bugfix.py index 7f3a9748..aef6a551 100644 --- a/desloppify/tests/review/review_misc_cases_headline_bugfix.py +++ b/desloppify/tests/review/review_misc_cases_headline_bugfix.py @@ -9,7 +9,7 @@ class TestHeadlineBugFix: def test_headline_no_typeerror_when_headline_none_with_review_suffix(self): """Regression: None + review_suffix shouldn't TypeError.""" # Force: no security prefix, headline_inner returns None, review_suffix non-empty - # stagnation + review issues + conditions that make headline_inner return None + # stagnation + review work items + conditions that make headline_inner return None result = compute_headline( "stagnation", {}, @@ -41,5 +41,5 @@ def test_headline_review_only_no_security_no_inner(self): open_by_detector={"review": 3}, ) if result is not None: - assert "review issue" in result.lower() + assert "review work item" in result.lower() assert "3" in result diff --git a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py index a611ca5d..ec2ae52c 100644 --- a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py +++ b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py @@ -257,6 +257,102 @@ def test_legacy_force_visible_triage_stage_is_ignored_during_execute(): assert ids == ["smells::src/a.py::x"] +def test_triaged_review_findings_stay_postflight_while_objective_work_remains(): + """Completed triage should not mix review findings into execute.""" + from desloppify.engine._plan.schema import empty_plan + + state = _state( + [ + _issue("smells::src/a.py::x", detector="smells", tier=3), + _issue( + "review::src/a.py::naming", + detector="review", + tier=1, + confidence="high", + detail={"dimension": "naming_quality"}, + ), + ] + ) + plan = empty_plan() + plan["plan_start_scores"] = {"strict": 80.0} + plan["queue_order"] = ["review::src/a.py::naming", "smells::src/a.py::x"] + plan["epic_triage_meta"] = { + "triaged_ids": ["review::src/a.py::naming"], + "last_completed_at": "2026-03-13T00:00:00+00:00", + } + plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 1} + + queue = build_execution_queue( + state, + options=QueueBuildOptions( + count=None, + include_subjective=False, + plan=plan, + ), + ) + ids = [item["id"] for item in queue["items"]] + assert ids == ["smells::src/a.py::x"] + + +def test_postflight_review_findings_stay_ahead_of_assessment_followup(): + """Concrete review findings should stay ahead of subjective follow-up work.""" + from desloppify.engine._plan.schema import empty_plan + + state = _state( + [ + _issue( + "review::src/a.py::naming", + detector="review", + tier=1, + confidence="high", + detail={"dimension": "naming_quality"}, + ), + _issue( + "subjective_review::naming_quality", + detector="subjective_review", + tier=1, + confidence="high", + detail={"dimension": "naming_quality"}, + ), + ], + dimension_scores={ + "Naming quality": { + "score": 70.0, + "strict": 70.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + }, + }, + ) + state["subjective_assessments"] = { + "naming_quality": { + "score": 70.0, + "needs_review_refresh": True, + "stale_since": "2026-01-01T00:00:00+00:00", + } + } + plan = empty_plan() + plan["plan_start_scores"] = {"strict": 80.0} + plan["epic_triage_meta"] = { + "triaged_ids": ["review::src/a.py::naming"], + "last_completed_at": "2026-03-13T00:00:00+00:00", + } + plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 1} + + queue = build_execution_queue( + state, + options=QueueBuildOptions( + count=None, + include_subjective=True, + plan=plan, + ), + ) + ids = [item["id"] for item in queue["items"]] + assert ids == ["review::src/a.py::naming"] + + def test_execution_queue_excludes_unplanned_objective_items(): """Unplanned objective items don't appear in execution — only planned items do.""" from desloppify.engine._plan.schema import empty_plan diff --git a/desloppify/tests/state/test_state.py b/desloppify/tests/state/test_state.py index 1b3f618c..a6e322de 100644 --- a/desloppify/tests/state/test_state.py +++ b/desloppify/tests/state/test_state.py @@ -5,7 +5,7 @@ from desloppify.engine._state import filtering as state_query_mod -from desloppify.engine._state.issue_semantics import MECHANICAL_FINDING, SCAN_ORIGIN +from desloppify.engine._state.issue_semantics import MECHANICAL_DEFECT, SCAN_ORIGIN from desloppify.engine._state.schema import CURRENT_VERSION from desloppify.state import ( MergeScanOptions, @@ -240,7 +240,7 @@ def test_default_field_values(self, monkeypatch): assert f["tier"] == 2 assert f["confidence"] == "medium" assert f["summary"] == "sum" - assert f["issue_kind"] == MECHANICAL_FINDING + assert f["issue_kind"] == MECHANICAL_DEFECT assert f["origin"] == SCAN_ORIGIN @@ -294,7 +294,7 @@ def test_legacy_payload_gets_normalized(self, tmp_path): assert s["scan_count"] == 0 assert s["stats"] == {} assert s["issues"]["x"]["status"] == "open" - assert s["issues"]["x"]["issue_kind"] == MECHANICAL_FINDING + assert s["issues"]["x"]["issue_kind"] == MECHANICAL_DEFECT assert s["issues"]["x"]["origin"] == SCAN_ORIGIN validate_state_invariants(s) @@ -305,7 +305,7 @@ def test_work_items_payload_gets_normalized(self, tmp_path): ) s = load_state(p) assert s["issues"]["x"]["status"] == "open" - assert s["issues"]["x"]["work_item_kind"] == MECHANICAL_FINDING + assert s["issues"]["x"]["work_item_kind"] == MECHANICAL_DEFECT validate_state_invariants(s) def test_corrupt_json_tries_backup(self, tmp_path): diff --git a/desloppify/tests/state/test_state_internal_direct.py b/desloppify/tests/state/test_state_internal_direct.py index 6e5bd1cb..4cca4f90 100644 --- a/desloppify/tests/state/test_state_internal_direct.py +++ b/desloppify/tests/state/test_state_internal_direct.py @@ -85,21 +85,21 @@ def test_issue_semantics_normalize_legacy_detector_rows(): } mechanical_issue = {"id": "unused::src/a.py::x", "detector": "unused", "detail": {}} - issue_semantics_mod.ensure_issue_semantics(review_issue) - issue_semantics_mod.ensure_issue_semantics(concern_issue) - issue_semantics_mod.ensure_issue_semantics(request_issue) - issue_semantics_mod.ensure_issue_semantics(mechanical_issue) + issue_semantics_mod.ensure_work_item_semantics(review_issue) + issue_semantics_mod.ensure_work_item_semantics(concern_issue) + issue_semantics_mod.ensure_work_item_semantics(request_issue) + issue_semantics_mod.ensure_work_item_semantics(mechanical_issue) assert review_issue["work_item_kind"] == issue_semantics_mod.REVIEW_DEFECT - assert review_issue["issue_kind"] == issue_semantics_mod.REVIEW_FINDING + assert review_issue["issue_kind"] == issue_semantics_mod.REVIEW_DEFECT assert review_issue["origin"] == issue_semantics_mod.REVIEW_IMPORT_ORIGIN assert concern_issue["work_item_kind"] == issue_semantics_mod.REVIEW_CONCERN - assert concern_issue["issue_kind"] == issue_semantics_mod.CONCERN_FINDING + assert concern_issue["issue_kind"] == issue_semantics_mod.REVIEW_CONCERN assert request_issue["work_item_kind"] == issue_semantics_mod.ASSESSMENT_REQUEST - assert request_issue["issue_kind"] == issue_semantics_mod.REVIEW_REQUEST + assert request_issue["issue_kind"] == issue_semantics_mod.ASSESSMENT_REQUEST assert request_issue["origin"] == issue_semantics_mod.SYNTHETIC_TASK_ORIGIN assert mechanical_issue["work_item_kind"] == issue_semantics_mod.MECHANICAL_DEFECT - assert mechanical_issue["issue_kind"] == issue_semantics_mod.MECHANICAL_FINDING + assert mechanical_issue["issue_kind"] == issue_semantics_mod.MECHANICAL_DEFECT assert mechanical_issue["origin"] == issue_semantics_mod.SCAN_ORIGIN From 6bce1ccb9781d269b1f964e82ce233c7f58027ca Mon Sep 17 00:00:00 2001 From: POM Date: Fri, 13 Mar 2026 04:53:50 +0100 Subject: [PATCH 04/15] feat: sequential reconciliation pipeline, execution status flags, plan loading consolidation Fix cluster tracker race on parallel updates by introducing a shared boundary-triggered reconciliation pipeline that runs all sync steps sequentially. Add execution_status (active/review) flags to clusters, consolidate plan load/recovery into persistence module, and rename reconcile modules for clarity. Co-Authored-By: Claude Opus 4.6 --- assets/scorecard.png | Bin 90768 -> 90400 bytes .../app/cli_support/parser_groups_admin.py | 3 +- desloppify/app/commands/helpers/lang.py | 13 +- desloppify/app/commands/move/language.py | 10 +- .../commands/plan/triage/stages/records.py | 140 +++++- desloppify/app/commands/resolve/plan_load.py | 4 + .../commands/review/batch/core_normalize.py | 16 +- .../app/commands/review/importing/flags.py | 4 +- .../commands/review/importing/plan_sync.py | 371 ++++---------- desloppify/app/commands/review/merge.py | 24 +- .../app/commands/scan/plan_reconcile.py | 459 ++++-------------- desloppify/engine/_plan/__init__.py | 2 +- desloppify/engine/_plan/auto_cluster.py | 27 ++ .../engine/_plan/auto_cluster_sync_issue.py | 30 +- desloppify/engine/_plan/cluster_semantics.py | 34 ++ desloppify/engine/_plan/operations/cluster.py | 2 + desloppify/engine/_plan/persistence.py | 86 ++-- .../{reconcile.py => scan_issue_reconcile.py} | 8 +- desloppify/engine/_plan/schema/__init__.py | 37 +- desloppify/engine/_plan/sync/__init__.py | 23 + desloppify/engine/_plan/sync/pipeline.py | 174 +++++++ .../review_import.py} | 19 +- desloppify/engine/_plan/sync/workflow.py | 11 +- desloppify/engine/_plan/triage/apply.py | 3 + desloppify/engine/_work_queue/context.py | 26 +- desloppify/engine/_work_queue/plan_order.py | 1 + desloppify/engine/_work_queue/ranking.py | 2 +- desloppify/engine/_work_queue/snapshot.py | 52 +- desloppify/engine/_work_queue/types.py | 1 + desloppify/engine/detectors/complexity.py | 5 + desloppify/engine/detectors/coupling.py | 10 + desloppify/engine/detectors/gods.py | 5 + desloppify/engine/detectors/large.py | 5 + desloppify/engine/detectors/naming.py | 5 + desloppify/engine/detectors/passthrough.py | 5 + desloppify/engine/detectors/single_use.py | 5 + .../context_holistic/clusters/__init__.py | 39 +- .../review/importing/assessments.py | 12 +- .../intelligence/review/importing/holistic.py | 11 +- .../_framework/base/phase_builders.py | 9 +- .../_framework/base/shared_phases.py | 42 +- .../_framework/base/shared_phases_helpers.py | 14 +- .../_framework/base/shared_phases_review.py | 20 +- desloppify/languages/_framework/base/types.py | 10 +- .../languages/_framework/base/types_shared.py | 17 +- .../_framework/generic_support/__init__.py | 51 +- .../_framework/runtime_support/__init__.py | 20 +- .../_framework/treesitter/__init__.py | 3 + desloppify/languages/rust/fixers/__init__.py | 6 +- .../typescript/detectors/patterns/__init__.py | 8 +- .../typescript/detectors/react/__init__.py | 13 +- .../test_review_importing_support_direct.py | 212 +++----- .../test_review_runner_batch_split_direct.py | 4 +- .../commands/scan/test_plan_reconcile.py | 135 ++++-- desloppify/tests/commands/test_cli.py | 9 +- desloppify/tests/commands/test_cmd_move.py | 11 +- .../tests/commands/test_transitive_engine.py | 12 +- desloppify/tests/engine/test_queue_context.py | 34 +- .../engine/test_sync_split_modules_direct.py | 41 +- ...ared_phases_and_structural_split_direct.py | 21 +- .../common/test_shared_phases_security.py | 23 +- .../tests/lang/common/test_treesitter.py | 220 ++++----- ...t_treesitter_complexity_and_integration.py | 96 ++-- ...est_epic_triage_reconcile_and_migration.py | 2 +- .../plan/test_persistence_runtime_paths.py | 32 ++ desloppify/tests/plan/test_reconcile.py | 2 +- .../tests/plan/test_reconcile_pipeline.py | 128 +++++ desloppify/tests/plan/test_skip.py | 2 +- .../tests/plan/test_stale_dimensions.py | 2 +- .../plan/test_unified_status_lifecycle.py | 2 +- .../test_work_queue_plan_order_and_triage.py | 4 +- desloppify/tests/review/work_queue_cases.py | 20 +- 72 files changed, 1465 insertions(+), 1444 deletions(-) rename desloppify/engine/_plan/{reconcile.py => scan_issue_reconcile.py} (97%) create mode 100644 desloppify/engine/_plan/sync/pipeline.py rename desloppify/engine/_plan/{reconcile_review_import.py => sync/review_import.py} (91%) create mode 100644 desloppify/tests/plan/test_reconcile_pipeline.py diff --git a/assets/scorecard.png b/assets/scorecard.png index 5b4bd9957846a86bd636c10ef38eea2f5b749104..dd149ef62ea031cedc442de965e3218fa01baba5 100644 GIT binary patch literal 90400 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

-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

i&qpOq^XE78VNG?;YiWI; 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ÛhZd4wcN4&D1JeklSj$TYD_MC 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 diff --git a/desloppify/app/cli_support/parser_groups_admin.py b/desloppify/app/cli_support/parser_groups_admin.py index 7839f262..4d97bbf2 100644 --- a/desloppify/app/cli_support/parser_groups_admin.py +++ b/desloppify/app/cli_support/parser_groups_admin.py @@ -4,6 +4,7 @@ import logging +from desloppify.app.commands.helpers.lang import load_lang_config from desloppify.languages.framework import get_lang from .parser_groups_admin_review import _add_review_parser # noqa: F401 (re-export) @@ -94,7 +95,7 @@ def _fixer_help_lines(langs: list[str]) -> list[str]: fixer_help_lines: list[str] = [] for lang_name in langs: try: - fixer_names = sorted(get_lang(lang_name).fixers.keys()) + fixer_names = sorted(load_lang_config(lang_name).fixers.keys()) except (ImportError, ValueError, TypeError, AttributeError) as exc: logger.debug("Failed to load fixer metadata for %s: %s", lang_name, exc) fixer_help_lines.append( diff --git a/desloppify/app/commands/helpers/lang.py b/desloppify/app/commands/helpers/lang.py index 90d0f749..e1e93216 100644 --- a/desloppify/app/commands/helpers/lang.py +++ b/desloppify/app/commands/helpers/lang.py @@ -47,6 +47,15 @@ def load_lang_config(lang_name: str): ) from exc +def load_lang_config_metadata(lang_name: str) -> LangConfig | None: + """Load language metadata, isolating broken plugins from unrelated commands.""" + try: + return load_lang_config(lang_name) + except LangResolutionError as exc: + logger.warning("Skipping broken language plugin metadata for %s: %s", lang_name, exc) + return None + + EXTRA_ROOT_MARKERS = ( "package.json", "pyproject.toml", @@ -62,7 +71,9 @@ def _lang_config_markers() -> tuple[str, ...]: markers = set(EXTRA_ROOT_MARKERS) for lang_name in lang_api.available_langs(): - cfg = load_lang_config(lang_name) + cfg = load_lang_config_metadata(lang_name) + if cfg is None: + continue for marker in getattr(cfg, "detect_markers", []) or []: if not isinstance(marker, str): continue diff --git a/desloppify/app/commands/move/language.py b/desloppify/app/commands/move/language.py index b4747279..b9c83d0c 100644 --- a/desloppify/app/commands/move/language.py +++ b/desloppify/app/commands/move/language.py @@ -9,7 +9,11 @@ from types import ModuleType from desloppify.languages import framework as lang_mod -from desloppify.app.commands.helpers.lang import load_lang_config, resolve_lang +from desloppify.app.commands.helpers.lang import ( + load_lang_config, + load_lang_config_metadata, + resolve_lang, +) from desloppify.base.exception_sets import CommandError logger = logging.getLogger(__name__) @@ -19,7 +23,9 @@ def _build_ext_to_lang_map() -> dict[str, str]: """Build extension→language map from registered language configs.""" ext_map: dict[str, str] = {} for lang_name in lang_mod.available_langs(): - cfg = load_lang_config(lang_name) + cfg = load_lang_config_metadata(lang_name) + if cfg is None: + continue for ext in cfg.extensions: ext_map.setdefault(ext, lang_name) return ext_map diff --git a/desloppify/app/commands/plan/triage/stages/records.py b/desloppify/app/commands/plan/triage/stages/records.py index 1d110578..914a4a01 100644 --- a/desloppify/app/commands/plan/triage/stages/records.py +++ b/desloppify/app/commands/plan/triage/stages/records.py @@ -2,14 +2,88 @@ from __future__ import annotations +from typing import TypedDict + from desloppify.state_io import utc_now from ..stage_queue import cascade_clear_later_confirmations +class ObserveAssessmentRecord(TypedDict): + """Persisted observe-stage verdict for one cited issue hash.""" + + hash: str + verdict: str + verdict_reasoning: str + files_read: list[str] + recommendation: str + + +class ObserveRecord(TypedDict, total=False): + stage: str + report: str + cited_ids: list[str] + timestamp: str + issue_count: int + dimension_names: list[str] + dimension_counts: dict[str, int] + assessments: list[ObserveAssessmentRecord] + confirmed_at: str + confirmed_text: str + + +class ReflectRecord(TypedDict, total=False): + stage: str + report: str + cited_ids: list[str] + timestamp: str + issue_count: int + missing_issue_ids: list[str] + duplicate_issue_ids: list[str] + recurring_dims: list[str] + disposition_ledger: list[dict[str, str]] + confirmed_at: str + confirmed_text: str + + +class OrganizeRecord(TypedDict, total=False): + stage: str + report: str + cited_ids: list[str] + timestamp: str + issue_count: int + confirmed_at: str + confirmed_text: str + reused_existing_plan: bool + completion_note: str + + +class EnrichRecord(TypedDict, total=False): + stage: str + report: str + timestamp: str + shallow_count: int + confirmed_at: str + confirmed_text: str + + +class SenseCheckRecord(TypedDict, total=False): + stage: str + report: str + timestamp: str + confirmed_at: str + confirmed_text: str + + +TriageStages = dict[ + str, + ObserveRecord | ReflectRecord | OrganizeRecord | EnrichRecord | SenseCheckRecord, +] + + def resolve_reusable_report( report: str | None, - existing_stage: dict | None, + existing_stage: dict | ObserveRecord | ReflectRecord | OrganizeRecord | EnrichRecord | SenseCheckRecord | None, ) -> tuple[str | None, bool]: if report: return report, False @@ -19,43 +93,50 @@ def resolve_reusable_report( def record_observe_stage( - stages: dict, + stages: TriageStages, *, report: str, issue_count: int, cited_ids: list[str], - existing_stage: dict | None, + existing_stage: ObserveRecord | None, is_reuse: bool, - assessments: list[dict] | None = None, + assessments: list[ObserveAssessmentRecord] | None = None, + dimension_names: list[str] | None = None, + dimension_counts: dict[str, int] | None = None, ) -> list[str]: - stages["observe"] = { + observe: ObserveRecord = { "stage": "observe", "report": report, "cited_ids": cited_ids, "timestamp": utc_now(), "issue_count": issue_count, } + if dimension_names is not None: + observe["dimension_names"] = dimension_names + if dimension_counts is not None: + observe["dimension_counts"] = dimension_counts if assessments is not None: - stages["observe"]["assessments"] = assessments + observe["assessments"] = assessments if is_reuse and existing_stage and existing_stage.get("confirmed_at"): - stages["observe"]["confirmed_at"] = existing_stage["confirmed_at"] - stages["observe"]["confirmed_text"] = existing_stage.get("confirmed_text", "") + observe["confirmed_at"] = existing_stage["confirmed_at"] + observe["confirmed_text"] = existing_stage.get("confirmed_text", "") + stages["observe"] = observe cleared = cascade_clear_later_confirmations(stages, "observe") if not is_reuse: - stages["observe"].pop("confirmed_at", None) - stages["observe"].pop("confirmed_text", None) + observe.pop("confirmed_at", None) + observe.pop("confirmed_text", None) return cleared def record_organize_stage( - stages: dict, + stages: TriageStages, *, report: str, issue_count: int, - existing_stage: dict | None, + existing_stage: OrganizeRecord | None, is_reuse: bool, ) -> list[str]: - stages["organize"] = { + organize: OrganizeRecord = { "stage": "organize", "report": report, "cited_ids": [], @@ -63,52 +144,55 @@ def record_organize_stage( "issue_count": issue_count, } if is_reuse and existing_stage and existing_stage.get("confirmed_at"): - stages["organize"]["confirmed_at"] = existing_stage["confirmed_at"] - stages["organize"]["confirmed_text"] = existing_stage.get("confirmed_text", "") + organize["confirmed_at"] = existing_stage["confirmed_at"] + organize["confirmed_text"] = existing_stage.get("confirmed_text", "") + stages["organize"] = organize return cascade_clear_later_confirmations(stages, "organize") def record_enrich_stage( - stages: dict, + stages: TriageStages, *, report: str, shallow_count: int, - existing_stage: dict | None, + existing_stage: EnrichRecord | None, is_reuse: bool, ) -> list[str]: - stages["enrich"] = { + enrich: EnrichRecord = { "stage": "enrich", "report": report, "timestamp": utc_now(), "shallow_count": shallow_count, } if is_reuse and existing_stage and existing_stage.get("confirmed_at"): - stages["enrich"]["confirmed_at"] = existing_stage["confirmed_at"] - stages["enrich"]["confirmed_text"] = existing_stage.get("confirmed_text", "") + enrich["confirmed_at"] = existing_stage["confirmed_at"] + enrich["confirmed_text"] = existing_stage.get("confirmed_text", "") + stages["enrich"] = enrich return cascade_clear_later_confirmations(stages, "enrich") def record_sense_check_stage( - stages: dict, + stages: TriageStages, *, report: str, - existing_stage: dict | None, + existing_stage: SenseCheckRecord | None, is_reuse: bool, ) -> list[str]: - stages["sense-check"] = { + sense_check: SenseCheckRecord = { "stage": "sense-check", "report": report, "timestamp": utc_now(), } if is_reuse and existing_stage and existing_stage.get("confirmed_at"): - stages["sense-check"]["confirmed_at"] = existing_stage["confirmed_at"] - stages["sense-check"]["confirmed_text"] = existing_stage.get("confirmed_text", "") + sense_check["confirmed_at"] = existing_stage["confirmed_at"] + sense_check["confirmed_text"] = existing_stage.get("confirmed_text", "") + stages["sense-check"] = sense_check return cascade_clear_later_confirmations(stages, "sense-check") def record_confirm_existing_completion( *, - stages: dict, + stages: TriageStages, note: str, issue_count: int, confirmed_text: str, @@ -127,6 +211,10 @@ def record_confirm_existing_completion( __all__ = [ + "ObserveAssessmentRecord", + "ObserveRecord", + "ReflectRecord", + "TriageStages", "record_confirm_existing_completion", "record_enrich_stage", "record_observe_stage", diff --git a/desloppify/app/commands/resolve/plan_load.py b/desloppify/app/commands/resolve/plan_load.py index 405ccde1..25b774f6 100644 --- a/desloppify/app/commands/resolve/plan_load.py +++ b/desloppify/app/commands/resolve/plan_load.py @@ -34,6 +34,7 @@ class ResolvePlanAccess: degraded: bool error_kind: str | None warning_state: DegradedPlanWarningState + recovery: str | None = None def usable_plan(self, *, behavior: str, command_label: str = "resolve") -> dict | None: """Return the loaded plan, warning once when resolve falls back.""" @@ -44,6 +45,8 @@ def usable_plan(self, *, behavior: str, command_label: str = "resolve") -> dict behavior=behavior, warning_state=self.warning_state, ) + if self.recovery == "backup": + return self.plan if isinstance(self.plan, dict) else None return None return self.plan if isinstance(self.plan, dict) else None @@ -59,6 +62,7 @@ def load_resolve_plan_access( plan=status.plan, degraded=status.degraded, error_kind=status.error_kind, + recovery=getattr(status, "recovery", None), warning_state=resolved_warning_state, ) diff --git a/desloppify/app/commands/review/batch/core_normalize.py b/desloppify/app/commands/review/batch/core_normalize.py index f917afd3..be15089f 100644 --- a/desloppify/app/commands/review/batch/core_normalize.py +++ b/desloppify/app/commands/review/batch/core_normalize.py @@ -124,15 +124,7 @@ def _validate_dimension_judgment( require_complete=False, log_fn=log_fn, ) - issue_character = _normalize_dimension_judgment_text( - key, - raw.get("issue_character"), - field_name="issue_character", - require_complete=False, - log_fn=log_fn, - ) - effective_dimension_character = dimension_character or issue_character - if require_complete and not effective_dimension_character: + if require_complete and not dimension_character: raise ValueError( f"dimension_judgment.{key} must include dimension_character" ) @@ -146,14 +138,14 @@ def _validate_dimension_judgment( min_length=50, ) - if not effective_dimension_character and not score_rationale and not strengths: + if not dimension_character and not score_rationale and not strengths: return None result: BatchDimensionJudgmentPayload = {} if strengths: result["strengths"] = strengths - if effective_dimension_character: - result["dimension_character"] = effective_dimension_character + if dimension_character: + result["dimension_character"] = dimension_character if score_rationale: result["score_rationale"] = score_rationale return result diff --git a/desloppify/app/commands/review/importing/flags.py b/desloppify/app/commands/review/importing/flags.py index 81dda1e2..b7ea44e0 100644 --- a/desloppify/app/commands/review/importing/flags.py +++ b/desloppify/app/commands/review/importing/flags.py @@ -4,7 +4,7 @@ from dataclasses import dataclass -from desloppify import state as state_mod +from desloppify.engine._state.schema import utc_now from desloppify.intelligence.review.dimensions import normalize_dimension_name from desloppify.intelligence.review.importing.contracts_types import ( NormalizedReviewImportPayload, @@ -97,7 +97,7 @@ def mark_manual_override_assessments_provisional( if not isinstance(store, dict): return 0 - now = state_mod.utc_now() + now = utc_now() expires_scan = int(state.get("scan_count", 0) or 0) + 1 marked = 0 for key in sorted(assessment_keys): diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index 1a5de798..5563f5f4 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -2,7 +2,7 @@ from __future__ import annotations -from dataclasses import dataclass, field +from dataclasses import dataclass from pathlib import Path from desloppify.app.commands.helpers.issue_id_display import short_issue_id @@ -10,8 +10,6 @@ from desloppify.base.config import target_strict_score_from_config from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS from desloppify.base.output.terminal import colorize -from desloppify.engine._plan.auto_cluster import auto_cluster_issues -from desloppify.engine._plan.constants import QueueSyncResult, is_triage_id from desloppify.engine._plan.operations.meta import append_log_entry from desloppify.engine._plan.persistence import ( has_living_plan, @@ -19,34 +17,23 @@ plan_path_for_state, save_plan, ) -from desloppify.engine._plan.policy.subjective import ( - SubjectiveVisibility, - compute_subjective_visibility, -) -from desloppify.engine._plan.reconcile_review_import import ( +from desloppify.engine._plan.sync.review_import import ( ReviewImportSyncResult, sync_plan_after_review_import, ) -from desloppify.engine._plan.refresh_lifecycle import sync_lifecycle_phase -from desloppify.engine._plan.sync.dimensions import sync_subjective_dimensions -from desloppify.engine._plan.sync.workflow_gates import ( - ScoreSnapshot, - sync_communicate_score_needed, - sync_create_plan_needed, - sync_import_scores_needed, +from desloppify.engine._plan.sync import ( + ReconcileResult, + live_planned_queue_empty, + reconcile_plan, ) +from desloppify.engine._plan.sync.workflow_gates import sync_import_scores_needed from desloppify.engine.plan_triage import ( TRIAGE_CMD_RUN_STAGES_CLAUDE, TRIAGE_CMD_RUN_STAGES_CODEX, ) -from desloppify.engine._state.issue_semantics import ( - is_assessment_request, - is_triage_finding, -) from desloppify.intelligence.review.importing.contracts_types import ( NormalizedReviewImportPayload, ) -from desloppify.state_scoring import score_snapshot @dataclass(frozen=True) @@ -66,65 +53,12 @@ class _ImportSyncInputs: covered_ids: tuple[str, ...] -@dataclass -class _PlanImportMutations: - dirty: bool = False - workflow_injected_ids: list[str] = field(default_factory=list) - import_result: ReviewImportSyncResult | None = None - stale_sync_result: QueueSyncResult | None = None - auto_cluster_changes: int = 0 - - -def _has_postflight_review_work(state: dict, *, policy) -> bool: - issues = (state.get("work_items") or state.get("issues", {})) - if any( - isinstance(issue, dict) - and issue.get("status") == "open" - and (is_triage_finding(issue) or is_assessment_request(issue)) - for issue in issues.values() - ): - return True - return bool(policy.stale_ids or policy.under_target_ids) - - -def _has_deferred_disposition_work(plan: dict) -> bool: - skipped = plan.get("skipped", {}) - if not isinstance(skipped, dict): - return False - return any( - isinstance(entry, dict) and str(entry.get("kind", "temporary")) == "temporary" - for entry in skipped.values() - ) - - -def _sync_lifecycle_phase_after_import(plan: dict, state: dict, *, policy) -> bool: - return sync_lifecycle_phase( - plan, - has_initial_reviews=bool(policy.unscored_ids), - has_objective_backlog=bool(policy.has_objective_backlog), - has_postflight_review=_has_postflight_review_work(state, policy=policy), - has_postflight_workflow=any( - item_id in plan.get("queue_order", []) - for item_id in ( - "workflow::import-scores", - "workflow::communicate-score", - "workflow::score-checkpoint", - "workflow::create-plan", - ) - ), - has_triage=any( - isinstance(item_id, str) and is_triage_id(item_id) - for item_id in plan.get("queue_order", []) - ), - has_deferred=_has_deferred_disposition_work(plan), - )[1] - - def _print_review_import_sync( state: dict, result: ReviewImportSyncResult, *, workflow_injected: bool, + triage_injected: bool, ) -> None: """Print summary of plan changes after review import sync.""" new_ids = result.new_ids @@ -132,16 +66,21 @@ def _print_review_import_sync( print() _print_new_review_items(state, new_ids) _print_stale_review_prunes(stale_pruned) - _print_review_import_footer(result, workflow_injected=workflow_injected) + _print_review_import_footer( + workflow_injected=workflow_injected, + triage_injected=triage_injected, + ) def _print_new_review_items(state: dict, new_ids: list[str]) -> None: if not new_ids: return - print(colorize( - f" Plan updated: {len(new_ids)} new review work item(s) added to queue.", - "bold", - )) + print( + colorize( + f" Plan updated: {len(new_ids)} new review work item(s) added to queue.", + "bold", + ) + ) issues = (state.get("work_items") or state.get("issues", {})) for finding_id in sorted(new_ids)[:10]: finding = issues.get(finding_id, {}) @@ -153,22 +92,26 @@ def _print_new_review_items(state: dict, new_ids: list[str]) -> None: def _print_stale_review_prunes(stale_pruned: list[str]) -> None: if not stale_pruned: return - print(colorize( - f" Plan updated: {len(stale_pruned)} stale review work item(s) removed from queue.", - "bold", - )) + print( + colorize( + f" Plan updated: {len(stale_pruned)} stale review work item(s) removed from queue.", + "bold", + ) + ) def _print_review_import_footer( - result: ReviewImportSyncResult, *, workflow_injected: bool, + triage_injected: bool, ) -> None: print() - print(colorize( - " Review queue sync completed. Workflow follow-up may be front-loaded.", - "dim", - )) + print( + colorize( + " Review queue sync completed. Workflow follow-up may be front-loaded.", + "dim", + ) + ) print() print(colorize(" View execution queue: desloppify plan queue", "dim")) print(colorize(" View newest first: desloppify plan queue --sort recent", "dim")) @@ -176,14 +119,16 @@ def _print_review_import_footer( print() print(colorize(" NEXT STEP:", "yellow")) print(colorize(" Run: desloppify next", "yellow")) - if result.triage_injected and not workflow_injected: + if triage_injected and not workflow_injected: print(colorize(f" Codex: {TRIAGE_CMD_RUN_STAGES_CODEX}", "dim")) print(colorize(f" Claude: {TRIAGE_CMD_RUN_STAGES_CLAUDE}", "dim")) print(colorize(" Manual dashboard: desloppify plan triage", "dim")) - print(colorize( - " (Follow the queue in order; score communication and planning come before triage.)", - "dim", - )) + print( + colorize( + " (Follow the queue in order; score communication and planning come before triage.)", + "dim", + ) + ) def _review_delta_present(diff: dict) -> bool: @@ -197,10 +142,12 @@ def _print_workflow_injected_message(workflow_injected_ids: list[str]) -> None: if not workflow_injected_ids: return injected_parts = [f"`{workflow_id}`" for workflow_id in workflow_injected_ids] - print(colorize( - f" Plan: {' and '.join(injected_parts)} queued. Run `desloppify next`.", - "cyan", - )) + print( + colorize( + f" Plan: {' and '.join(injected_parts)} queued. Run `desloppify next`.", + "cyan", + ) + ) def _build_import_sync_inputs( @@ -222,121 +169,38 @@ def _build_import_sync_inputs( ) -def _record_workflow_change( - mutations: _PlanImportMutations, - result, - *, - workflow_id: str, - injected: bool = True, -) -> None: - if not result.changes: - return - mutations.dirty = True - if injected: - mutations.workflow_injected_ids.append(workflow_id) - - def _sync_review_delta( - mutations: _PlanImportMutations, plan: dict, state: dict, - *, - policy: SubjectiveVisibility, sync_inputs: _ImportSyncInputs, -) -> None: +) -> ReviewImportSyncResult | None: if not sync_inputs.has_review_issue_delta: - return - mutations.import_result = sync_plan_after_review_import( - plan, - state, - policy=policy, - ) - if mutations.import_result is not None: - mutations.dirty = True - - -def _sync_subjective_queue_after_import( - mutations: _PlanImportMutations, - plan: dict, - state: dict, - *, - policy: SubjectiveVisibility, - target_strict: float, - sync_inputs: _ImportSyncInputs, -) -> None: - if not (sync_inputs.has_review_issue_delta or sync_inputs.assessment_keys): - return - cycle_just_completed = not plan.get("plan_start_scores") - mutations.stale_sync_result = sync_subjective_dimensions( + return None + return sync_plan_after_review_import( plan, state, - policy=policy, - cycle_just_completed=cycle_just_completed, + inject_triage=False, ) - if mutations.stale_sync_result.changes: - mutations.dirty = True - - mutations.auto_cluster_changes = int(auto_cluster_issues( - plan, - state, - target_strict=target_strict, - policy=policy, - )) - if mutations.auto_cluster_changes: - mutations.dirty = True - - -def _append_workflow_log_entries( - plan: dict, - *, - communicate_result, - import_scores_result, - create_plan_result, -) -> None: - if communicate_result.changes: - append_log_entry( - plan, - "sync_communicate_score", - actor="system", - detail={"trigger": "review_import", "injected": True}, - ) - if import_scores_result.changes: - injected = bool(getattr(import_scores_result, "injected", ())) - pruned = list(getattr(import_scores_result, "pruned", ())) - append_log_entry( - plan, - "sync_import_scores", - actor="system", - detail={ - "trigger": "review_import", - "injected": injected, - "pruned": pruned, - }, - ) - if create_plan_result.changes: - append_log_entry( - plan, - "sync_create_plan", - actor="system", - detail={"trigger": "review_import", "injected": True}, - ) def _append_review_import_sync_log( plan: dict, diff: dict, - mutations: _PlanImportMutations, + import_result: ReviewImportSyncResult | None, + import_scores_result, + pipeline_result: ReconcileResult, *, covered_ids: tuple[str, ...], ) -> None: if not ( - mutations.import_result is not None - or mutations.workflow_injected_ids + import_result is not None + or import_scores_result.changes + or pipeline_result.dirty or covered_ids ): return - import_result = mutations.import_result - stale_sync_result = mutations.stale_sync_result + subjective = pipeline_result.subjective + triage = pipeline_result.triage append_log_entry( plan, "review_import_sync", @@ -344,19 +208,11 @@ def _append_review_import_sync_log( detail={ "trigger": "review_import", "new_ids": sorted(import_result.new_ids) if import_result is not None else [], - "added_to_queue": ( - import_result.added_to_queue if import_result is not None else [] - ), - "workflow_injected_ids": mutations.workflow_injected_ids, - "triage_injected": ( - import_result.triage_injected if import_result is not None else False - ), - "triage_injected_ids": ( - import_result.triage_injected_ids if import_result is not None else [] - ), - "triage_deferred": ( - import_result.triage_deferred if import_result is not None else False - ), + "added_to_queue": import_result.added_to_queue if import_result is not None else [], + "workflow_injected_ids": pipeline_result.workflow_injected_ids, + "triage_injected": bool(triage and triage.injected), + "triage_injected_ids": list(triage.injected) if triage is not None else [], + "triage_deferred": bool(triage and triage.deferred), "diff_new": diff.get("new", 0), "diff_reopened": diff.get("reopened", 0), "diff_auto_resolved": diff.get("auto_resolved", 0), @@ -364,15 +220,11 @@ def _append_review_import_sync_log( import_result.stale_pruned_from_queue if import_result is not None else [] ), "covered_subjective": list(covered_ids), - "stale_sync_injected": ( - sorted(stale_sync_result.injected) - if stale_sync_result is not None else [] - ), - "stale_sync_pruned": ( - sorted(stale_sync_result.pruned) - if stale_sync_result is not None else [] - ), - "auto_cluster_changes": mutations.auto_cluster_changes, + "stale_sync_injected": sorted(subjective.injected) if subjective is not None else [], + "stale_sync_pruned": sorted(subjective.pruned) if subjective is not None else [], + "auto_cluster_changes": pipeline_result.auto_cluster_changes, + "import_scores_injected": list(getattr(import_scores_result, "injected", []) or []), + "import_scores_pruned": list(getattr(import_scores_result, "pruned", []) or []), }, ) @@ -399,26 +251,10 @@ def sync_plan_after_import( return plan = load_plan(plan_path) - policy = compute_subjective_visibility( - state, - target_strict=target_strict, - plan=plan, - ) - snapshot = score_snapshot(state) - current_scores = ScoreSnapshot( - strict=snapshot.strict, - overall=snapshot.overall, - objective=snapshot.objective, - verified=snapshot.verified, - ) - trusted_score_import = assessment_mode in {"trusted_internal", "attested_external"} - communicate_result = sync_communicate_score_needed( - plan, - state, - policy=policy, - scores_just_imported=trusted_score_import, - current_scores=current_scores, - ) + sync_inputs = _build_import_sync_inputs(diff, import_payload) + trusted = assessment_mode in {"trusted_internal", "attested_external"} + + import_result = _sync_review_delta(plan, state, sync_inputs) import_scores_result = sync_import_scores_needed( plan, state, @@ -426,70 +262,33 @@ def sync_plan_after_import( import_file=import_file, import_payload=import_payload, ) - create_plan_result = sync_create_plan_needed( - plan, - state, - policy=policy, - ) + if trusted: + plan.pop("previous_plan_start_scores", None) - sync_inputs = _build_import_sync_inputs(diff, import_payload) - mutations = _PlanImportMutations() - _record_workflow_change( - mutations, - communicate_result, - workflow_id="workflow::communicate-score", - ) - _record_workflow_change( - mutations, - import_scores_result, - workflow_id="workflow::import-scores", - injected=bool(getattr(import_scores_result, "injected", ())), - ) - _record_workflow_change( - mutations, - create_plan_result, - workflow_id="workflow::create-plan", - ) - _sync_review_delta( - mutations, - plan, - state, - policy=policy, - sync_inputs=sync_inputs, - ) - _sync_subjective_queue_after_import( - mutations, - plan, - state, - policy=policy, - target_strict=target_strict, - sync_inputs=sync_inputs, - ) + result = ReconcileResult() + if live_planned_queue_empty(plan): + result = reconcile_plan(plan, state, target_strict=target_strict) - if mutations.dirty: - if _sync_lifecycle_phase_after_import(plan, state, policy=policy): - mutations.dirty = True - _append_workflow_log_entries( - plan, - communicate_result=communicate_result, - import_scores_result=import_scores_result, - create_plan_result=create_plan_result, - ) + dirty = bool(import_result is not None or import_scores_result.changes or result.dirty) + if dirty: _append_review_import_sync_log( plan, diff, - mutations, + import_result, + import_scores_result, + result, covered_ids=sync_inputs.covered_ids, ) save_plan(plan, plan_path) - if mutations.import_result is not None: + if import_result is not None: _print_review_import_sync( state, - mutations.import_result, - workflow_injected=bool(mutations.workflow_injected_ids), + import_result, + workflow_injected=bool(result.workflow_injected_ids), + triage_injected=bool(result.triage and result.triage.injected), ) - _print_workflow_injected_message(mutations.workflow_injected_ids) + _print_workflow_injected_message(result.workflow_injected_ids) except PLAN_LOAD_EXCEPTIONS as exc: print( colorize( diff --git a/desloppify/app/commands/review/merge.py b/desloppify/app/commands/review/merge.py index 21f30a4c..f293d3db 100644 --- a/desloppify/app/commands/review/merge.py +++ b/desloppify/app/commands/review/merge.py @@ -5,12 +5,19 @@ import argparse from typing import Any, NamedTuple, TypedDict -from desloppify import state as state_mod from desloppify.app.commands.helpers.query import write_query -from desloppify.app.commands.helpers.queue_progress import show_score_with_plan_context from desloppify.app.commands.helpers.command_runtime import command_runtime +from desloppify.app.commands.helpers.queue_progress import show_score_with_plan_context from desloppify.base.output.issues import issue_weight from desloppify.base.output.terminal import colorize +from desloppify.engine._state.persistence import save_state +from desloppify.engine._state.schema import StateModel, utc_now +from desloppify.engine._state.schema_scores import ( + get_objective_score, + get_overall_score, + get_strict_score, + get_verified_strict_score, +) from desloppify.engine.work_queue import list_open_review_issues from desloppify.intelligence.narrative.core import NarrativeContext, compute_narrative from desloppify.intelligence.review.issue_merge import ( @@ -20,9 +27,6 @@ track_merged_from, ) -save_state = state_mod.save_state -utc_now = state_mod.utc_now - class ResolutionAttestationPayload(TypedDict, total=False): """Resolution metadata attached to auto-resolved duplicate issues.""" @@ -65,12 +69,12 @@ class _ScoreSnapshot(NamedTuple): verified: float | None -def _score_snapshot(state: state_mod.StateModel) -> _ScoreSnapshot: +def _score_snapshot(state: StateModel) -> _ScoreSnapshot: return _ScoreSnapshot( - overall=state_mod.get_overall_score(state), - objective=state_mod.get_objective_score(state), - strict=state_mod.get_strict_score(state), - verified=state_mod.get_verified_strict_score(state), + overall=get_overall_score(state), + objective=get_objective_score(state), + strict=get_strict_score(state), + verified=get_verified_strict_score(state), ) diff --git a/desloppify/app/commands/scan/plan_reconcile.py b/desloppify/app/commands/scan/plan_reconcile.py index 341b9bf4..cfd924c1 100644 --- a/desloppify/app/commands/scan/plan_reconcile.py +++ b/desloppify/app/commands/scan/plan_reconcile.py @@ -6,53 +6,33 @@ from typing import Any from desloppify import state as state_mod -from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS from desloppify.base.output.fallbacks import log_best_effort_failure from desloppify.base.output.terminal import colorize -from desloppify.engine._plan.auto_cluster import auto_cluster_issues +from desloppify.base.config import target_strict_score_from_config from desloppify.engine._plan.constants import ( WORKFLOW_COMMUNICATE_SCORE_ID, is_synthetic_id, - is_triage_id, ) from desloppify.engine._plan.operations.meta import append_log_entry -from desloppify.engine._plan.persistence import ( - load_plan, - save_plan, -) -from desloppify.engine._plan.policy.subjective import compute_subjective_visibility -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.persistence import load_plan, save_plan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.refresh_lifecycle import ( mark_postflight_scan_completed, ) -from desloppify.engine._plan.sync.context import is_mid_cycle -from desloppify.engine._plan.sync.dimensions import sync_subjective_dimensions -from desloppify.engine._plan.sync.triage import sync_triage_needed -from desloppify.engine._plan.sync.workflow_gates import ( - ScoreSnapshot, - sync_communicate_score_needed, - sync_create_plan_needed, +from desloppify.engine._plan.sync import ( + ReconcileResult, + live_planned_queue_empty, + reconcile_plan, ) -from desloppify.engine._plan.refresh_lifecycle import set_lifecycle_phase -from desloppify.engine._work_queue.context import queue_context -from desloppify.engine._work_queue.snapshot import coarse_phase_name +from desloppify.engine._plan.sync.context import is_mid_cycle from desloppify.engine.work_queue import build_deferred_disposition_item -from desloppify.engine._state.issue_semantics import ( - is_assessment_request, - is_triage_finding, -) logger = logging.getLogger(__name__) def _reset_cycle_for_force_rescan(plan: dict[str, object]) -> bool: - """Clear all cycle state when --force-rescan is used. - - Force-rescan means "start over" — the old cycle's triage stages, - workflow items, subjective dimensions, plan-start scores, and triage - metadata are all stale and must be removed. - """ + """Clear all cycle state when --force-rescan is used.""" order: list[str] = plan.get("queue_order", []) synthetic = [item for item in order if is_synthetic_id(item)] if not synthetic and not plan.get("plan_start_scores"): @@ -78,7 +58,6 @@ def _reset_cycle_for_force_rescan(plan: dict[str, object]) -> bool: def _plan_has_user_content(plan: dict[str, object]) -> bool: - """Return True when the living plan has any user-managed queue metadata.""" return bool( plan.get("queue_order") or plan.get("overrides") @@ -87,11 +66,10 @@ def _plan_has_user_content(plan: dict[str, object]) -> bool: ) -def _apply_plan_reconciliation(plan: dict[str, object], state: state_mod.StateModel, reconcile_fn) -> bool: - """Apply standard post-scan plan reconciliation when user content exists.""" +def _apply_plan_reconciliation(plan: dict[str, object], state: state_mod.StateModel) -> bool: if not _plan_has_user_content(plan): return False - recon = reconcile_fn(plan, state) + recon = reconcile_plan_after_scan(plan, state) if recon.resurfaced: print( colorize( @@ -102,54 +80,11 @@ def _apply_plan_reconciliation(plan: dict[str, object], state: state_mod.StateMo return bool(recon.changes) -def _sync_subjective_dimensions_display(plan: dict[str, object], state: state_mod.StateModel, sync_fn) -> bool: - """Sync all subjective dimensions (unscored + stale + under-target) in plan queue.""" - sync = sync_fn(plan, state) - if sync.resurfaced: - print( - colorize( - f" Plan: {len(sync.resurfaced)} skipped subjective dimension(s) resurfaced — never reviewed.", - "yellow", - ) - ) - if sync.pruned: - print( - colorize( - f" Plan: {len(sync.pruned)} refreshed subjective dimension(s) removed from queue.", - "cyan", - ) - ) - if sync.injected: - print( - colorize( - f" Plan: {len(sync.injected)} subjective dimension(s) queued for review.", - "cyan", - ) - ) - return bool(sync.changes) - - -def _sync_auto_clusters( - plan: dict[str, object], - state: state_mod.StateModel, - *, - target_strict: float = DEFAULT_TARGET_STRICT_SCORE, - policy=None, -) -> bool: - """Regenerate automatic task clusters after scan merge.""" - return bool(auto_cluster_issues( - plan, state, - target_strict=target_strict, - policy=policy, - )) - - def _seed_plan_start_scores(plan: dict[str, object], state: state_mod.StateModel) -> bool: """Set plan_start_scores when beginning a new queue cycle.""" existing = plan.get("plan_start_scores") if existing and not isinstance(existing, dict): return False - # Seed when empty OR when it's the reset sentinel ({"reset": True}) if existing and not existing.get("reset"): return False scores = state_mod.score_snapshot(state) @@ -161,9 +96,7 @@ def _seed_plan_start_scores(plan: dict[str, object], state: state_mod.StateModel "objective": scores.objective, "verified": scores.verified, } - # New cycle — clear the communicate-score sentinel so it can fire again. plan.pop("previous_plan_start_scores", None) - # Record scan count at cycle start so gates can detect whether a new scan ran plan["scan_count_at_plan_start"] = int(state.get("scan_count", 0) or 0) return True @@ -174,9 +107,7 @@ def _has_objective_cycle( ) -> bool | None: """Return True when objective queue work exists and a cycle baseline should freeze.""" try: - from desloppify.app.commands.helpers.queue_progress import ( - plan_aware_queue_breakdown, - ) + from desloppify.app.commands.helpers.queue_progress import plan_aware_queue_breakdown breakdown = plan_aware_queue_breakdown(state, plan) except PLAN_LOAD_EXCEPTIONS as exc: @@ -191,8 +122,6 @@ def _clear_plan_start_scores_if_queue_empty( """Clear plan-start score snapshot once the queue is fully drained.""" if not plan.get("plan_start_scores"): return False - # Don't clear while communicate-score is pending — the rebaseline just - # set plan_start_scores and the user hasn't seen the update yet. if WORKFLOW_COMMUNICATE_SCORE_ID in plan.get("queue_order", []): return False @@ -213,8 +142,6 @@ def _clear_plan_start_scores_if_queue_empty( return False state["_plan_start_scores_for_reveal"] = dict(plan["plan_start_scores"]) plan["plan_start_scores"] = {} - # Clear the cycle sentinel so communicate-score can be injected - # in the next cycle. plan.pop("previous_plan_start_scores", None) return True @@ -235,139 +162,6 @@ def _mark_postflight_scan_completed_if_ready( ) -def _subjective_policy_context( - runtime: Any, - plan: dict[str, object], -) -> tuple[float, object, bool]: - from desloppify.base.config import target_strict_score_from_config - - target_strict = target_strict_score_from_config(runtime.config) - policy = compute_subjective_visibility( - runtime.state, - target_strict=target_strict, - plan=plan, - ) - cycle_just_completed = not plan.get("plan_start_scores") - return target_strict, policy, cycle_just_completed - - -def _sync_subjective_and_log( - plan: dict[str, object], - state: state_mod.StateModel, - *, - policy, - cycle_just_completed: bool, -) -> bool: - changed = _sync_subjective_dimensions_display( - plan, - state, - lambda p, s: sync_subjective_dimensions( - p, - s, - policy=policy, - cycle_just_completed=cycle_just_completed, - ), - ) - if changed: - append_log_entry(plan, "sync_subjective", actor="system", detail={"changes": True}) - return changed - - -def _sync_auto_clusters_and_log( - plan: dict[str, object], - state: state_mod.StateModel, - *, - target_strict: float, - policy, -) -> bool: - changed = _sync_auto_clusters( - plan, - state, - target_strict=target_strict, - policy=policy, - ) - if changed: - append_log_entry(plan, "auto_cluster", actor="system", detail={"changes": True}) - return changed - - -def _sync_triage_and_log( - plan: dict[str, object], - state: state_mod.StateModel, - *, - policy=None, -) -> bool: - triage_sync = sync_triage_needed(plan, state, policy=policy) - if triage_sync.deferred: - meta = plan.get("epic_triage_meta", {}) - if meta.get("triage_recommended"): - print( - colorize( - " Plan: review work items changed — triage recommended after current work.", - "dim", - ) - ) - return False - if not triage_sync.changes: - return False - if triage_sync.injected: - print( - colorize( - " Plan: planning mode needed — review work items changed since last triage.", - "cyan", - ) - ) - append_log_entry(plan, "sync_triage", actor="system", detail={"injected": True}) - return True - - -def _sync_communicate_score_and_log( - plan: dict[str, object], - state: state_mod.StateModel, - *, - policy, -) -> bool: - snapshot = state_mod.score_snapshot(state) - current_scores = ScoreSnapshot( - strict=snapshot.strict, - overall=snapshot.overall, - objective=snapshot.objective, - verified=snapshot.verified, - ) - communicate_sync = sync_communicate_score_needed( - plan, state, policy=policy, current_scores=current_scores, - ) - if not communicate_sync.changes: - return False - append_log_entry( - plan, - "sync_communicate_score", - actor="system", - detail={"injected": True}, - ) - return True - - -def _sync_create_plan_and_log( - plan: dict[str, object], - state: state_mod.StateModel, - *, - policy, -) -> bool: - create_plan_sync = sync_create_plan_needed(plan, state, policy=policy) - if not create_plan_sync.changes: - return False - if create_plan_sync.injected: - print( - colorize( - " Plan: reviews complete — `workflow::create-plan` queued.", - "cyan", - ) - ) - append_log_entry(plan, "sync_create_plan", actor="system", detail={"injected": True}) - return True - - def _sync_plan_start_scores_and_log( plan: dict[str, object], state: state_mod.StateModel, @@ -376,8 +170,6 @@ def _sync_plan_start_scores_and_log( if seeded: append_log_entry(plan, "seed_start_scores", actor="system", detail={}) return True - # Only clear scores that existed before this reconcile pass — - # never clear scores we just seeded in the same scan. cleared = _clear_plan_start_scores_if_queue_empty(state, plan) if cleared: append_log_entry(plan, "clear_start_scores", actor="system", detail={}) @@ -399,143 +191,82 @@ def _sync_postflight_scan_completion_and_log( return changed -def _has_postflight_review_work( - state: state_mod.StateModel, - *, - policy, -) -> bool: - issues = (state.get("work_items") or state.get("issues", {})) - has_review_like_issue = any( - isinstance(issue, dict) - and issue.get("status") == "open" - and (is_triage_finding(issue) or is_assessment_request(issue)) - for issue in issues.values() - ) - if has_review_like_issue: - return True - return bool(policy.stale_ids or policy.under_target_ids) - - -def _has_postflight_workflow_items(plan: dict[str, object]) -> bool: - order = plan.get("queue_order", []) - return any( - item_id in order - for item_id in ( - "workflow::import-scores", - "workflow::communicate-score", - "workflow::score-checkpoint", - "workflow::create-plan", - ) - ) - - -def _has_triage_items(plan: dict[str, object]) -> bool: - return any( - isinstance(item_id, str) and is_triage_id(item_id) - for item_id in plan.get("queue_order", []) - ) - - -def _sync_lifecycle_phase_and_log( - plan: dict[str, object], - state: state_mod.StateModel, -) -> bool: - phase = coarse_phase_name(queue_context(state, plan=plan).snapshot.phase) - changed = set_lifecycle_phase(plan, phase) - if changed: - append_log_entry( - plan, - "sync_lifecycle_phase", - actor="system", - detail={"phase": phase}, - ) - return changed - - def _sync_post_scan_without_policy( *, plan: dict[str, object], state: state_mod.StateModel, ) -> bool: """Run post-scan sync steps that do not require subjective policy context.""" - return bool(_apply_plan_reconciliation(plan, state, reconcile_plan_after_scan)) + return bool(_apply_plan_reconciliation(plan, state)) def _is_mid_cycle_scan(plan: dict[str, object], state: state_mod.StateModel) -> bool: - """Return True when a plan cycle is active and queue items remain. - - Extends ``is_mid_cycle`` (which checks ``plan_start_scores``) with an - additional queue-items guard — even if a cycle is nominally active, we - only skip destructive operations when work actually remains. - - Mid-cycle scans (via --force-rescan or PHASE_TRANSITION gate) must NOT - regenerate clusters or inject triage stages — doing so wipes triage - state and reorders the queue, undoing prioritisation work. - """ + """Return True when a plan cycle is active and queue items remain.""" if not is_mid_cycle(plan): return False - order = plan.get("queue_order", []) - skipped = plan.get("skipped", {}) - return any(item not in skipped for item in order) + return not live_planned_queue_empty(plan) -def _sync_post_scan_with_policy( +def _display_reconcile_results( + result: ReconcileResult, + plan: dict, *, - plan: dict[str, object], - state: state_mod.StateModel, - target_strict: float, - policy, - cycle_just_completed: bool, - force_rescan: bool = False, -) -> bool: - """Run post-scan sync steps that require policy/cycle context. - - When running mid-cycle (plan_start_scores set, queue non-empty) or - via --force-rescan, skip auto-clustering and triage injection. These - steps regenerate queue structure and issue IDs, which wipes triage - state and reorders the queue. They only run at cycle boundaries - (pre-flight / post-flight). - """ - dirty = False - mid_cycle = _is_mid_cycle_scan(plan, state) or force_rescan - - if _sync_subjective_and_log( - plan, - state, - policy=policy, - cycle_just_completed=cycle_just_completed, + mid_cycle: bool, +) -> None: + subjective = result.subjective + if subjective and subjective.resurfaced: + print( + colorize( + f" Plan: {len(subjective.resurfaced)} skipped subjective dimension(s) resurfaced — never reviewed.", + "yellow", + ) + ) + if subjective and subjective.pruned: + print( + colorize( + f" Plan: {len(subjective.pruned)} refreshed subjective dimension(s) removed from queue.", + "cyan", + ) + ) + if subjective and subjective.injected: + print( + colorize( + f" Plan: {len(subjective.injected)} subjective dimension(s) queued for review.", + "cyan", + ) + ) + if mid_cycle and not result.auto_cluster_changes: + print( + colorize( + " Plan: mid-cycle scan — skipping cluster regeneration to preserve queue state.", + "dim", + ) + ) + if result.create_plan and result.create_plan.injected: + print( + colorize( + " Plan: reviews complete — `workflow::create-plan` queued.", + "cyan", + ) + ) + if ( + result.triage + and result.triage.deferred + and plan.get("epic_triage_meta", {}).get("triage_recommended") ): - dirty = True - if not mid_cycle: - if _sync_auto_clusters_and_log( - plan, - state, - target_strict=target_strict, - policy=policy, - ): - dirty = True - else: print( colorize( - " Plan: mid-cycle scan — skipping cluster regeneration to " - "preserve queue state.", + " Plan: review work items changed — triage recommended after current work.", "dim", ) ) - if _sync_communicate_score_and_log(plan, state, policy=policy): - dirty = True - if _sync_create_plan_and_log(plan, state, policy=policy): - dirty = True - if _sync_triage_and_log(plan, state, policy=policy): - dirty = True - if not force_rescan: - if _sync_plan_start_scores_and_log(plan, state): - dirty = True - if _sync_postflight_scan_completion_and_log(plan, state): - dirty = True - if _sync_lifecycle_phase_and_log(plan, state): - dirty = True - return dirty + if result.triage and result.triage.injected: + print( + colorize( + " Plan: planning mode needed — review work items changed since last triage.", + "cyan", + ) + ) def reconcile_plan_post_scan(runtime: Any) -> None: @@ -548,31 +279,47 @@ def reconcile_plan_post_scan(runtime: Any) -> None: return force_rescan = getattr(runtime, "force_rescan", False) - - # Force-rescan: clear all cycle state first. The user explicitly chose - # to start over, so triage stages, workflow items, subjective dimensions, - # and plan-start scores from the old cycle are all stale. dirty = _reset_cycle_for_force_rescan(plan) if force_rescan else False - dirty = _sync_post_scan_without_policy(plan=plan, state=runtime.state) or dirty - # Policy must be computed after reconciliation, which mutates plan - # (supersede/prune resolved issues) before policy reads it. - target_strict, policy, cycle_just_completed = _subjective_policy_context( - runtime, - plan, - ) - dirty = _sync_post_scan_with_policy( - plan=plan, - state=runtime.state, - target_strict=target_strict, - policy=policy, - cycle_just_completed=cycle_just_completed, - force_rescan=getattr(runtime, "force_rescan", False), - ) or dirty + boundary_crossed = live_planned_queue_empty(plan) + if boundary_crossed: + result = reconcile_plan( + plan, + runtime.state, + target_strict=target_strict_score_from_config(runtime.config), + ) + _display_reconcile_results( + result, + plan, + mid_cycle=_is_mid_cycle_scan(plan, runtime.state) or force_rescan, + ) + dirty = result.dirty or dirty + + if not force_rescan: + if _sync_plan_start_scores_and_log(plan, runtime.state): + dirty = True + if _sync_postflight_scan_completion_and_log(plan, runtime.state): + dirty = True if dirty: try: save_plan(plan, plan_path) except PLAN_LOAD_EXCEPTIONS as exc: logger.warning("Plan reconciliation save failed: %s", exc) + + +__all__ = [ + "_clear_plan_start_scores_if_queue_empty", + "_display_reconcile_results", + "_has_objective_cycle", + "_is_mid_cycle_scan", + "_mark_postflight_scan_completed_if_ready", + "_reset_cycle_for_force_rescan", + "_seed_plan_start_scores", + "_sync_plan_start_scores_and_log", + "_sync_post_scan_without_policy", + "_sync_postflight_scan_completion_and_log", + "reconcile_plan_after_scan", + "reconcile_plan_post_scan", +] diff --git a/desloppify/engine/_plan/__init__.py b/desloppify/engine/_plan/__init__.py index ea9aa49f..8f823ea9 100644 --- a/desloppify/engine/_plan/__init__.py +++ b/desloppify/engine/_plan/__init__.py @@ -14,7 +14,7 @@ Other modules: - persistence: JSON read/write with atomic saves -- reconcile: post-scan plan↔state synchronization +- scan_issue_reconcile: post-scan stale/dead-reference synchronization - auto_cluster: automatic issue clustering - commit_tracking: git commit↔plan-item linking diff --git a/desloppify/engine/_plan/auto_cluster.py b/desloppify/engine/_plan/auto_cluster.py index ac803213..aeae9c88 100644 --- a/desloppify/engine/_plan/auto_cluster.py +++ b/desloppify/engine/_plan/auto_cluster.py @@ -3,6 +3,7 @@ from __future__ import annotations from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE +from desloppify.engine._plan.cluster_semantics import cluster_is_active from desloppify.engine._plan.constants import AUTO_PREFIX from desloppify.engine._plan.auto_cluster_sync import ( prune_stale_clusters as _prune_stale_clusters, @@ -11,6 +12,7 @@ ) from desloppify.engine._plan.schema import PlanModel, ensure_plan_defaults from desloppify.engine._plan.policy.subjective import SubjectiveVisibility +from desloppify.engine._plan.sync.context import is_mid_cycle from desloppify.engine._state.schema import StateModel, utc_now # --------------------------------------------------------------------------- @@ -144,6 +146,28 @@ def _sync_auto_clusters( return changes +def _sync_active_auto_cluster_queue_membership(plan: PlanModel) -> int: + order: list[str] = plan.get("queue_order", []) + skipped = set(plan.get("skipped", {}).keys()) + existing = set(order) + added = 0 + for cluster in plan.get("clusters", {}).values(): + if not isinstance(cluster, dict) or not cluster.get("auto") or not cluster_is_active(cluster): + continue + for issue_id in cluster.get("issue_ids", []): + if ( + not isinstance(issue_id, str) + or not issue_id + or issue_id in skipped + or issue_id in existing + ): + continue + order.append(issue_id) + existing.add(issue_id) + added += 1 + return added + + def auto_cluster_issues( plan: PlanModel, state: StateModel, @@ -156,6 +180,8 @@ def auto_cluster_issues( Returns count of changes made (clusters created, updated, or deleted). """ ensure_plan_defaults(plan) + if is_mid_cycle(plan): + return 0 issues = (state.get("work_items") or state.get("issues", {})) clusters = plan.get("clusters", {}) @@ -172,6 +198,7 @@ def auto_cluster_issues( policy=policy, ) changes += _repair_ghost_cluster_refs(plan, now) + changes += _sync_active_auto_cluster_queue_membership(plan) plan["updated"] = now return changes diff --git a/desloppify/engine/_plan/auto_cluster_sync_issue.py b/desloppify/engine/_plan/auto_cluster_sync_issue.py index 5cbd6ffb..a794b176 100644 --- a/desloppify/engine/_plan/auto_cluster_sync_issue.py +++ b/desloppify/engine/_plan/auto_cluster_sync_issue.py @@ -6,7 +6,13 @@ from dataclasses import dataclass from desloppify.base.registry import DETECTORS -from desloppify.engine._plan.cluster_semantics import normalize_cluster_semantics +from desloppify.engine._plan.cluster_semantics import ( + EXECUTION_STATUS_ACTIVE, + EXECUTION_STATUS_REVIEW, + EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE, + infer_cluster_execution_policy, + normalize_cluster_semantics, +) from desloppify.engine._plan.cluster_strategy import ( cluster_name_from_key as _cluster_name_from_key, ) @@ -23,6 +29,19 @@ _MIN_CLUSTER_SIZE = 2 +def _auto_cluster_execution_status( + cluster: dict, + *, + detector: str = "", +) -> str: + if ( + infer_cluster_execution_policy(cluster, detector=detector) + == EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE + ): + return EXECUTION_STATUS_ACTIVE + return EXECUTION_STATUS_REVIEW + + @dataclass(frozen=True) class AutoClusterSyncResult: """Explicit result describing what `_sync_auto_cluster` changed.""" @@ -135,6 +154,11 @@ def _sync_auto_cluster( cluster["action"] = action cluster["updated_at"] = now changes = 1 + execution_status = _auto_cluster_execution_status(cluster, detector=detector) + if cluster.get("execution_status") != execution_status: + cluster["execution_status"] = execution_status + cluster["updated_at"] = now + changes = 1 if normalize_cluster_semantics(cluster, detector=detector): cluster["updated_at"] = now changes = 1 @@ -148,6 +172,10 @@ def _sync_auto_cluster( "auto": True, "cluster_key": cluster_key, "action": action, + "execution_status": _auto_cluster_execution_status( + {"auto": True, "action": action}, + detector=detector, + ), "user_modified": False, } if optional: diff --git a/desloppify/engine/_plan/cluster_semantics.py b/desloppify/engine/_plan/cluster_semantics.py index 2fc90a96..b0c1f2d2 100644 --- a/desloppify/engine/_plan/cluster_semantics.py +++ b/desloppify/engine/_plan/cluster_semantics.py @@ -15,6 +15,8 @@ ACTION_TYPE_REFACTOR = "refactor" ACTION_TYPE_MANUAL_FIX = "manual_fix" ACTION_TYPE_REORGANIZE = "reorganize" +EXECUTION_STATUS_ACTIVE = "active" +EXECUTION_STATUS_REVIEW = "review" VALID_ACTION_TYPES = frozenset( { ACTION_TYPE_AUTO_FIX, @@ -32,6 +34,12 @@ EXECUTION_POLICY_PLANNED_ONLY, } ) +VALID_EXECUTION_STATUSES = frozenset( + { + EXECUTION_STATUS_ACTIVE, + EXECUTION_STATUS_REVIEW, + } +) def _action_text(cluster: MutableMapping[str, Any] | dict[str, Any]) -> str: @@ -87,6 +95,16 @@ def infer_cluster_execution_policy( return EXECUTION_POLICY_PLANNED_ONLY +def infer_cluster_execution_status( + cluster: MutableMapping[str, Any] | dict[str, Any], +) -> str: + """Return whether the cluster is active queue work or review backlog.""" + explicit = str(cluster.get("execution_status") or "").strip() + if explicit in VALID_EXECUTION_STATUSES: + return explicit + return EXECUTION_STATUS_REVIEW + + def normalize_cluster_semantics( cluster: MutableMapping[str, Any], *, @@ -95,9 +113,11 @@ def normalize_cluster_semantics( """Populate canonical semantic fields and report whether anything changed.""" explicit_action_type = str(cluster.get("action_type") or "").strip() explicit_execution_policy = str(cluster.get("execution_policy") or "").strip() + explicit_execution_status = str(cluster.get("execution_status") or "").strip() if ( explicit_action_type not in VALID_ACTION_TYPES and explicit_execution_policy not in VALID_EXECUTION_POLICIES + and explicit_execution_status not in VALID_EXECUTION_STATUSES and cluster.get("auto") and not detector ): @@ -109,6 +129,7 @@ def normalize_cluster_semantics( action_type = infer_cluster_action_type(cluster, detector=detector) execution_policy = infer_cluster_execution_policy(cluster, detector=detector) + execution_status = infer_cluster_execution_status(cluster) changed = False if cluster.get("action_type") != action_type: cluster["action_type"] = action_type @@ -116,6 +137,9 @@ def normalize_cluster_semantics( if cluster.get("execution_policy") != execution_policy: cluster["execution_policy"] = execution_policy changed = True + if cluster.get("execution_status") != execution_status: + cluster["execution_status"] = execution_status + changed = True return changed @@ -130,6 +154,12 @@ def cluster_allows_ephemeral_execution( ) +def cluster_is_active( + cluster: MutableMapping[str, Any] | dict[str, Any], +) -> bool: + return infer_cluster_execution_status(cluster) == EXECUTION_STATUS_ACTIVE + + def cluster_autofix_hint( cluster: MutableMapping[str, Any] | dict[str, Any], *, @@ -147,11 +177,15 @@ def cluster_autofix_hint( "ACTION_TYPE_MANUAL_FIX", "ACTION_TYPE_REFACTOR", "ACTION_TYPE_REORGANIZE", + "EXECUTION_STATUS_ACTIVE", + "EXECUTION_STATUS_REVIEW", "EXECUTION_POLICY_EPHEMERAL_AUTOPROMOTE", "EXECUTION_POLICY_PLANNED_ONLY", "cluster_allows_ephemeral_execution", "cluster_autofix_hint", + "cluster_is_active", "infer_cluster_action_type", + "infer_cluster_execution_status", "infer_cluster_execution_policy", "normalize_cluster_semantics", ] diff --git a/desloppify/engine/_plan/operations/cluster.py b/desloppify/engine/_plan/operations/cluster.py index 34578dc6..807fcd6b 100644 --- a/desloppify/engine/_plan/operations/cluster.py +++ b/desloppify/engine/_plan/operations/cluster.py @@ -4,6 +4,7 @@ from desloppify.engine._plan.cluster_semantics import ( ACTION_TYPE_MANUAL_FIX, + EXECUTION_STATUS_ACTIVE, EXECUTION_POLICY_PLANNED_ONLY, ) from desloppify.engine._plan.operations.lifecycle import clear_focus_if_cluster_empty @@ -85,6 +86,7 @@ def create_cluster( "action": action, "action_type": ACTION_TYPE_MANUAL_FIX, "execution_policy": EXECUTION_POLICY_PLANNED_ONLY, + "execution_status": EXECUTION_STATUS_ACTIVE, "user_modified": False, } plan["clusters"][name] = cluster diff --git a/desloppify/engine/_plan/persistence.py b/desloppify/engine/_plan/persistence.py index 8eb318fd..1e323d52 100644 --- a/desloppify/engine/_plan/persistence.py +++ b/desloppify/engine/_plan/persistence.py @@ -43,6 +43,7 @@ class PlanLoadStatus: plan: PlanModel | None degraded: bool error_kind: str | None = None + recovery: str | None = None def get_plan_file() -> Path: @@ -89,36 +90,11 @@ def plan_lock(path: Path | None = None) -> Iterator[None]: os.close(fd) -def load_plan(path: Path | None = None) -> PlanModel: - """Load plan from disk, or return empty plan on missing/corruption.""" - plan_path = path or _default_plan_file() - if not plan_path.exists(): - return empty_plan() - - try: - data = json.loads(plan_path.read_text()) - except (json.JSONDecodeError, UnicodeDecodeError, OSError) as ex: - # Try backup before giving up - backup = plan_path.with_suffix(".json.bak") - if backup.exists(): - try: - data = json.loads(backup.read_text()) - logger.warning("Plan file corrupted (%s), loaded from backup.", ex) - print(f" Warning: Plan file corrupted ({ex}), loaded from backup.", file=sys.stderr) - # Fall through to validation below - except (json.JSONDecodeError, UnicodeDecodeError, OSError) as backup_ex: - logger.warning("Plan file and backup both corrupted: %s / %s", ex, backup_ex) - print(f" Warning: Plan file corrupted ({ex}). Starting fresh.", file=sys.stderr) - return empty_plan() - else: - logger.warning("Plan file corrupted (%s). Starting fresh.", ex) - print(f" Warning: Plan file corrupted ({ex}). Starting fresh.", file=sys.stderr) - return empty_plan() - +def _load_validated_plan(plan_path: Path) -> PlanModel: + """Load, normalize, and validate one plan payload from disk.""" + data = json.loads(plan_path.read_text()) if not isinstance(data, dict): - logger.warning("Plan file root is not a JSON object. Starting fresh.") - print(" Warning: Plan file root must be a JSON object. Starting fresh.", file=sys.stderr) - return empty_plan() + raise ValueError("Plan file root must be a JSON object.") version = data.get("version", 1) if version > PLAN_VERSION: @@ -130,13 +106,7 @@ def load_plan(path: Path | None = None) -> PlanModel: ) ensure_plan_defaults(data) - try: - validate_plan(data) - except ValueError as ex: - logger.warning("Plan invariants invalid (%s). Starting fresh.", ex) - print(f" Warning: Plan invariants invalid ({ex}). Starting fresh.", file=sys.stderr) - return empty_plan() - + validate_plan(data) return cast(PlanModel, data) @@ -144,21 +114,59 @@ def resolve_plan_load_status(path: Path | None = None) -> PlanLoadStatus: """Load a plan with explicit degraded-mode metadata.""" plan_path = path or _default_plan_file() if not plan_path.exists(): - return PlanLoadStatus(plan=None, degraded=False, error_kind=None) + return PlanLoadStatus(plan=None, degraded=False, error_kind=None, recovery=None) try: return PlanLoadStatus( - plan=load_plan(plan_path), + plan=_load_validated_plan(plan_path), degraded=False, error_kind=None, + recovery=None, ) except PLAN_LOAD_EXCEPTIONS as exc: + backup = plan_path.with_suffix(".json.bak") + if backup.exists(): + try: + plan = _load_validated_plan(backup) + logger.warning( + "Plan file load degraded for %s (%s); recovered from backup %s.", + plan_path, + exc, + backup, + ) + print( + f" Warning: Plan file load degraded ({exc}); recovered from backup.", + file=sys.stderr, + ) + return PlanLoadStatus( + plan=plan, + degraded=True, + error_kind=exc.__class__.__name__, + recovery="backup", + ) + except PLAN_LOAD_EXCEPTIONS as backup_exc: + logger.warning( + "Plan file and backup both failed for %s: %s / %s", + plan_path, + exc, + backup_exc, + ) + + logger.warning("Plan file load degraded for %s (%s); starting fresh.", plan_path, exc) + print(f" Warning: Plan file load degraded ({exc}); starting fresh.", file=sys.stderr) return PlanLoadStatus( - plan=None, + plan=empty_plan(), degraded=True, error_kind=exc.__class__.__name__, + recovery="fresh_start", ) +def load_plan(path: Path | None = None) -> PlanModel: + """Load plan from disk, or return empty plan on missing/corruption.""" + status = resolve_plan_load_status(path) + return status.plan or empty_plan() + + def save_plan(plan: PlanModel | dict, path: Path | None = None) -> None: """Validate and save plan to disk atomically.""" ensure_plan_defaults(plan) diff --git a/desloppify/engine/_plan/reconcile.py b/desloppify/engine/_plan/scan_issue_reconcile.py similarity index 97% rename from desloppify/engine/_plan/reconcile.py rename to desloppify/engine/_plan/scan_issue_reconcile.py index 4de0965a..dfd07839 100644 --- a/desloppify/engine/_plan/reconcile.py +++ b/desloppify/engine/_plan/scan_issue_reconcile.py @@ -1,4 +1,4 @@ -"""Post-scan plan reconciliation — handle issue churn.""" +"""Post-scan reconciliation for stale or disappeared issue references.""" from __future__ import annotations @@ -11,10 +11,6 @@ from desloppify.engine._plan.operations.meta import append_log_entry from desloppify.engine._plan.operations.skip import resurface_stale_skips from desloppify.engine._plan.promoted_ids import prune_promoted_ids -from desloppify.engine._plan.reconcile_review_import import ( - ReviewImportSyncResult, - sync_plan_after_review_import, -) from desloppify.engine._plan.schema import ( EPIC_PREFIX, PlanModel, @@ -322,7 +318,5 @@ def reconcile_plan_after_scan( __all__ = [ "ReconcileResult", - "ReviewImportSyncResult", "reconcile_plan_after_scan", - "sync_plan_after_review_import", ] diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 017778a9..6012be9b 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -58,6 +58,7 @@ class Cluster(TypedDict, total=False): action: str | None # Primary resolution command/guidance text action_type: str execution_policy: str + execution_status: str user_modified: bool # True when user manually edits membership optional: bool thesis: str @@ -325,6 +326,21 @@ def _tracked_plan_ids(plan: dict[str, Any] | None) -> set[str]: return tracked +def live_planned_queue_ids(plan: dict[str, Any] | None) -> set[str]: + """Return substantive live queue IDs sourced only from ``queue_order``.""" + if not isinstance(plan, dict): + return set() + skipped_ids = set(plan.get("skipped", {}).keys()) + return { + str(issue_id) + for issue_id in plan.get("queue_order", []) + if isinstance(issue_id, str) + and issue_id + and issue_id not in skipped_ids + and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) + } + + def executable_objective_ids( all_objective_ids: set[str], plan: dict[str, Any] | None, @@ -338,26 +354,12 @@ def executable_objective_ids( """ if not isinstance(plan, dict): return set(all_objective_ids) - tracked_ids = _tracked_plan_ids(plan) skipped_ids = set(plan.get("skipped", {}).keys()) - tracked_objective_ids = tracked_ids & set(all_objective_ids) - queued_ids = { - issue_id - for issue_id in plan.get("queue_order", []) - if issue_id not in skipped_ids - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - } - queued_objective_ids = all_objective_ids & queued_ids - has_active_plan_structure = bool( - plan.get("queue_order") or plan.get("clusters") or plan.get("overrides") - ) - if not tracked_ids: - return set(all_objective_ids) - skipped_ids - if not tracked_objective_ids: - return set(all_objective_ids) - skipped_ids + live_queue_ids = live_planned_queue_ids(plan) + queued_objective_ids = all_objective_ids & live_queue_ids if queued_objective_ids: return queued_objective_ids - if not has_active_plan_structure: + if not live_queue_ids: return set(all_objective_ids) - skipped_ids return set() @@ -412,6 +414,7 @@ def validate_plan(plan: dict[str, Any]) -> None: "empty_plan", "ensure_plan_defaults", "executable_objective_ids", + "live_planned_queue_ids", "triage_clusters", "validate_plan", ] diff --git a/desloppify/engine/_plan/sync/__init__.py b/desloppify/engine/_plan/sync/__init__.py index bffcc616..511ac78d 100644 --- a/desloppify/engine/_plan/sync/__init__.py +++ b/desloppify/engine/_plan/sync/__init__.py @@ -4,15 +4,38 @@ ``engine._plan`` namespace: - ``context``: shared cycle/objective backlog predicates - ``dimensions``: subjective dimension queue sync +- ``pipeline``: shared boundary-triggered reconcile pipeline +- ``review_import``: review-import-specific queue mutation before boundary sync - ``triage``: triage-stage queue sync - ``workflow``: workflow gate queue sync - ``auto_prune``: auto-cluster stale pruning helper """ +from __future__ import annotations + +from typing import Any + __all__ = [ + "ReconcileResult", "auto_prune", "context", "dimensions", + "live_planned_queue_empty", + "pipeline", + "reconcile_plan", + "review_import", "triage", "workflow", ] + + +def __getattr__(name: str) -> Any: + if name in {"ReconcileResult", "live_planned_queue_empty", "reconcile_plan"}: + from .pipeline import ReconcileResult, live_planned_queue_empty, reconcile_plan + + return { + "ReconcileResult": ReconcileResult, + "live_planned_queue_empty": live_planned_queue_empty, + "reconcile_plan": reconcile_plan, + }[name] + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/desloppify/engine/_plan/sync/pipeline.py b/desloppify/engine/_plan/sync/pipeline.py new file mode 100644 index 00000000..3f8e80fd --- /dev/null +++ b/desloppify/engine/_plan/sync/pipeline.py @@ -0,0 +1,174 @@ +"""Shared boundary-triggered plan reconciliation pipeline.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from desloppify.state_scoring import score_snapshot +from desloppify.engine._plan.auto_cluster import auto_cluster_issues +from desloppify.engine._plan.constants import QueueSyncResult, is_synthetic_id +from desloppify.engine._plan.operations.meta import append_log_entry +from desloppify.engine._plan.policy.subjective import compute_subjective_visibility +from desloppify.engine._plan.refresh_lifecycle import set_lifecycle_phase +from desloppify.engine._plan.sync.dimensions import sync_subjective_dimensions +from desloppify.engine._plan.sync.triage import sync_triage_needed +from desloppify.engine._plan.sync.workflow import ( + ScoreSnapshot, + sync_communicate_score_needed, + sync_create_plan_needed, +) + + +@dataclass +class ReconcileResult: + """Mutation summary for one boundary-triggered reconcile pass.""" + + subjective: QueueSyncResult | None = None + auto_cluster_changes: int = 0 + communicate_score: QueueSyncResult | None = None + create_plan: QueueSyncResult | None = None + triage: QueueSyncResult | None = None + lifecycle_phase: str = "" + lifecycle_phase_changed: bool = False + + @property + def dirty(self) -> bool: + return any( + ( + self.subjective is not None and bool(self.subjective.changes), + self.auto_cluster_changes > 0, + self.communicate_score is not None + and bool(self.communicate_score.changes), + self.create_plan is not None + and bool(self.create_plan.changes), + self.triage is not None + and bool( + self.triage.changes + or getattr(self.triage, "deferred", False) + ), + self.lifecycle_phase_changed, + ) + ) + + @property + def workflow_injected_ids(self) -> list[str]: + injected: list[str] = [] + for result in (self.communicate_score, self.create_plan): + if result is None: + continue + injected.extend(list(result.injected)) + return injected + + +def _current_scores(state: dict) -> ScoreSnapshot: + snapshot = score_snapshot(state) + return ScoreSnapshot( + strict=snapshot.strict, + overall=snapshot.overall, + objective=snapshot.objective, + verified=snapshot.verified, + ) + + +def _log_gate_changes(plan: dict, action: str, detail: dict[str, object]) -> None: + append_log_entry(plan, action, actor="system", detail=detail) + + +def _persist_lifecycle( + plan: dict, state: dict, *, target_strict: float, +) -> tuple[str, bool]: + from desloppify.engine._work_queue.context import queue_context + from desloppify.engine._work_queue.snapshot import coarse_phase_name + + phase = coarse_phase_name( + queue_context(state, plan=plan, target_strict=target_strict).snapshot.phase + ) + return phase, set_lifecycle_phase(plan, phase) + + +def live_planned_queue_empty(plan: dict) -> bool: + """Return True when queue_order has no remaining substantive items.""" + order = plan.get("queue_order", []) + skipped = plan.get("skipped", {}) + return not any( + isinstance(item_id, str) + and item_id not in skipped + and not is_synthetic_id(item_id) + for item_id in order + ) + + +def reconcile_plan(plan: dict, state: dict, *, target_strict: float) -> ReconcileResult: + """Run the shared boundary reconciliation pipeline.""" + result = ReconcileResult() + if not live_planned_queue_empty(plan): + return result + + policy = compute_subjective_visibility( + state, + target_strict=target_strict, + plan=plan, + ) + cycle_just_completed = not plan.get("plan_start_scores") + + result.subjective = sync_subjective_dimensions( + plan, + state, + policy=policy, + cycle_just_completed=cycle_just_completed, + ) + if result.subjective.changes: + _log_gate_changes(plan, "sync_subjective", {"changes": True}) + + result.auto_cluster_changes = int( + auto_cluster_issues( + plan, + state, + target_strict=target_strict, + policy=policy, + ) + ) + if result.auto_cluster_changes: + _log_gate_changes(plan, "auto_cluster", {"changes": True}) + + result.communicate_score = sync_communicate_score_needed( + plan, + state, + policy=policy, + current_scores=_current_scores(state), + ) + if result.communicate_score.changes: + _log_gate_changes(plan, "sync_communicate_score", {"injected": True}) + + result.create_plan = sync_create_plan_needed( + plan, + state, + policy=policy, + ) + if result.create_plan.changes: + _log_gate_changes(plan, "sync_create_plan", {"injected": True}) + + result.triage = sync_triage_needed( + plan, + state, + policy=policy, + ) + if result.triage.injected: + _log_gate_changes(plan, "sync_triage", {"injected": True}) + + result.lifecycle_phase, result.lifecycle_phase_changed = _persist_lifecycle( + plan, + state, + target_strict=target_strict, + ) + if result.lifecycle_phase_changed: + _log_gate_changes( + plan, + "sync_lifecycle_phase", + {"phase": result.lifecycle_phase}, + ) + + return result + + +__all__ = ["ReconcileResult", "live_planned_queue_empty", "reconcile_plan"] diff --git a/desloppify/engine/_plan/reconcile_review_import.py b/desloppify/engine/_plan/sync/review_import.py similarity index 91% rename from desloppify/engine/_plan/reconcile_review_import.py rename to desloppify/engine/_plan/sync/review_import.py index 5137a722..e2efacdc 100644 --- a/desloppify/engine/_plan/reconcile_review_import.py +++ b/desloppify/engine/_plan/sync/review_import.py @@ -1,4 +1,4 @@ -"""Plan sync helpers for review-import flows.""" +"""Review-import-specific queue sync helpers.""" from __future__ import annotations @@ -54,7 +54,8 @@ def _review_issue_ids_for_import_sync( def _is_review_queue_id(issue_id: str, state: StateModel) -> bool: """Return True for queue IDs representing triage findings. - Falls back to legacy ID prefixes only when the issue payload is absent. + Falls back to known review queue ID prefixes only when the issue payload + is absent. """ issue = (state.get("work_items") or state.get("issues", {})).get(issue_id) if isinstance(issue, dict): @@ -150,6 +151,7 @@ def sync_plan_after_review_import( state: StateModel, *, policy=None, + inject_triage: bool = True, ) -> ReviewImportSyncResult | None: """Sync plan queue after review import. Pure engine function — no I/O. @@ -182,11 +184,14 @@ def sync_plan_after_review_import( order.append(issue_id) added.append(issue_id) - # Inject triage stages if needed (policy enables mid-cycle guard) - triage_result = sync_triage_needed(plan, state, policy=policy) - triage_injected_ids = list(getattr(triage_result, "injected", []) or []) - triage_injected = bool(triage_injected_ids) - triage_deferred = bool(triage_result and getattr(triage_result, "deferred", False)) + triage_injected_ids: list[str] = [] + triage_injected = False + triage_deferred = False + if inject_triage: + triage_result = sync_triage_needed(plan, state, policy=policy) + triage_injected_ids = list(getattr(triage_result, "injected", []) or []) + triage_injected = bool(triage_injected_ids) + triage_deferred = bool(triage_result and getattr(triage_result, "deferred", False)) return ReviewImportSyncResult( new_ids=new_ids, diff --git a/desloppify/engine/_plan/sync/workflow.py b/desloppify/engine/_plan/sync/workflow.py index 01696110..f75708ab 100644 --- a/desloppify/engine/_plan/sync/workflow.py +++ b/desloppify/engine/_plan/sync/workflow.py @@ -397,18 +397,15 @@ def sync_communicate_score_needed( state: StateModel, *, policy: SubjectiveVisibility | None = None, - scores_just_imported: bool = False, current_scores: ScoreSnapshot | None = None, ) -> QueueSyncResult: """Inject ``workflow::communicate-score`` and rebaseline scores. Injects when: - - All initial subjective reviews are complete (no unscored dims), OR - scores were just imported (trusted/attested/override) + - All initial subjective reviews are complete (no unscored dims) - ``workflow::communicate-score`` is not already in the queue - Score has not already been communicated this cycle - (``previous_plan_start_scores`` absent), unless a trusted score import - explicitly refreshed the live score mid-cycle + (``previous_plan_start_scores`` absent) When injected and *current_scores* is provided, ``plan_start_scores`` is rebaselined to the current score so the score display unfreezes at @@ -424,9 +421,9 @@ def sync_communicate_score_needed( return _EMPTY() # Already communicated this cycle — previous_plan_start_scores is set # at injection time and cleared at cycle boundaries. - if "previous_plan_start_scores" in plan and not scores_just_imported: + if "previous_plan_start_scores" in plan: return _EMPTY() - if not scores_just_imported and not _no_unscored(state, policy): + if not _no_unscored(state, policy): return _EMPTY() if current_scores is not None: diff --git a/desloppify/engine/_plan/triage/apply.py b/desloppify/engine/_plan/triage/apply.py index ccab4e95..0f817787 100644 --- a/desloppify/engine/_plan/triage/apply.py +++ b/desloppify/engine/_plan/triage/apply.py @@ -4,6 +4,7 @@ from dataclasses import dataclass +from desloppify.engine._plan.cluster_semantics import EXECUTION_STATUS_ACTIVE from desloppify.engine._plan.policy.stale import review_issue_snapshot_hash from desloppify.engine._plan.schema import ( EPIC_PREFIX, @@ -68,6 +69,7 @@ def _update_existing_epic_cluster( existing["agent_safe"] = epic_data.get("agent_safe", False) existing["dependency_order"] = epic_data["dependency_order"] existing["action_steps"] = epic_data.get("action_steps", []) + existing["execution_status"] = EXECUTION_STATUS_ACTIVE existing["updated_at"] = now existing["triage_version"] = version existing["description"] = epic_data["thesis"] @@ -90,6 +92,7 @@ def _create_epic_cluster( "auto": True, "cluster_key": f"epic::{epic_name}", "action": f"desloppify plan focus {epic_name}", + "execution_status": EXECUTION_STATUS_ACTIVE, "user_modified": False, "created_at": now, "updated_at": now, diff --git a/desloppify/engine/_work_queue/context.py b/desloppify/engine/_work_queue/context.py index d379dc34..6ab307af 100644 --- a/desloppify/engine/_work_queue/context.py +++ b/desloppify/engine/_work_queue/context.py @@ -15,8 +15,7 @@ target_strict_score_from_config, ) from desloppify.engine._plan.persistence import ( - has_living_plan, - load_plan, + resolve_plan_load_status as resolve_persisted_plan_load_status, ) from desloppify.engine.plan_state import PlanLoadStatus from desloppify.engine._state.schema import StateModel @@ -54,28 +53,7 @@ def resolve_plan_load_status( """Resolve plan loading and explicitly report degraded mode.""" if not isinstance(plan, _PlanAutoLoad): return PlanLoadStatus(plan=plan, degraded=False, error_kind=None) - - if not has_living_plan(): - return PlanLoadStatus(plan=None, degraded=False, error_kind=None) - - try: - resolved_plan = load_plan() - return PlanLoadStatus(plan=resolved_plan, degraded=False, error_kind=None) - except OSError as exc: - return PlanLoadStatus( - plan=None, - degraded=True, - error_kind=exc.__class__.__name__, - ) - except ( - ValueError, - UnicodeDecodeError, - ) as exc: - return PlanLoadStatus( - plan=None, - degraded=True, - error_kind=exc.__class__.__name__, - ) + return resolve_persisted_plan_load_status() def queue_context( diff --git a/desloppify/engine/_work_queue/plan_order.py b/desloppify/engine/_work_queue/plan_order.py index d355fe20..f2ea3f96 100644 --- a/desloppify/engine/_work_queue/plan_order.py +++ b/desloppify/engine/_work_queue/plan_order.py @@ -186,6 +186,7 @@ def _build_cluster_meta( cluster_data, detector=detector, ), + "execution_status": cluster_data.get("execution_status", "review"), "confidence": "high", "detector": detector, "file": "", diff --git a/desloppify/engine/_work_queue/ranking.py b/desloppify/engine/_work_queue/ranking.py index 5030fda1..1f40db01 100644 --- a/desloppify/engine/_work_queue/ranking.py +++ b/desloppify/engine/_work_queue/ranking.py @@ -6,7 +6,7 @@ from typing import Any, cast from desloppify.base.registry import DETECTORS -from desloppify.engine.plan_triage import TRIAGE_STAGE_ORDER +from desloppify.engine._plan.constants import TRIAGE_STAGE_ORDER from desloppify.engine._scoring.results.health import compute_health_breakdown from desloppify.engine._scoring.results.impact import get_dimension_for_detector from desloppify.engine._state.filtering import path_scoped_issues diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index 2e55e970..dd9d7aa6 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -8,15 +8,15 @@ from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE from desloppify.engine._plan.cluster_semantics import ( - cluster_allows_ephemeral_execution, + cluster_is_active, ) from desloppify.engine._plan.constants import ( WORKFLOW_DEFERRED_DISPOSITION_ID, WORKFLOW_RUN_SCAN_ID, ) from desloppify.engine._plan.schema import ( - _tracked_plan_ids as _tracked_plan_ids, executable_objective_ids as _executable_objective_ids, + live_planned_queue_ids as _live_planned_queue_ids, ) from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._state.filtering import path_scoped_issues @@ -120,21 +120,19 @@ def _assessment_request_items(items: Iterable[WorkQueueItem]) -> list[WorkQueueI ] -def _auto_promoted_autofix_ids(plan: dict | None) -> set[str]: - """Return auto-cluster member IDs eligible to execute without manual promotion.""" +def _active_cluster_issue_ids(plan: dict | None) -> set[str]: + """Return issue IDs owned by clusters that are active planned work.""" if not isinstance(plan, dict): return set() - autofix_ids: set[str] = set() + active_ids: set[str] = set() skipped_ids = set(plan.get("skipped", {}).keys()) for cluster in plan.get("clusters", {}).values(): - if not isinstance(cluster, dict): - continue - if not cluster_allows_ephemeral_execution(cluster): + if not isinstance(cluster, dict) or not cluster_is_active(cluster): continue for issue_id in cluster.get("issue_ids", []): if isinstance(issue_id, str) and issue_id and issue_id not in skipped_ids: - autofix_ids.add(issue_id) - return autofix_ids + active_ids.add(issue_id) + return active_ids def _merge_execution_candidates( @@ -142,26 +140,22 @@ def _merge_execution_candidates( all_issue_items: list[WorkQueueItem], explicit_objective_items: list[WorkQueueItem], plan: dict | None, - skipped_ids: set[str], review_issue_ids: set[str], - executable_review_ids: set[str], assessment_request_ids: set[str], ) -> tuple[list[WorkQueueItem], list[WorkQueueItem]]: - """Merge plan-anchored and auto-promoted execution candidates.""" - explicit_queue_ids = { - str(issue_id) - for issue_id in (plan or {}).get("queue_order", []) - if isinstance(issue_id, str) and issue_id - } - skipped_ids - auto_promoted_ids = _auto_promoted_autofix_ids(plan) - explicit_queue_ids |= auto_promoted_ids + """Merge queue-owned execution items with objective defaults.""" + explicit_queue_ids = _live_planned_queue_ids(plan) + active_cluster_ids = _active_cluster_issue_ids(plan) queued_non_review_items = [ item for item in all_issue_items if item.get("id", "") in explicit_queue_ids and item.get("id", "") not in assessment_request_ids - and item.get("id", "") not in review_issue_ids + and ( + item.get("id", "") not in review_issue_ids + or item.get("id", "") in active_cluster_ids + ) ] execution_candidates: list[WorkQueueItem] = [] @@ -173,11 +167,10 @@ def _merge_execution_candidates( seen_execution_ids.add(item_id) execution_candidates.append(item) - anchored_execution_ids = (_tracked_plan_ids(plan) | auto_promoted_ids) - skipped_ids anchored_execution_items = [ item for item in execution_candidates - if item.get("id", "") in anchored_execution_ids + if item.get("id", "") in explicit_queue_ids ] return execution_candidates, anchored_execution_items @@ -248,6 +241,7 @@ def _phase_for_snapshot( anchored_execution_items: list[WorkQueueItem], explicit_queue_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], + review_backlog_present: bool, postflight_assessment_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], postflight_workflow_items: list[WorkQueueItem], @@ -261,14 +255,14 @@ def _phase_for_snapshot( return PHASE_SCAN if explicit_queue_items: return PHASE_EXECUTE + if postflight_workflow_items: + return PHASE_WORKFLOW_POSTFLIGHT + if triage_items and (review_backlog_present or not postflight_assessment_items): + return PHASE_TRIAGE_POSTFLIGHT if postflight_review_items: return PHASE_REVIEW_POSTFLIGHT if postflight_assessment_items: return PHASE_ASSESSMENT_POSTFLIGHT - if postflight_workflow_items: - return PHASE_WORKFLOW_POSTFLIGHT - if triage_items: - return PHASE_TRIAGE_POSTFLIGHT return PHASE_SCAN @@ -354,15 +348,12 @@ def build_queue_snapshot( review_issue_items, ) review_issue_ids = {item.get("id", "") for item in review_issue_items} - executable_review_ids = {item.get("id", "") for item in executable_review_items} assessment_request_ids = {item.get("id", "") for item in assessment_request_items} explicit_queue_items, anchored_execution_items = _merge_execution_candidates( all_issue_items=all_issue_items, explicit_objective_items=explicit_objective_items, plan=effective_plan, - skipped_ids=skipped_ids, review_issue_ids=review_issue_ids, - executable_review_ids=executable_review_ids, assessment_request_ids=assessment_request_ids, ) initial_review_items, subjective_postflight_items = _subjective_partitions( @@ -389,6 +380,7 @@ def build_queue_snapshot( anchored_execution_items=anchored_execution_items, explicit_queue_items=explicit_queue_items, scan_items=scan_items, + review_backlog_present=bool(review_issue_items), postflight_assessment_items=postflight_assessment_items, postflight_review_items=postflight_review_items, postflight_workflow_items=postflight_workflow_items, diff --git a/desloppify/engine/_work_queue/types.py b/desloppify/engine/_work_queue/types.py index d7a767bb..9efa5ead 100644 --- a/desloppify/engine/_work_queue/types.py +++ b/desloppify/engine/_work_queue/types.py @@ -58,6 +58,7 @@ class QueueItemCommon(QueueItemBase, total=False): primary_command: str action_type: str execution_policy: str + execution_status: str explain: dict[str, Any] # Plan-order metadata diff --git a/desloppify/engine/detectors/complexity.py b/desloppify/engine/detectors/complexity.py index a20e7d60..466d302f 100644 --- a/desloppify/engine/detectors/complexity.py +++ b/desloppify/engine/detectors/complexity.py @@ -1,5 +1,7 @@ """Complexity signal detection: configurable per-language complexity signals.""" +from __future__ import annotations + import inspect import logging import re @@ -77,3 +79,6 @@ def detect_complexity( ) continue return sorted(entries, key=lambda e: -e["score"]), len(files) + + +__all__ = ["detect_complexity"] diff --git a/desloppify/engine/detectors/coupling.py b/desloppify/engine/detectors/coupling.py index 58361953..4061412c 100644 --- a/desloppify/engine/detectors/coupling.py +++ b/desloppify/engine/detectors/coupling.py @@ -5,6 +5,8 @@ constitute "shared" vs "tools") are provided by the caller. """ +from __future__ import annotations + import logging from dataclasses import dataclass from pathlib import Path @@ -223,3 +225,11 @@ def detect_cross_tool_imports( violating_edges=violating_edges, eligible_edges=eligible_edges, ) + + +__all__ = [ + "CouplingEdgeCounts", + "detect_boundary_candidates", + "detect_coupling_violations", + "detect_cross_tool_imports", +] diff --git a/desloppify/engine/detectors/gods.py b/desloppify/engine/detectors/gods.py index c105b36a..5290df45 100644 --- a/desloppify/engine/detectors/gods.py +++ b/desloppify/engine/detectors/gods.py @@ -1,5 +1,7 @@ """God class/component detection via configurable rule-based analysis.""" +from __future__ import annotations + def detect_gods(classes, rules, min_reasons: int = 2) -> tuple[list[dict], int]: """Find god classes/components — entities with too many responsibilities.""" @@ -23,3 +25,6 @@ def detect_gods(classes, rules, min_reasons: int = 2) -> tuple[list[dict], int]: } ) return sorted(entries, key=lambda e: -e["loc"]), len(classes) + + +__all__ = ["detect_gods"] diff --git a/desloppify/engine/detectors/large.py b/desloppify/engine/detectors/large.py index fc1f1a7b..cc7dcc8e 100644 --- a/desloppify/engine/detectors/large.py +++ b/desloppify/engine/detectors/large.py @@ -1,5 +1,7 @@ """Large file detection (LOC threshold).""" +from __future__ import annotations + import logging from pathlib import Path @@ -29,3 +31,6 @@ def detect_large_files( ) continue return sorted(entries, key=lambda e: -e["loc"]), len(files) + + +__all__ = ["detect_large_files"] diff --git a/desloppify/engine/detectors/naming.py b/desloppify/engine/detectors/naming.py index a4176349..4dd606d3 100644 --- a/desloppify/engine/detectors/naming.py +++ b/desloppify/engine/detectors/naming.py @@ -1,5 +1,7 @@ """Naming consistency analysis: flag directories with mixed filename conventions.""" +from __future__ import annotations + from collections import defaultdict from pathlib import Path @@ -84,3 +86,6 @@ def detect_naming_inconsistencies( ) return sorted(entries, key=lambda e: -e["minority_count"]), len(dir_files) + + +__all__ = ["detect_naming_inconsistencies"] diff --git a/desloppify/engine/detectors/passthrough.py b/desloppify/engine/detectors/passthrough.py index 332c8ca8..db57d0e1 100644 --- a/desloppify/engine/detectors/passthrough.py +++ b/desloppify/engine/detectors/passthrough.py @@ -4,6 +4,8 @@ the shared core that classifies parameters as passthrough vs direct-use. """ +from __future__ import annotations + import re from collections.abc import Callable @@ -52,3 +54,6 @@ def classify_params( else: direct.append(name) return passthrough, direct + + +__all__ = ["classify_params", "classify_passthrough_tier"] diff --git a/desloppify/engine/detectors/single_use.py b/desloppify/engine/detectors/single_use.py index 989cf318..fa398a86 100644 --- a/desloppify/engine/detectors/single_use.py +++ b/desloppify/engine/detectors/single_use.py @@ -1,5 +1,7 @@ """Single-use file detection (file-level importer heuristic for inlining candidates).""" +from __future__ import annotations + import logging from pathlib import Path @@ -84,3 +86,6 @@ def detect_single_use_abstractions( ) continue return sorted(entries, key=lambda e: -e["loc"]), total_candidates + + +__all__ = ["detect_single_use_abstractions"] diff --git a/desloppify/intelligence/review/context_holistic/clusters/__init__.py b/desloppify/intelligence/review/context_holistic/clusters/__init__.py index 2d66ff8c..a9b3e8be 100644 --- a/desloppify/intelligence/review/context_holistic/clusters/__init__.py +++ b/desloppify/intelligence/review/context_holistic/clusters/__init__.py @@ -1,38 +1 @@ -"""Canonical mechanical evidence cluster builders for holistic review.""" - -from .accessors import _get_detail, _get_signals, _safe_num -from .complexity import _build_complexity_hotspots -from .consistency import _build_duplicate_clusters, _build_naming_drift -from .dependency import ( - _build_boundary_violations, - _build_dead_code, - _build_deferred_import_density, - _build_private_crossings, -) -from .error_state import _build_error_hotspots, _build_mutable_globals -from .organization import _build_flat_dir_issues, _build_large_file_distribution -from .security import ( - _build_security_hotspots, - _build_signal_density, - _build_systemic_patterns, -) - -__all__ = [ - "_build_boundary_violations", - "_build_complexity_hotspots", - "_build_dead_code", - "_build_deferred_import_density", - "_build_duplicate_clusters", - "_build_error_hotspots", - "_build_flat_dir_issues", - "_build_large_file_distribution", - "_build_mutable_globals", - "_build_naming_drift", - "_build_private_crossings", - "_build_security_hotspots", - "_build_signal_density", - "_build_systemic_patterns", - "_get_detail", - "_get_signals", - "_safe_num", -] +"""Holistic review cluster builders package.""" diff --git a/desloppify/intelligence/review/importing/assessments.py b/desloppify/intelligence/review/importing/assessments.py index 5d5c983d..07d01227 100644 --- a/desloppify/intelligence/review/importing/assessments.py +++ b/desloppify/intelligence/review/importing/assessments.py @@ -29,25 +29,19 @@ def _clean_judgment(raw: dict[str, Any]) -> dict[str, Any] | None: if isinstance(dc, str) and dc.strip(): dimension_character = dc.strip() - issue_character = "" - ic = raw.get("issue_character") - if isinstance(ic, str) and ic.strip(): - issue_character = ic.strip() - score_rationale = "" sr = raw.get("score_rationale") if isinstance(sr, str) and sr.strip(): score_rationale = sr.strip() - effective_dimension_character = dimension_character or issue_character - if not strengths and not effective_dimension_character and not score_rationale: + if not strengths and not dimension_character and not score_rationale: return None result: dict[str, Any] = {} if strengths: result["strengths"] = strengths - if effective_dimension_character: - result["dimension_character"] = effective_dimension_character + if dimension_character: + result["dimension_character"] = dimension_character if score_rationale: result["score_rationale"] = score_rationale return result diff --git a/desloppify/intelligence/review/importing/holistic.py b/desloppify/intelligence/review/importing/holistic.py index 3c3474c8..decc57f9 100644 --- a/desloppify/intelligence/review/importing/holistic.py +++ b/desloppify/intelligence/review/importing/holistic.py @@ -5,8 +5,9 @@ from pathlib import Path from typing import Any -from desloppify import state as state_mod from desloppify.engine.concerns import cleanup_stale_dismissals, generate_concerns +from desloppify.engine._state.merge import MergeScanOptions, merge_scan +from desloppify.engine._state.schema import StateModel, utc_now from desloppify.engine.scoring import HOLISTIC_POTENTIAL from desloppify.intelligence.review.dimensions import normalize_dimension_name from desloppify.intelligence.review.dimensions.data import load_dimensions_for_lang @@ -53,11 +54,11 @@ def parse_holistic_import_payload( def import_holistic_issues( issues_data: ReviewImportPayload, - state: state_mod.StateModel, + state: StateModel, lang_name: str, *, project_root: Path | str | None = None, - utc_now_fn=state_mod.utc_now, + utc_now_fn=utc_now, ) -> dict[str, Any]: """Import holistic (codebase-wide) issues into state.""" payload: ReviewImportEnvelope = parse_review_import_payload( @@ -147,10 +148,10 @@ def import_holistic_issues( if potentials.get("concerns", 0) > 0: merge_potentials_dict["concerns"] = potentials["concerns"] - diff = state_mod.merge_scan( + diff = merge_scan( state, review_issues, - options=state_mod.MergeScanOptions( + options=MergeScanOptions( lang=lang_name, potentials=merge_potentials_dict, merge_potentials=True, diff --git a/desloppify/languages/_framework/base/phase_builders.py b/desloppify/languages/_framework/base/phase_builders.py index a977186f..ab00dabb 100644 --- a/desloppify/languages/_framework/base/phase_builders.py +++ b/desloppify/languages/_framework/base/phase_builders.py @@ -2,7 +2,10 @@ from __future__ import annotations +from functools import partial + from .shared_phases import ( + _detect_security_issues_default, phase_boilerplate_duplication, phase_dupes, phase_security, @@ -37,7 +40,11 @@ def factory() -> DetectorPhase: exclusive_detector="desloppify.engine.detectors.test_coverage", ), "security": _make_detector_phase_factory( - "Security", phase_security, + "Security", + partial( + phase_security, + detect_security_issues=_detect_security_issues_default, + ), exclusive_detector="desloppify.engine.detectors.security", ), "signature": _make_detector_phase_factory( diff --git a/desloppify/languages/_framework/base/shared_phases.py b/desloppify/languages/_framework/base/shared_phases.py index 32307f77..e6d04b09 100644 --- a/desloppify/languages/_framework/base/shared_phases.py +++ b/desloppify/languages/_framework/base/shared_phases.py @@ -2,12 +2,15 @@ from __future__ import annotations +from collections.abc import Callable from pathlib import Path -from typing import Any from desloppify.base.discovery.paths import get_project_root from desloppify.base.output.terminal import log -from desloppify.languages._framework.base.types import LangRuntimeContract +from desloppify.engine.detectors.security.detector import ( + detect_security_issues as _detect_security_issues_default, +) +from desloppify.languages._framework.base.types import DetectorEntry, LangRuntimeContract from desloppify.state_io import Issue from .shared_phases_helpers import ( @@ -16,11 +19,10 @@ _find_external_test_files, _log_phase_summary as _log_phase_summary_impl, ) -from . import shared_phases_review as shared_phases_review_mod from .shared_phases_review import ( - detect_security_issues as _detect_security_issues_default, phase_boilerplate_duplication, phase_dupes, + phase_security as _phase_security_review, phase_private_imports, phase_signature, phase_subjective_review, @@ -32,9 +34,6 @@ run_structural_phase, ) -detect_security_issues = _detect_security_issues_default - - def find_external_test_files(path: Path, lang: LangRuntimeContract) -> set[str]: """Compatibility wrapper with patchable get_project_root dependency.""" return _find_external_test_files(path, lang, get_project_root_fn=get_project_root) @@ -42,7 +41,7 @@ def find_external_test_files(path: Path, lang: LangRuntimeContract) -> set[str]: def _entries_to_issues( detector: str, - entries: list[dict[str, Any]], + entries: list[DetectorEntry], *, default_name: str = "", include_zone: bool = False, @@ -59,9 +58,9 @@ def _entries_to_issues( def _filter_boilerplate_entries_by_zone( - entries: list[dict[str, Any]], + entries: list[DetectorEntry], zone_map, -) -> list[dict[str, Any]]: +) -> list[DetectorEntry]: """Compatibility wrapper for boilerplate zone filtering.""" return _filter_boilerplate_entries_by_zone_impl(entries, zone_map) @@ -71,19 +70,24 @@ def _log_phase_summary(label: str, results: list[Issue], potential: int, unit: s _log_phase_summary_impl(label, results, potential, unit, log_fn=log) -def phase_security(path: Path, lang: LangRuntimeContract) -> tuple[list[Issue], dict[str, int]]: - """Compatibility wrapper with patchable security detector dependency.""" - original = shared_phases_review_mod.detect_security_issues - shared_phases_review_mod.detect_security_issues = detect_security_issues - try: - return shared_phases_review_mod.phase_security(path, lang) - finally: - shared_phases_review_mod.detect_security_issues = original +def phase_security( + path: Path, + lang: LangRuntimeContract, + *, + detect_security_issues: Callable[..., tuple[list[DetectorEntry], int]] = ( + _detect_security_issues_default + ), +) -> tuple[list[Issue], dict[str, int]]: + """Compatibility wrapper with an explicit security detector dependency.""" + return _phase_security_review( + path, + lang, + detect_security_issues=detect_security_issues, + ) __all__ = [ "_filter_boilerplate_entries_by_zone", - "detect_security_issues", "find_external_test_files", "make_structural_coupling_phase_pair", "phase_boilerplate_duplication", diff --git a/desloppify/languages/_framework/base/shared_phases_helpers.py b/desloppify/languages/_framework/base/shared_phases_helpers.py index 8a7cde57..e3496e1a 100644 --- a/desloppify/languages/_framework/base/shared_phases_helpers.py +++ b/desloppify/languages/_framework/base/shared_phases_helpers.py @@ -11,20 +11,24 @@ from desloppify.base.output.terminal import log from desloppify.engine._state.filtering import make_issue from desloppify.engine.policy.zones import should_skip_issue -from desloppify.languages._framework.base.types import DetectorCoverageStatus, LangRuntimeContract +from desloppify.languages._framework.base.types import ( + DetectorCoverageStatus, + DetectorEntry, + LangRuntimeContract, +) from desloppify.state_io import Issue def _filter_boilerplate_entries_by_zone( - entries: list[dict[str, Any]], + entries: list[DetectorEntry], zone_map, -) -> list[dict[str, Any]]: +) -> list[DetectorEntry]: """Keep only in-scope, zone-allowed boilerplate clusters.""" if zone_map is None: return entries known_files = set(zone_map.all_files()) - filtered: list[dict[str, Any]] = [] + filtered: list[DetectorEntry] = [] skipped = 0 for entry in entries: locations = entry.get("locations", []) @@ -83,7 +87,7 @@ def _find_external_test_files( def _entries_to_issues( detector: str, - entries: list[dict[str, Any]], + entries: list[DetectorEntry], *, default_name: str = "", include_zone: bool = False, diff --git a/desloppify/languages/_framework/base/shared_phases_review.py b/desloppify/languages/_framework/base/shared_phases_review.py index f54e01bd..a77419d3 100644 --- a/desloppify/languages/_framework/base/shared_phases_review.py +++ b/desloppify/languages/_framework/base/shared_phases_review.py @@ -2,17 +2,20 @@ from __future__ import annotations +from collections.abc import Callable from pathlib import Path from desloppify.base.discovery.file_paths import rel from desloppify.base.output.terminal import log from desloppify.engine.detectors.dupes import detect_duplicates from desloppify.engine.detectors.jscpd_adapter import detect_with_jscpd -from desloppify.engine.detectors.security.detector import detect_security_issues +from desloppify.engine.detectors.security.detector import ( + detect_security_issues as _detect_security_issues_default, +) from desloppify.engine.detectors.test_coverage.detector import detect_test_coverage from desloppify.engine._state.filtering import make_issue from desloppify.engine.policy.zones import EXCLUDED_ZONES, filter_entries -from desloppify.languages._framework.base.types import LangRuntimeContract +from desloppify.languages._framework.base.types import DetectorEntry, LangRuntimeContract from desloppify.languages._framework.issue_factories import make_dupe_issues from desloppify.state_io import Issue @@ -24,6 +27,10 @@ _record_detector_coverage, ) +# Compatibility export for language phase modules that still import the raw +# security detector symbol from this module. +detect_security_issues = _detect_security_issues_default + def phase_dupes(path: Path, lang: LangRuntimeContract) -> tuple[list[Issue], dict[str, int]]: """Shared phase runner: detect duplicate functions via lang.extract_functions.""" @@ -90,7 +97,14 @@ def phase_boilerplate_duplication( return issues, {"boilerplate_duplication": distinct_files} -def phase_security(path: Path, lang: LangRuntimeContract) -> tuple[list[Issue], dict[str, int]]: +def phase_security( + path: Path, + lang: LangRuntimeContract, + *, + detect_security_issues: Callable[..., tuple[list[DetectorEntry], int]] = ( + _detect_security_issues_default + ), +) -> tuple[list[Issue], dict[str, int]]: """Shared phase: detect security issues (cross-language + lang-specific).""" zone_map = lang.zone_map files = lang.file_finder(path) if lang.file_finder else [] diff --git a/desloppify/languages/_framework/base/types.py b/desloppify/languages/_framework/base/types.py index d61dbd62..39725a07 100644 --- a/desloppify/languages/_framework/base/types.py +++ b/desloppify/languages/_framework/base/types.py @@ -17,6 +17,7 @@ from desloppify.languages._framework.base.types_shared import ( BoundaryRule, CoverageStatus, + DetectorEntry, DetectorCoverageRecord, DetectorCoverageStatus, FixerConfig, @@ -47,7 +48,7 @@ class DetectorPhase: """ label: str - run: Callable[[Path, LangRuntimeContract], tuple[list[dict[str, Any]], dict[str, int]]] + run: Callable[[Path, LangRuntimeContract], tuple[list[DetectorEntry], dict[str, int]]] slow: bool = False @@ -71,7 +72,9 @@ class LangRuntimeContract(Protocol): get_area: Callable[[str], str] | None build_dep_graph: DepGraphBuilder detect_lang_security_detailed: Callable[[list[str], FileZoneMap | None], LangSecurityResult] - detect_private_imports: Callable[[dict, FileZoneMap | None], tuple[list[dict], int]] + detect_private_imports: Callable[ + [dict, FileZoneMap | None], tuple[list[DetectorEntry], int] + ] large_threshold: int complexity_threshold: int props_threshold: int @@ -238,7 +241,7 @@ def detect_lang_security_detailed( def detect_private_imports( self, graph: dict, zone_map: FileZoneMap | None - ) -> tuple[list[dict], int]: + ) -> tuple[list[DetectorEntry], int]: """Language-specific private-import detection. Override in subclasses.""" return [], 0 @@ -251,6 +254,7 @@ def scan_coverage_prerequisites(self) -> list[DetectorCoverageStatus]: "BoundaryRule", "CoverageStatus", "DepGraphBuilder", + "DetectorEntry", "DetectorCoverageRecord", "DetectorCoverageStatus", "DetectorPhase", diff --git a/desloppify/languages/_framework/base/types_shared.py b/desloppify/languages/_framework/base/types_shared.py index f9403cfc..df9a9f92 100644 --- a/desloppify/languages/_framework/base/types_shared.py +++ b/desloppify/languages/_framework/base/types_shared.py @@ -5,7 +5,7 @@ from collections.abc import Callable from dataclasses import dataclass, field from pathlib import Path -from typing import Literal, TypedDict +from typing import Any, Literal, NotRequired, TypedDict CoverageStatus = Literal["full", "reduced"] @@ -24,6 +24,18 @@ class DetectorCoverageRecord(TypedDict, total=False): reason: str +class DetectorEntry(TypedDict): + """Shared normalized detector-entry shape across framework boundaries.""" + + file: str + tier: int + confidence: str + summary: str + line: NotRequired[int] + detail: NotRequired[dict[str, Any]] + name: NotRequired[str] + + class ScanCoverageRecord(TypedDict, total=False): """Persisted scan-level coverage snapshot for one language run.""" @@ -52,7 +64,7 @@ class DetectorCoverageStatus: class LangSecurityResult: """Normalized return shape for language-specific security hooks.""" - entries: list[dict] + entries: list[DetectorEntry] files_scanned: int coverage: DetectorCoverageStatus | None = None @@ -100,6 +112,7 @@ class LangValueSpec: __all__ = [ "BoundaryRule", "CoverageStatus", + "DetectorEntry", "DetectorCoverageRecord", "DetectorCoverageStatus", "FixerConfig", diff --git a/desloppify/languages/_framework/generic_support/__init__.py b/desloppify/languages/_framework/generic_support/__init__.py index 11e4b1c8..7a2485ca 100644 --- a/desloppify/languages/_framework/generic_support/__init__.py +++ b/desloppify/languages/_framework/generic_support/__init__.py @@ -1,50 +1 @@ -"""Canonical generic-plugin support subpackage for language framework helpers.""" - -from .capabilities import ( - SHARED_PHASE_LABELS, - capability_report, - empty_dep_graph, - generic_zone_rules, - make_file_finder, - noop_extract_functions, -) -from .core import ( - GenericLangOptions, - generic_lang, - make_tool_phase, - parse_cargo, - parse_eslint, - parse_gnu, - parse_golangci, - parse_json, - parse_rubocop, -) -from .registration import ( - _build_generic_phases, - _register_generic_tool_specs, - _resolve_generic_extractors, -) -from .structural import _make_coupling_phase, _make_structural_phase - -__all__ = [ - "GenericLangOptions", - "SHARED_PHASE_LABELS", - "_build_generic_phases", - "_make_coupling_phase", - "_make_structural_phase", - "_register_generic_tool_specs", - "_resolve_generic_extractors", - "capability_report", - "empty_dep_graph", - "generic_lang", - "generic_zone_rules", - "make_file_finder", - "make_tool_phase", - "noop_extract_functions", - "parse_cargo", - "parse_eslint", - "parse_gnu", - "parse_golangci", - "parse_json", - "parse_rubocop", -] +"""Generic-plugin support package for the language framework.""" diff --git a/desloppify/languages/_framework/runtime_support/__init__.py b/desloppify/languages/_framework/runtime_support/__init__.py index 8df2c5f6..1d6e09ab 100644 --- a/desloppify/languages/_framework/runtime_support/__init__.py +++ b/desloppify/languages/_framework/runtime_support/__init__.py @@ -1,19 +1 @@ -"""Canonical runtime-support subpackage for language framework helpers.""" - -from .accessors import LangRunStateAccessors -from .runtime import ( - LangRun, - LangRunOverrides, - LangRuntimeContract, - LangRuntimeState, - make_lang_run, -) - -__all__ = [ - "LangRun", - "LangRunOverrides", - "LangRunStateAccessors", - "LangRuntimeContract", - "LangRuntimeState", - "make_lang_run", -] +"""Runtime-support package for language framework helpers.""" diff --git a/desloppify/languages/_framework/treesitter/__init__.py b/desloppify/languages/_framework/treesitter/__init__.py index 85b9abba..0f5dad64 100644 --- a/desloppify/languages/_framework/treesitter/__init__.py +++ b/desloppify/languages/_framework/treesitter/__init__.py @@ -6,6 +6,9 @@ - ``specs``: language-spec catalogs and variants - ``imports``: import graph + resolver/cache helpers - ``analysis``: detectors/extractors/complexity helpers + +Underscore-prefixed modules at this package root remain compatibility shims only. +New code and direct tests should import from the grouped namespaces above. """ from __future__ import annotations diff --git a/desloppify/languages/rust/fixers/__init__.py b/desloppify/languages/rust/fixers/__init__.py index 57ead586..5767c7d0 100644 --- a/desloppify/languages/rust/fixers/__init__.py +++ b/desloppify/languages/rust/fixers/__init__.py @@ -1,5 +1 @@ -"""Rust fixers package.""" - -from desloppify.languages.rust._fixers import get_rust_fixers - -__all__ = ["get_rust_fixers"] +"""Rust fixer package.""" diff --git a/desloppify/languages/typescript/detectors/patterns/__init__.py b/desloppify/languages/typescript/detectors/patterns/__init__.py index 924d515d..4bdd78d0 100644 --- a/desloppify/languages/typescript/detectors/patterns/__init__.py +++ b/desloppify/languages/typescript/detectors/patterns/__init__.py @@ -1,7 +1 @@ -"""Pattern-analysis detectors and CLI helpers for TypeScript.""" - -from .analysis import detect_pattern_anomalies -from .catalog import PATTERN_FAMILIES -from .cli import cmd_patterns - -__all__ = ["PATTERN_FAMILIES", "cmd_patterns", "detect_pattern_anomalies"] +"""TypeScript pattern detector package.""" diff --git a/desloppify/languages/typescript/detectors/react/__init__.py b/desloppify/languages/typescript/detectors/react/__init__.py index cf7e0f49..255ae7fb 100644 --- a/desloppify/languages/typescript/detectors/react/__init__.py +++ b/desloppify/languages/typescript/detectors/react/__init__.py @@ -1,12 +1 @@ -"""React-specific TypeScript detectors grouped by concern.""" - -from .context import detect_context_nesting -from .hook_bloat import detect_boolean_state_explosion, detect_hook_return_bloat -from .state_sync import detect_state_sync - -__all__ = [ - "detect_boolean_state_explosion", - "detect_context_nesting", - "detect_hook_return_bloat", - "detect_state_sync", -] +"""TypeScript React detector package.""" diff --git a/desloppify/tests/commands/review/test_review_importing_support_direct.py b/desloppify/tests/commands/review/test_review_importing_support_direct.py index 2680354a..057b6dce 100644 --- a/desloppify/tests/commands/review/test_review_importing_support_direct.py +++ b/desloppify/tests/commands/review/test_review_importing_support_direct.py @@ -37,33 +37,25 @@ def _patch_basic_plan_sync_runtime( monkeypatch: pytest.MonkeyPatch, *, plan: dict, - policy: SimpleNamespace | None = None, ) -> None: - effective_policy = policy or _empty_visibility_policy() monkeypatch.setattr(plan_sync_mod, "has_living_plan", lambda _path=None: True) monkeypatch.setattr(plan_sync_mod, "load_plan", lambda _path=None: plan) monkeypatch.setattr(plan_sync_mod, "save_plan", lambda _plan, _path=None: None) monkeypatch.setattr( plan_sync_mod, - "compute_subjective_visibility", - lambda *_a, **_k: effective_policy, + "live_planned_queue_empty", + lambda _plan: True, ) - monkeypatch.setattr(plan_sync_mod, "ScoreSnapshot", _score_snapshot) monkeypatch.setattr( plan_sync_mod, - "sync_communicate_score_needed", - lambda _plan, _state, **_kwargs: _no_changes(), + "reconcile_plan", + lambda _plan, _state, target_strict: plan_sync_mod.ReconcileResult(), ) monkeypatch.setattr( plan_sync_mod, "sync_import_scores_needed", lambda _plan, _state, assessment_mode, **_kwargs: _no_changes(), ) - monkeypatch.setattr( - plan_sync_mod, - "sync_create_plan_needed", - lambda _plan, _state, policy=None: _no_changes(), - ) monkeypatch.setattr(plan_sync_mod, "append_log_entry", lambda *_a, **_k: None) @@ -144,6 +136,7 @@ def test_print_review_import_sync_reports_new_ids_and_triage_commands(capsys) -> state, result, workflow_injected=False, + triage_injected=True, ) out = capsys.readouterr().out @@ -200,19 +193,19 @@ def test_sync_plan_after_import_handles_plan_exceptions(monkeypatch, capsys) -> def test_sync_plan_after_import_runs_review_sync_for_auto_resolved_deltas(monkeypatch) -> None: plan: dict = {"queue_order": []} - seen = {"import_called": False, "stale_called": False} + seen = {"import_called": False, "reconcile_called": False} _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) - def fake_import_sync(_plan, _state, policy=None): + def fake_import_sync(_plan, _state, inject_triage=False): seen["import_called"] = True return None - def fake_stale_sync(_plan, _state, policy=None, **_kw): - seen["stale_called"] = True - return SimpleNamespace(changes=False, injected=[], pruned=[]) - monkeypatch.setattr(plan_sync_mod, "sync_plan_after_review_import", fake_import_sync) - monkeypatch.setattr(plan_sync_mod, "sync_subjective_dimensions", fake_stale_sync) + monkeypatch.setattr( + plan_sync_mod, + "reconcile_plan", + lambda *_a, **_k: seen.__setitem__("reconcile_called", True) or plan_sync_mod.ReconcileResult(), + ) plan_sync_mod.sync_plan_after_import( state={}, @@ -221,7 +214,7 @@ def fake_stale_sync(_plan, _state, policy=None, **_kw): ) assert seen["import_called"] is True - assert seen["stale_called"] is True + assert seen["reconcile_called"] is True def test_import_holistic_issues_ignores_unknown_context_update_dimensions() -> None: @@ -262,27 +255,28 @@ def test_sync_plan_after_import_logs_triage_provenance(monkeypatch) -> None: entries: list[tuple[str, dict]] = [] _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) - monkeypatch.setattr( - plan_sync_mod, - "sync_subjective_dimensions", - lambda _plan, _state, policy=None, **_kw: SimpleNamespace( - changes=False, - injected=[], - pruned=[], - ), - ) monkeypatch.setattr( plan_sync_mod, "sync_plan_after_review_import", - lambda _plan, _state, policy=None: SimpleNamespace( + lambda _plan, _state, inject_triage=False: SimpleNamespace( new_ids={"review::x"}, added_to_queue=["review::x"], - triage_injected=True, stale_pruned_from_queue=[], - triage_injected_ids=["triage::observe", "triage::reflect"], + triage_injected=False, + triage_injected_ids=[], triage_deferred=False, ), ) + reconcile_result = plan_sync_mod.ReconcileResult( + triage=plan_constants_mod.QueueSyncResult( + injected=["triage::observe", "triage::reflect"], + ) + ) + monkeypatch.setattr( + plan_sync_mod, + "reconcile_plan", + lambda *_a, **_k: reconcile_result, + ) monkeypatch.setattr( plan_sync_mod, "append_log_entry", @@ -314,60 +308,39 @@ def test_sync_plan_after_import_keeps_workflow_before_triage(monkeypatch) -> Non monkeypatch.setattr(plan_sync_mod, "has_living_plan", lambda _path=None: True) monkeypatch.setattr(plan_sync_mod, "load_plan", lambda _path=None: plan) monkeypatch.setattr(plan_sync_mod, "save_plan", lambda _plan, _path=None: None) - monkeypatch.setattr( - plan_sync_mod, - "sync_subjective_dimensions", - lambda _plan, _state, policy=None, **_kw: SimpleNamespace( - changes=False, - injected=[], - pruned=[], - ), - ) - monkeypatch.setattr( - plan_sync_mod, - "ScoreSnapshot", - lambda **kwargs: SimpleNamespace(**kwargs), - ) - - def fake_communicate(_plan, _state, **_kwargs): - _plan["queue_order"].append("workflow::communicate-score") - plan_constants_mod.normalize_queue_workflow_and_triage_prefix(_plan["queue_order"]) - return SimpleNamespace(changes=True) - - def fake_create_plan(_plan, _state, policy=None): - _plan["queue_order"].append("workflow::create-plan") - plan_constants_mod.normalize_queue_workflow_and_triage_prefix(_plan["queue_order"]) - return SimpleNamespace(changes=True) - - def fake_review_import(_plan, _state, policy=None): - _plan["queue_order"].extend(["review::x", "triage::observe"]) + def fake_review_import(_plan, _state, inject_triage=False): + _plan["queue_order"].append("review::x") return SimpleNamespace( new_ids={"review::x"}, added_to_queue=["review::x"], - triage_injected=True, stale_pruned_from_queue=[], - triage_injected_ids=["triage::observe"], + triage_injected=False, + triage_injected_ids=[], triage_deferred=False, ) - monkeypatch.setattr(plan_sync_mod, "sync_communicate_score_needed", fake_communicate) monkeypatch.setattr( plan_sync_mod, "sync_import_scores_needed", lambda _plan, _state, assessment_mode, **_kwargs: SimpleNamespace(changes=False), ) - monkeypatch.setattr( - plan_sync_mod, - "compute_subjective_visibility", - lambda *_a, **_k: SimpleNamespace( - has_objective_backlog=False, - unscored_ids=frozenset(), - stale_ids=frozenset(), - under_target_ids=frozenset(), - ), - ) - monkeypatch.setattr(plan_sync_mod, "sync_create_plan_needed", fake_create_plan) monkeypatch.setattr(plan_sync_mod, "sync_plan_after_review_import", fake_review_import) + def fake_reconcile(_plan, _state, target_strict): + _plan["queue_order"].extend( + ["workflow::communicate-score", "workflow::create-plan", "triage::observe"] + ) + plan_constants_mod.normalize_queue_workflow_and_triage_prefix(_plan["queue_order"]) + return plan_sync_mod.ReconcileResult( + communicate_score=plan_constants_mod.QueueSyncResult( + injected=["workflow::communicate-score"] + ), + create_plan=plan_constants_mod.QueueSyncResult( + injected=["workflow::create-plan"] + ), + triage=plan_constants_mod.QueueSyncResult(injected=["triage::observe"]), + ) + monkeypatch.setattr(plan_sync_mod, "reconcile_plan", fake_reconcile) + monkeypatch.setattr(plan_sync_mod, "live_planned_queue_empty", lambda _plan: True) monkeypatch.setattr( plan_sync_mod, "append_log_entry", @@ -396,37 +369,16 @@ def fake_review_import(_plan, _state, policy=None): def test_sync_plan_after_import_reuses_plan_aware_policy(monkeypatch) -> None: plan: dict = {"queue_order": []} - policy = SimpleNamespace( - has_objective_backlog=False, - unscored_ids=frozenset(), - stale_ids=frozenset(), - under_target_ids=frozenset(), - ) seen: dict[str, object] = {} - _patch_basic_plan_sync_runtime(monkeypatch, plan=plan, policy=policy) + _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) - def fake_compute_policy(_state, *, target_strict, plan): + def fake_reconcile(_plan, _state, target_strict): seen["target_strict"] = target_strict - seen["plan"] = plan - return policy + seen["plan"] = _plan + return plan_sync_mod.ReconcileResult() - def fake_create_plan(_plan, _state, *, policy=None): - seen["create_plan_policy"] = policy - return SimpleNamespace(changes=False) - - def fake_review_import(_plan, _state, *, policy=None): - seen["import_policy"] = policy - return None - - def fake_stale_sync(_plan, _state, *, policy=None, **_kw): - seen["stale_policy"] = policy - return SimpleNamespace(changes=False, injected=[], pruned=[]) - - monkeypatch.setattr(plan_sync_mod, "compute_subjective_visibility", fake_compute_policy) - monkeypatch.setattr(plan_sync_mod, "sync_create_plan_needed", fake_create_plan) - monkeypatch.setattr(plan_sync_mod, "sync_plan_after_review_import", fake_review_import) - monkeypatch.setattr(plan_sync_mod, "sync_subjective_dimensions", fake_stale_sync) + monkeypatch.setattr(plan_sync_mod, "reconcile_plan", fake_reconcile) plan_sync_mod.sync_plan_after_import( state={}, @@ -437,9 +389,6 @@ def fake_stale_sync(_plan, _state, *, policy=None, **_kw): assert seen["target_strict"] == 97.0 assert seen["plan"] is plan - assert seen["create_plan_policy"] is policy - assert seen["import_policy"] is policy - assert seen["stale_policy"] is policy def test_sync_plan_after_import_preserves_scan_phase_for_temporary_skips( @@ -462,7 +411,7 @@ def test_sync_plan_after_import_preserves_scan_phase_for_temporary_skips( monkeypatch.setattr( plan_sync_mod, "sync_plan_after_review_import", - lambda _plan, _state, policy=None: SimpleNamespace( + lambda _plan, _state, inject_triage=False: SimpleNamespace( new_ids={"review::new"}, added_to_queue=["review::new"], triage_injected=False, @@ -473,8 +422,9 @@ def test_sync_plan_after_import_preserves_scan_phase_for_temporary_skips( ) monkeypatch.setattr( plan_sync_mod, - "sync_subjective_dimensions", - lambda _plan, _state, policy=None, **_kw: _no_changes(injected=[], pruned=[]), + "reconcile_plan", + lambda _plan, _state, target_strict: _plan["refresh_state"].__setitem__("lifecycle_phase", "scan") + or plan_sync_mod.ReconcileResult(lifecycle_phase="scan", lifecycle_phase_changed=True), ) plan_sync_mod.sync_plan_after_import( @@ -495,7 +445,7 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No monkeypatch.setattr( plan_sync_mod, "sync_plan_after_review_import", - lambda _plan, _state, policy=None: SimpleNamespace( + lambda _plan, _state, inject_triage=False: SimpleNamespace( new_ids={"review::new"}, added_to_queue=["review::new"], triage_injected=False, @@ -504,11 +454,6 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No triage_deferred=False, ), ) - monkeypatch.setattr( - plan_sync_mod, - "sync_subjective_dimensions", - lambda _plan, _state, policy=None, **_kw: _no_changes(injected=[], pruned=[]), - ) plan_sync_mod.sync_plan_after_import( state={"issues": {"review::new": {"summary": "new review work item"}}}, @@ -520,7 +465,7 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No assert "subjective::naming_quality" in plan["queue_order"] -def test_sync_plan_after_import_rebuilds_subjective_clusters_for_assessment_only_import( +def test_sync_plan_after_import_skips_mid_cycle_reconcile_for_assessment_only_import( monkeypatch, ) -> None: plan: dict = { @@ -596,17 +541,15 @@ def test_sync_plan_after_import_rebuilds_subjective_clusters_for_assessment_only "naming_quality": {"score": 78.0, "needs_review_refresh": True}, }, } - policy = SimpleNamespace( - has_objective_backlog=False, - objective_count=0, - unscored_ids=frozenset(), - stale_ids=frozenset( - {"subjective::design_coherence", "subjective::naming_quality"} - ), - under_target_ids=frozenset(), + _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) + reconcile_calls: list[tuple[dict, dict, float]] = [] + monkeypatch.setattr( + plan_sync_mod, + "reconcile_plan", + lambda _plan, _state, target_strict: reconcile_calls.append((_plan, _state, target_strict)) + or plan_sync_mod.ReconcileResult(), ) - - _patch_basic_plan_sync_runtime(monkeypatch, plan=plan, policy=policy) + monkeypatch.setattr(plan_sync_mod, "live_planned_queue_empty", lambda _plan: False) monkeypatch.setattr( plan_sync_mod, "append_log_entry", @@ -628,12 +571,8 @@ def test_sync_plan_after_import_rebuilds_subjective_clusters_for_assessment_only ), ) - assert "auto/initial-review" not in plan["clusters"] - assert "auto/stale-review" in plan["clusters"] - assert set(plan["clusters"]["auto/stale-review"]["issue_ids"]) == { - "subjective::design_coherence", - "subjective::naming_quality", - } + assert reconcile_calls == [] + assert "auto/initial-review" in plan["clusters"] def test_refresh_scorecard_after_import_only_for_trusted_assessments(monkeypatch) -> None: @@ -797,19 +736,14 @@ def test_plan_sync_source_preserves_scoped_sync_pipeline_contract() -> None: assert "plan_path_for_state(Path(state_file))" in src assert "if not has_living_plan(plan_path):" in src assert "plan = load_plan(plan_path)" in src - assert "policy = compute_subjective_visibility(" in src - assert "snapshot = score_snapshot(state)" in src - assert "current_scores = ScoreSnapshot(" in src - assert 'trusted_score_import = assessment_mode in {"trusted_internal", "attested_external"}' in src - assert "communicate_result = sync_communicate_score_needed(" in src + assert 'trusted = assessment_mode in {"trusted_internal", "attested_external"}' in src + assert "import_result = _sync_review_delta(plan, state, sync_inputs)" in src assert "import_scores_result = sync_import_scores_needed(" in src - assert "create_plan_result = sync_create_plan_needed(" in src + assert 'plan.pop("previous_plan_start_scores", None)' in src assert "sync_inputs = _build_import_sync_inputs(diff, import_payload)" in src - assert "mutations = _PlanImportMutations()" in src - assert "_record_workflow_change(" in src - assert "_sync_review_delta(" in src - assert "_sync_subjective_queue_after_import(" in src - assert "_append_workflow_log_entries(" in src + assert "result = ReconcileResult()" in src + assert "if live_planned_queue_empty(plan):" in src + assert "result = reconcile_plan(plan, state, target_strict=target_strict)" in src assert "_append_review_import_sync_log(" in src assert "save_plan(plan, plan_path)" in src assert "_print_review_import_sync(" in src diff --git a/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py b/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py index 746eeb4d..7d5c7a1a 100644 --- a/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py +++ b/desloppify/tests/commands/review/test_review_runner_batch_split_direct.py @@ -168,13 +168,13 @@ def test_core_normalize_helpers_and_batch_normalization() -> None: aliased_judgment = core_normalize_mod._validate_dimension_judgment( "logic_clarity", { - "issue_character": "legacy alias still parses", + "dimension_character": "judgment character is required", "score_rationale": "y" * 60, }, log_fn=lambda _msg: None, ) assert aliased_judgment is not None - assert aliased_judgment["dimension_character"] == "legacy alias still parses" + assert aliased_judgment["dimension_character"] == "judgment character is required" quality = core_normalize_mod._compute_batch_quality( assessments={"naming_quality": 80.0}, diff --git a/desloppify/tests/commands/scan/test_plan_reconcile.py b/desloppify/tests/commands/scan/test_plan_reconcile.py index 3d35c1a8..617cd1f3 100644 --- a/desloppify/tests/commands/scan/test_plan_reconcile.py +++ b/desloppify/tests/commands/scan/test_plan_reconcile.py @@ -178,7 +178,7 @@ def test_supersedes_resolved_issue(self): "issue-1": _make_issue(status="resolved"), "issue-2": _make_issue(status="open"), }) - from desloppify.engine._plan.reconcile import reconcile_plan_after_scan + from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan result = reconcile_plan_after_scan(plan, state) assert "issue-1" in result.superseded assert "issue-1" in plan["superseded"] @@ -191,7 +191,7 @@ def test_supersedes_disappeared_issue(self): plan["queue_order"] = ["gone-id"] plan["overrides"] = {"gone-id": {"issue_id": "gone-id"}} state = _make_state(issues={}) - from desloppify.engine._plan.reconcile import reconcile_plan_after_scan + from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan result = reconcile_plan_after_scan(plan, state) assert "gone-id" in result.superseded @@ -202,83 +202,118 @@ def test_no_changes_when_all_alive(self): state = _make_state(issues={ "issue-1": _make_issue(status="open"), }) - changed = reconcile_mod._apply_plan_reconciliation( - plan, state, reconcile_mod.reconcile_plan_after_scan, - ) + changed = reconcile_mod._apply_plan_reconciliation(plan, state) assert changed is False def test_skips_when_no_user_content(self): plan = empty_plan() state = _make_state() - changed = reconcile_mod._apply_plan_reconciliation( - plan, state, reconcile_mod.reconcile_plan_after_scan, - ) + changed = reconcile_mod._apply_plan_reconciliation(plan, state) assert changed is False # --------------------------------------------------------------------------- -# Tests: _sync_subjective_dimensions_display (merged helper) +# Tests: _display_reconcile_results # --------------------------------------------------------------------------- -class TestSyncSubjectiveDimensionsDisplay: +class TestDisplayReconcileResults: - def test_injects_ids(self): + def test_reports_subjective_injection(self, capsys): plan = empty_plan() - plan["queue_order"] = ["issue-1"] - - def mock_sync(p, s): - result = QueueSyncResult() - result.injected = ["subjective::naming"] - p["queue_order"].append("subjective::naming") - return result - - changed = reconcile_mod._sync_subjective_dimensions_display(plan, {}, mock_sync) - assert changed is True - assert "subjective::naming" in plan["queue_order"] + reconcile_mod._display_reconcile_results( + reconcile_mod.ReconcileResult( + subjective=QueueSyncResult(injected=["subjective::naming"]) + ), + plan, + mid_cycle=False, + ) + captured = capsys.readouterr() + assert "1 subjective" in captured.out def test_reports_resurfaced(self, capsys): plan = empty_plan() - - def mock_sync(p, s): - result = QueueSyncResult() - result.resurfaced = ["subjective::naming"] - return result - - reconcile_mod._sync_subjective_dimensions_display(plan, {}, mock_sync) + reconcile_mod._display_reconcile_results( + reconcile_mod.ReconcileResult( + subjective=QueueSyncResult(resurfaced=["subjective::naming"]) + ), + plan, + mid_cycle=False, + ) captured = capsys.readouterr() assert "resurfaced" in captured.out.lower() def test_reports_pruned(self, capsys): plan = empty_plan() + reconcile_mod._display_reconcile_results( + reconcile_mod.ReconcileResult( + subjective=QueueSyncResult(pruned=["subjective::naming"]) + ), + plan, + mid_cycle=False, + ) + captured = capsys.readouterr() + assert "refreshed" in captured.out.lower() or "removed" in captured.out.lower() - def mock_sync(p, s): - result = QueueSyncResult() - result.pruned = ["subjective::naming"] - return result + def test_reports_create_plan(self, capsys): + plan = empty_plan() + reconcile_mod._display_reconcile_results( + reconcile_mod.ReconcileResult( + create_plan=QueueSyncResult(injected=["workflow::create-plan"]) + ), + plan, + mid_cycle=False, + ) + captured = capsys.readouterr() + assert "create-plan" in captured.out - changed = reconcile_mod._sync_subjective_dimensions_display(plan, {}, mock_sync) - assert changed is True + def test_reports_mid_cycle_skip(self, capsys): + plan = empty_plan() + reconcile_mod._display_reconcile_results( + reconcile_mod.ReconcileResult(), + plan, + mid_cycle=True, + ) captured = capsys.readouterr() - assert "refreshed" in captured.out.lower() or "removed" in captured.out.lower() + assert "mid-cycle scan" in captured.out + + +# --------------------------------------------------------------------------- +# Tests: _is_mid_cycle_scan +# --------------------------------------------------------------------------- + +class TestIsMidCycleScan: - def test_reports_injected(self, capsys): + def test_false_when_cycle_not_active(self): plan = empty_plan() + state = _make_state() - def mock_sync(p, s): - result = QueueSyncResult() - result.injected = ["subjective::naming"] - return result + assert reconcile_mod._is_mid_cycle_scan(plan, state) is False - reconcile_mod._sync_subjective_dimensions_display(plan, {}, mock_sync) - captured = capsys.readouterr() - assert "1 subjective" in captured.out + def test_false_when_only_synthetic_or_skipped_items_remain(self): + plan = empty_plan() + plan["plan_start_scores"] = {"strict": 80.0} + plan["queue_order"] = [ + "workflow::communicate-score", + "issue-1", + ] + plan["skipped"] = { + "issue-1": { + "issue_id": "issue-1", + "kind": "temporary", + "skipped_at_scan": 1, + } + } + state = _make_state() - def test_no_change_when_nothing(self): + assert reconcile_mod._is_mid_cycle_scan(plan, state) is False + + def test_true_when_substantive_queue_item_remains(self): plan = empty_plan() - changed = reconcile_mod._sync_subjective_dimensions_display( - plan, {}, lambda p, s: QueueSyncResult(), - ) - assert changed is False + plan["plan_start_scores"] = {"strict": 80.0} + plan["queue_order"] = ["workflow::communicate-score", "issue-1"] + state = _make_state() + + assert reconcile_mod._is_mid_cycle_scan(plan, state) is True # --------------------------------------------------------------------------- @@ -341,5 +376,3 @@ def test_clears_when_queue_empty(self, monkeypatch): assert state["_plan_start_scores_for_reveal"]["strict"] == 70.0 log_actions = [e["action"] for e in plan["execution_log"]] assert "clear_start_scores" in log_actions - - diff --git a/desloppify/tests/commands/test_cli.py b/desloppify/tests/commands/test_cli.py index a4487a2e..780fe619 100644 --- a/desloppify/tests/commands/test_cli.py +++ b/desloppify/tests/commands/test_cli.py @@ -879,17 +879,16 @@ class DummyCfg: assert "deno.json" in markers assert "custom.lock" in markers - def test_lang_config_markers_raises_for_broken_plugin(self, monkeypatch): + def test_lang_config_markers_skips_broken_plugin(self, monkeypatch): monkeypatch.setattr("desloppify.languages.framework.available_langs", lambda: ["dummy"]) monkeypatch.setattr( "desloppify.languages.framework.get_lang", lambda _name: (_ for _ in ()).throw(ImportError("broken plugin")), ) - with pytest.raises(lang_helpers_mod.LangResolutionError) as exc: - lang_helpers_mod._lang_config_markers() - - assert "failed to load" in str(exc.value) + markers = lang_helpers_mod._lang_config_markers() + assert "deno.json" not in markers + assert "custom.lock" not in markers def test_lang_config_markers_refresh_after_plugin_change(self, monkeypatch): class FirstCfg: diff --git a/desloppify/tests/commands/test_cmd_move.py b/desloppify/tests/commands/test_cmd_move.py index d2efb096..40ba059d 100644 --- a/desloppify/tests/commands/test_cmd_move.py +++ b/desloppify/tests/commands/test_cmd_move.py @@ -88,7 +88,7 @@ def test_no_ext(self): def test_full_path(self): assert detect_lang_from_ext("/src/components/Button.tsx") == "typescript" - def test_raises_when_registered_plugin_fails_to_load(self, monkeypatch): + def test_skips_registered_plugin_when_metadata_load_fails(self, monkeypatch): import desloppify.app.commands.move.language as move_lang_mod move_lang_mod._ext_to_lang_map.cache_clear() @@ -99,14 +99,11 @@ def test_raises_when_registered_plugin_fails_to_load(self, monkeypatch): ) monkeypatch.setattr( move_lang_mod, - "load_lang_config", - lambda _name: (_ for _ in ()).throw(CommandError("broken plugin")), + "load_lang_config_metadata", + lambda _name: None, ) - with pytest.raises(CommandError) as exc: - detect_lang_from_ext("foo.py") - - assert "broken plugin" in str(exc.value) + assert detect_lang_from_ext("foo.py") is None move_lang_mod._ext_to_lang_map.cache_clear() diff --git a/desloppify/tests/commands/test_transitive_engine.py b/desloppify/tests/commands/test_transitive_engine.py index 89fe4fc1..47b01a47 100644 --- a/desloppify/tests/commands/test_transitive_engine.py +++ b/desloppify/tests/commands/test_transitive_engine.py @@ -496,19 +496,19 @@ def test_config_show(self): class TestFixerHelpLines: - @patch("desloppify.app.cli_support.parser_groups_admin.get_lang") - def test_fixer_help_lines_with_fixers(self, mock_get_lang): + @patch("desloppify.app.cli_support.parser_groups_admin.load_lang_config") + def test_fixer_help_lines_with_fixers(self, mock_load_lang_config): mock_lang = MagicMock() mock_lang.fixers = {"unused": MagicMock(), "logs": MagicMock()} - mock_get_lang.return_value = mock_lang + mock_load_lang_config.return_value = mock_lang lines = parser_admin_mod._fixer_help_lines(["python"]) assert len(lines) == 1 # one lang line assert "logs, unused" in lines[0] - @patch("desloppify.app.cli_support.parser_groups_admin.get_lang") - def test_fixer_help_lines_import_error(self, mock_get_lang): - mock_get_lang.side_effect = ImportError("no such lang") + @patch("desloppify.app.cli_support.parser_groups_admin.load_lang_config") + def test_fixer_help_lines_import_error(self, mock_load_lang_config): + mock_load_lang_config.side_effect = ImportError("no such lang") lines = parser_admin_mod._fixer_help_lines(["bogus"]) assert "failed to load" in lines[0] diff --git a/desloppify/tests/engine/test_queue_context.py b/desloppify/tests/engine/test_queue_context.py index 56c25212..9c732c4c 100644 --- a/desloppify/tests/engine/test_queue_context.py +++ b/desloppify/tests/engine/test_queue_context.py @@ -2,6 +2,7 @@ from __future__ import annotations +from types import SimpleNamespace from unittest.mock import patch import pytest @@ -62,11 +63,13 @@ def test_auto_load_plan_from_disk(self): """Default sentinel triggers load_plan().""" fake_plan = {"queue_order": ["f1"]} with patch( - "desloppify.engine._work_queue.context.has_living_plan", - return_value=True, - ), patch( - "desloppify.engine._work_queue.context.load_plan", - return_value=fake_plan, + "desloppify.engine._work_queue.context.resolve_persisted_plan_load_status", + return_value=SimpleNamespace( + plan=fake_plan, + degraded=False, + error_kind=None, + recovery=None, + ), ): ctx = queue_context(_minimal_state()) assert ctx.plan is fake_plan @@ -76,11 +79,13 @@ def test_auto_load_plan_from_disk(self): def test_auto_load_plan_handles_failure(self): """When load_plan() raises, plan is None.""" with patch( - "desloppify.engine._work_queue.context.has_living_plan", - return_value=True, - ), patch( - "desloppify.engine._work_queue.context.load_plan", - side_effect=OSError("no plan file"), + "desloppify.engine._work_queue.context.resolve_persisted_plan_load_status", + return_value=SimpleNamespace( + plan=None, + degraded=True, + error_kind="OSError", + recovery="fresh_start", + ), ): ctx = queue_context(_minimal_state()) assert ctx.plan is None @@ -90,8 +95,13 @@ def test_auto_load_plan_handles_failure(self): def test_auto_load_without_plan_file_not_degraded(self): """Missing living plan is not treated as degraded mode.""" with patch( - "desloppify.engine._work_queue.context.has_living_plan", - return_value=False, + "desloppify.engine._work_queue.context.resolve_persisted_plan_load_status", + return_value=SimpleNamespace( + plan=None, + degraded=False, + error_kind=None, + recovery=None, + ), ): ctx = queue_context(_minimal_state()) assert ctx.plan is None diff --git a/desloppify/tests/engine/test_sync_split_modules_direct.py b/desloppify/tests/engine/test_sync_split_modules_direct.py index 0bbd42c1..a2cd9719 100644 --- a/desloppify/tests/engine/test_sync_split_modules_direct.py +++ b/desloppify/tests/engine/test_sync_split_modules_direct.py @@ -6,7 +6,9 @@ import desloppify.engine._plan.auto_cluster_sync_issue as auto_cluster_sync_mod import desloppify.engine._plan.constants as plan_constants_mod -import desloppify.engine._plan.reconcile_review_import as reconcile_import_mod +import desloppify.engine._plan.sync as sync_pkg_mod +import desloppify.engine._plan.scan_issue_reconcile as scan_reconcile_mod +import desloppify.engine._plan.sync.review_import as reconcile_import_mod import desloppify.engine._plan.schema.helpers as schema_helpers_mod import desloppify.engine._plan.sync.auto_prune as sync_auto_prune_mod import desloppify.engine._plan.sync.context as sync_context_mod @@ -229,6 +231,21 @@ def test_reconcile_review_import_prunes_stale_triage_recovery_metadata( assert plan["epic_triage_meta"]["undispositioned_issue_count"] == 1 +def test_reconcile_module_exports_scan_reconcile_only() -> None: + assert scan_reconcile_mod.__all__ == [ + "ReconcileResult", + "reconcile_plan_after_scan", + ] + assert not hasattr(scan_reconcile_mod, "sync_plan_after_review_import") + assert not hasattr(scan_reconcile_mod, "ReviewImportSyncResult") + + +def test_sync_package_includes_review_import_subdomain() -> None: + assert "review_import" in sync_pkg_mod.__all__ + assert hasattr(reconcile_import_mod, "sync_plan_after_review_import") + assert hasattr(reconcile_import_mod, "ReviewImportSyncResult") + + def test_schema_migration_helpers_cover_legacy_cleanup() -> None: assert ( schema_helpers_mod._has_synthesis_artifacts( @@ -476,8 +493,7 @@ def test_sync_workflow_helpers_inject_expected_items(monkeypatch) -> None: r4 = sync_workflow_mod.sync_communicate_score_needed( plan, state, - policy=SimpleNamespace(unscored_ids={"subjective::x"}, has_objective_backlog=True), - scores_just_imported=True, + policy=SimpleNamespace(unscored_ids=set(), has_objective_backlog=True), ) assert r4.injected == ["workflow::communicate-score"] @@ -596,7 +612,7 @@ def test_pending_import_scores_meta_ignores_malformed_refresh_state() -> None: assert meta.packet_sha256 == "hash-from-audit" -def test_sync_communicate_score_reinjects_after_trusted_score_import() -> None: +def test_sync_communicate_score_reinjects_after_trusted_score_import_when_sentinel_cleared() -> None: plan = { "queue_order": ["triage::observe"], "plan_start_scores": { @@ -605,13 +621,11 @@ def test_sync_communicate_score_reinjects_after_trusted_score_import() -> None: "objective": 80.0, "verified": 80.0, }, - "previous_plan_start_scores": {"strict": 65.0}, } result = sync_workflow_mod.sync_communicate_score_needed( plan, state={"issues": {}}, - scores_just_imported=True, current_scores=sync_workflow_mod.ScoreSnapshot( strict=74.5, overall=74.5, @@ -746,7 +760,7 @@ def test_queue_snapshot_keeps_executing_real_queue_items_before_postflight_scan( assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] -def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queueing() -> None: +def test_queue_snapshot_does_not_execute_autofix_cluster_without_queue_ownership() -> None: state = { "issues": { "unused::a": { @@ -777,12 +791,12 @@ def test_queue_snapshot_allows_autofix_cluster_to_execute_without_manual_queuein snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) - assert snapshot.phase == snapshot_mod.PHASE_EXECUTE - assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] - assert "unused::a" not in {item["id"] for item in snapshot.backlog_items} + assert snapshot.phase == snapshot_mod.PHASE_SCAN + assert "unused::a" not in [item["id"] for item in snapshot.execution_items] + assert "unused::a" in {item["id"] for item in snapshot.backlog_items} -def test_queue_snapshot_legacy_autofix_cluster_still_executes_via_normalized_semantics() -> None: +def test_queue_snapshot_legacy_autofix_cluster_stays_backlog_without_queue_ownership() -> None: state = { "issues": { "unused::a": { @@ -812,8 +826,9 @@ def test_queue_snapshot_legacy_autofix_cluster_still_executes_via_normalized_sem snapshot = snapshot_mod.build_queue_snapshot(state, plan=plan) - assert snapshot.phase == snapshot_mod.PHASE_EXECUTE - assert [item["id"] for item in snapshot.execution_items] == ["unused::a"] + assert snapshot.phase == snapshot_mod.PHASE_SCAN + assert "unused::a" not in [item["id"] for item in snapshot.execution_items] + assert "unused::a" in {item["id"] for item in snapshot.backlog_items} def test_queue_snapshot_non_autofix_auto_cluster_does_not_execute_without_queueing() -> None: diff --git a/desloppify/tests/lang/common/test_framework_shared_phases_and_structural_split_direct.py b/desloppify/tests/lang/common/test_framework_shared_phases_and_structural_split_direct.py index ce4adb9e..33644875 100644 --- a/desloppify/tests/lang/common/test_framework_shared_phases_and_structural_split_direct.py +++ b/desloppify/tests/lang/common/test_framework_shared_phases_and_structural_split_direct.py @@ -89,10 +89,18 @@ def test_phase_security_records_default_coverage_when_missing(monkeypatch) -> No ), ) + monkeypatch.setattr(review_mod, "filter_entries", lambda _zones, entries, _detector: entries) monkeypatch.setattr( review_mod, - "detect_security_issues", - lambda _files, _zones, _name, scan_root: ( + "_entries_to_issues", + lambda detector, entries, **_kwargs: [{"detector": detector, "file": e["file"]} for e in entries], + ) + monkeypatch.setattr(review_mod, "_log_phase_summary", lambda *_args, **_kwargs: None) + + issues, potentials = review_mod.phase_security( + Path("."), + lang, + detect_security_issues=lambda _files, _zones, _name, scan_root: ( [ { "file": str(scan_root / "src" / "cross.py"), @@ -105,15 +113,6 @@ def test_phase_security_records_default_coverage_when_missing(monkeypatch) -> No 2, ), ) - monkeypatch.setattr(review_mod, "filter_entries", lambda _zones, entries, _detector: entries) - monkeypatch.setattr( - review_mod, - "_entries_to_issues", - lambda detector, entries, **_kwargs: [{"detector": detector, "file": e["file"]} for e in entries], - ) - monkeypatch.setattr(review_mod, "_log_phase_summary", lambda *_args, **_kwargs: None) - - issues, potentials = review_mod.phase_security(Path("."), lang) assert len(issues) == 2 assert potentials == {"security": 5} diff --git a/desloppify/tests/lang/common/test_shared_phases_security.py b/desloppify/tests/lang/common/test_shared_phases_security.py index 28aa9705..cf23396e 100644 --- a/desloppify/tests/lang/common/test_shared_phases_security.py +++ b/desloppify/tests/lang/common/test_shared_phases_security.py @@ -4,7 +4,6 @@ from types import SimpleNamespace -import desloppify.languages._framework.base.shared_phases as shared_phases_mod from desloppify.languages._framework.base.shared_phases import phase_security from desloppify.languages._framework.base.types import LangSecurityResult @@ -22,23 +21,21 @@ def _lang_stub(*, files_scanned: int): ) -def test_phase_security_uses_max_scan_count_with_lang_security_result(monkeypatch, tmp_path): - monkeypatch.setattr( - shared_phases_mod, - "detect_security_issues", - lambda _files, _zone, _lang, **_kwargs: ([], 2), +def test_phase_security_uses_max_scan_count_with_lang_security_result(tmp_path): + issues, potentials = phase_security( + tmp_path, + _lang_stub(files_scanned=7), + detect_security_issues=lambda _files, _zone, _lang, **_kwargs: ([], 2), ) - issues, potentials = phase_security(tmp_path, _lang_stub(files_scanned=7)) assert issues == [] assert potentials == {"security": 7} -def test_phase_security_keeps_cross_lang_scan_count_when_larger(monkeypatch, tmp_path): - monkeypatch.setattr( - shared_phases_mod, - "detect_security_issues", - lambda _files, _zone, _lang, **_kwargs: ([], 9), +def test_phase_security_keeps_cross_lang_scan_count_when_larger(tmp_path): + issues, potentials = phase_security( + tmp_path, + _lang_stub(files_scanned=3), + detect_security_issues=lambda _files, _zone, _lang, **_kwargs: ([], 9), ) - issues, potentials = phase_security(tmp_path, _lang_stub(files_scanned=3)) assert issues == [] assert potentials == {"security": 9} diff --git a/desloppify/tests/lang/common/test_treesitter.py b/desloppify/tests/lang/common/test_treesitter.py index f63e0335..1daf74ea 100644 --- a/desloppify/tests/lang/common/test_treesitter.py +++ b/desloppify/tests/lang/common/test_treesitter.py @@ -146,10 +146,10 @@ def c_file(tmp_path): class TestGoExtraction: def test_extract_functions(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) # Tiny() should be filtered (< 3 lines normalized) @@ -159,10 +159,10 @@ def test_extract_functions(self, go_file, tmp_path): assert "Add" in names def test_function_line_numbers(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) hello = next(f for f in functions if f.name == "Hello") @@ -170,10 +170,10 @@ def test_function_line_numbers(self, go_file, tmp_path): assert hello.end_line == 10 def test_function_params(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) hello = next(f for f in functions if f.name == "Hello") @@ -184,10 +184,10 @@ def test_function_params(self, go_file, tmp_path): assert "b" in add.params def test_body_hash_deterministic(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions1 = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) functions2 = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) @@ -195,10 +195,10 @@ def test_body_hash_deterministic(self, go_file, tmp_path): assert f1.body_hash == f2.body_hash def test_normalization_strips_comments(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) hello = next(f for f in functions if f.name == "Hello") @@ -208,10 +208,10 @@ def test_normalization_strips_comments(self, go_file, tmp_path): assert "return" in hello.normalized def test_normalization_strips_log_calls(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC functions = ts_extract_functions(tmp_path, GO_SPEC, [go_file]) hello = next(f for f in functions if f.name == "Hello") @@ -220,20 +220,20 @@ def test_normalization_strips_log_calls(self, go_file, tmp_path): class TestRustExtraction: def test_extract_functions(self, rust_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import RUST_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import RUST_SPEC functions = ts_extract_functions(tmp_path, RUST_SPEC, [rust_file]) names = [f.name for f in functions] assert "hello" in names def test_normalization_strips_println(self, rust_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import RUST_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import RUST_SPEC functions = ts_extract_functions(tmp_path, RUST_SPEC, [rust_file]) hello = next(f for f in functions if f.name == "hello") @@ -242,10 +242,10 @@ def test_normalization_strips_println(self, rust_file, tmp_path): class TestRubyExtraction: def test_extract_methods(self, ruby_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_scripting import RUBY_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import RUBY_SPEC functions = ts_extract_functions(tmp_path, RUBY_SPEC, [ruby_file]) names = [f.name for f in functions] @@ -255,10 +255,10 @@ def test_extract_methods(self, ruby_file, tmp_path): class TestJavaExtraction: def test_extract_methods(self, java_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import JAVA_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import JAVA_SPEC functions = ts_extract_functions(tmp_path, JAVA_SPEC, [java_file]) names = [f.name for f in functions] @@ -268,10 +268,10 @@ def test_extract_methods(self, java_file, tmp_path): class TestCExtraction: def test_extract_functions(self, c_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import C_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import C_SPEC functions = ts_extract_functions(tmp_path, C_SPEC, [c_file]) names = [f.name for f in functions] @@ -284,50 +284,50 @@ def test_extract_functions(self, c_file, tmp_path): class TestClassExtraction: def test_go_struct(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC classes = ts_extract_classes(tmp_path, GO_SPEC, [go_file]) names = [c.name for c in classes] assert "MyStruct" in names def test_rust_struct(self, rust_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_compiled import RUST_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import RUST_SPEC classes = ts_extract_classes(tmp_path, RUST_SPEC, [rust_file]) names = [c.name for c in classes] assert "MyStruct" in names def test_java_class(self, java_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_compiled import JAVA_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import JAVA_SPEC classes = ts_extract_classes(tmp_path, JAVA_SPEC, [java_file]) names = [c.name for c in classes] assert "MyClass" in names def test_ruby_class(self, ruby_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_scripting import RUBY_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import RUBY_SPEC classes = ts_extract_classes(tmp_path, RUBY_SPEC, [ruby_file]) names = [c.name for c in classes] assert "MyClass" in names def test_no_class_query_returns_empty(self, go_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_scripting import BASH_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import BASH_SPEC classes = ts_extract_classes(tmp_path, BASH_SPEC, [go_file]) assert classes == [] @@ -338,14 +338,14 @@ def test_no_class_query_returns_empty(self, go_file, tmp_path): class TestGoImportResolver: def test_stdlib_returns_none(self): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_go_import, ) assert resolve_go_import("fmt", "/src/main.go", "/src") is None def test_external_pkg_returns_none(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_go_import, ) @@ -353,10 +353,10 @@ def test_external_pkg_returns_none(self, tmp_path): assert resolve_go_import("github.com/foo/bar", "/src/main.go", str(tmp_path)) is None def test_local_import_resolves(self, tmp_path): - from desloppify.languages._framework.treesitter._import_cache import ( + from desloppify.languages._framework.treesitter.imports.resolver_cache import ( reset_import_cache, ) - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_go_import, ) @@ -380,14 +380,14 @@ def test_local_import_resolves(self, tmp_path): class TestRustImportResolver: def test_external_crate_returns_none(self): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_rust_import, ) assert resolve_rust_import("std::io::Read", "/src/main.rs", "/project") is None def test_crate_import_resolves(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_rust_import, ) @@ -402,7 +402,7 @@ def test_crate_import_resolves(self, tmp_path): class TestRubyImportResolver: def test_relative_require(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_ruby_import, ) @@ -414,7 +414,7 @@ def test_relative_require(self, tmp_path): assert result.endswith("helper.rb") def test_absolute_require_in_lib(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_ruby_import, ) @@ -429,7 +429,7 @@ def test_absolute_require_in_lib(self, tmp_path): class TestCxxIncludeResolver: def test_relative_include(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_cxx_include, ) @@ -441,7 +441,7 @@ def test_relative_include(self, tmp_path): assert result.endswith("local.h") def test_nonexistent_returns_none(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_cxx_include, ) @@ -456,13 +456,13 @@ def test_nonexistent_returns_none(self, tmp_path): class TestDepGraphBuilder: def test_go_dep_graph(self, tmp_path): - from desloppify.languages._framework.treesitter._import_cache import ( + from desloppify.languages._framework.treesitter.imports.resolver_cache import ( reset_import_cache, ) - from desloppify.languages._framework.treesitter._import_graph import ( + from desloppify.languages._framework.treesitter.imports.graph import ( ts_build_dep_graph, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC reset_import_cache() @@ -485,10 +485,10 @@ def test_go_dep_graph(self, tmp_path): reset_import_cache() def test_no_import_query_returns_empty(self, tmp_path): - from desloppify.languages._framework.treesitter._import_graph import ( + from desloppify.languages._framework.treesitter.imports.graph import ( ts_build_dep_graph, ) - from desloppify.languages._framework.treesitter._specs_scripting import BASH_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import BASH_SPEC graph = ts_build_dep_graph(tmp_path, BASH_SPEC, []) assert graph == {} @@ -499,14 +499,14 @@ def test_no_import_query_returns_empty(self, tmp_path): class TestNormalize: def test_strips_comments(self, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( _get_parser, _make_query, _run_query, _unwrap_node, ) - from desloppify.languages._framework.treesitter._normalize import normalize_body - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.imports.normalize import normalize_body + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC source = b"""package main func Hello() string { @@ -558,7 +558,7 @@ def test_generic_lang_stubs_without_treesitter(self): ts_mod._AVAILABLE = False try: from desloppify.languages._framework.generic_support.core import generic_lang - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC cfg = generic_lang( name="_test_no_ts", @@ -582,10 +582,10 @@ def test_generic_lang_stubs_without_treesitter(self): def test_file_read_error_skipped(self, tmp_path): """Files that can't be read are silently skipped.""" - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC bad_path = str(tmp_path / "nonexistent.go") functions = ts_extract_functions(tmp_path, GO_SPEC, [bad_path]) @@ -641,7 +641,7 @@ class TestSpecValidation: """Verify that all specs can actually create queries without errors.""" def _test_spec(self, spec): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( _get_parser, _make_query, ) @@ -661,107 +661,107 @@ def _test_spec(self, spec): assert q is not None def test_go_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC self._test_spec(GO_SPEC) def test_rust_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import RUST_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import RUST_SPEC self._test_spec(RUST_SPEC) def test_ruby_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import RUBY_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import RUBY_SPEC self._test_spec(RUBY_SPEC) def test_java_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import JAVA_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import JAVA_SPEC self._test_spec(JAVA_SPEC) def test_kotlin_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import KOTLIN_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import KOTLIN_SPEC self._test_spec(KOTLIN_SPEC) def test_csharp_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import CSHARP_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import CSHARP_SPEC self._test_spec(CSHARP_SPEC) def test_swift_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import SWIFT_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import SWIFT_SPEC self._test_spec(SWIFT_SPEC) def test_php_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import PHP_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import PHP_SPEC self._test_spec(PHP_SPEC) def test_c_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import C_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import C_SPEC self._test_spec(C_SPEC) def test_cpp_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import CPP_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import CPP_SPEC self._test_spec(CPP_SPEC) def test_scala_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import SCALA_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import SCALA_SPEC self._test_spec(SCALA_SPEC) def test_elixir_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import ELIXIR_SPEC + from desloppify.languages._framework.treesitter.specs.functional import ELIXIR_SPEC self._test_spec(ELIXIR_SPEC) def test_haskell_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import HASKELL_SPEC + from desloppify.languages._framework.treesitter.specs.functional import HASKELL_SPEC self._test_spec(HASKELL_SPEC) def test_bash_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import BASH_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import BASH_SPEC self._test_spec(BASH_SPEC) def test_lua_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import LUA_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import LUA_SPEC self._test_spec(LUA_SPEC) def test_perl_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import PERL_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import PERL_SPEC self._test_spec(PERL_SPEC) def test_clojure_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import CLOJURE_SPEC + from desloppify.languages._framework.treesitter.specs.functional import CLOJURE_SPEC self._test_spec(CLOJURE_SPEC) def test_zig_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import ZIG_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import ZIG_SPEC self._test_spec(ZIG_SPEC) def test_nim_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import NIM_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import NIM_SPEC self._test_spec(NIM_SPEC) def test_powershell_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import POWERSHELL_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import POWERSHELL_SPEC self._test_spec(POWERSHELL_SPEC) def test_gdscript_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import GDSCRIPT_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import GDSCRIPT_SPEC self._test_spec(GDSCRIPT_SPEC) def test_dart_spec(self): - from desloppify.languages._framework.treesitter._specs_compiled import DART_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import DART_SPEC self._test_spec(DART_SPEC) def test_js_spec(self): - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC self._test_spec(JS_SPEC) def test_erlang_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import ERLANG_SPEC + from desloppify.languages._framework.treesitter.specs.functional import ERLANG_SPEC self._test_spec(ERLANG_SPEC) def test_ocaml_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import OCAML_SPEC + from desloppify.languages._framework.treesitter.specs.functional import OCAML_SPEC self._test_spec(OCAML_SPEC) def test_fsharp_spec(self): - from desloppify.languages._framework.treesitter._specs_functional import FSHARP_SPEC + from desloppify.languages._framework.treesitter.specs.functional import FSHARP_SPEC self._test_spec(FSHARP_SPEC) @@ -776,7 +776,7 @@ def test_cache_hit(self, go_file, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._extractors import _get_parser + from desloppify.languages._framework.treesitter.analysis.extractors import _get_parser parser, _language = _get_parser("go") with runtime_scope(make_runtime_context()): @@ -798,7 +798,7 @@ def test_cache_disabled(self, go_file, tmp_path): current_parse_tree_cache, disable_parse_cache, ) - from desloppify.languages._framework.treesitter._extractors import _get_parser + from desloppify.languages._framework.treesitter.analysis.extractors import _get_parser with runtime_scope(make_runtime_context()): disable_parse_cache() @@ -833,7 +833,7 @@ def test_cache_cleanup(self): class TestBashSourceResolver: def test_resolve_relative(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_bash_source, ) @@ -845,7 +845,7 @@ def test_resolve_relative(self, tmp_path): assert result.endswith("helper.sh") def test_resolve_with_ext_added(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_bash_source, ) @@ -857,7 +857,7 @@ def test_resolve_with_ext_added(self, tmp_path): assert result.endswith("lib.sh") def test_nonexistent_returns_none(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_bash_source, ) @@ -869,7 +869,7 @@ def test_nonexistent_returns_none(self, tmp_path): class TestPerlImportResolver: def test_local_module(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_perl_import, ) @@ -884,7 +884,7 @@ def test_local_module(self, tmp_path): assert result.endswith("User.pm") def test_pragma_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_perl_import, ) @@ -892,7 +892,7 @@ def test_pragma_skipped(self): assert resolve_perl_import("warnings", "/src/app.pl", "/src") is None def test_stdlib_prefix_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_perl_import, ) @@ -902,7 +902,7 @@ def test_stdlib_prefix_skipped(self): class TestZigImportResolver: def test_local_import(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_zig_import, ) @@ -914,7 +914,7 @@ def test_local_import(self, tmp_path): assert result.endswith("utils.zig") def test_std_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_zig_import, ) @@ -924,7 +924,7 @@ def test_std_skipped(self): class TestHaskellImportResolver: def test_local_module(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_haskell_import, ) @@ -939,7 +939,7 @@ def test_local_module(self, tmp_path): assert result.endswith("Module.hs") def test_stdlib_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_haskell_import, ) @@ -950,7 +950,7 @@ def test_stdlib_skipped(self): class TestErlangIncludeResolver: def test_relative_include(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_erlang_include, ) @@ -962,7 +962,7 @@ def test_relative_include(self, tmp_path): assert result.endswith("header.hrl") def test_include_dir(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_erlang_include, ) @@ -979,7 +979,7 @@ def test_include_dir(self, tmp_path): class TestOcamlImportResolver: def test_local_module(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_ocaml_import, ) @@ -994,7 +994,7 @@ def test_local_module(self, tmp_path): assert result.endswith("mymodule.ml") def test_stdlib_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_ocaml_import, ) @@ -1004,7 +1004,7 @@ def test_stdlib_skipped(self): class TestFsharpImportResolver: def test_local_module(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_fsharp_import, ) @@ -1019,7 +1019,7 @@ def test_local_module(self, tmp_path): assert result.endswith("MyModule.fs") def test_stdlib_skipped(self): - from desloppify.languages._framework.treesitter._import_resolvers_functional import ( + from desloppify.languages._framework.treesitter.imports.resolvers_functional import ( resolve_fsharp_import, ) @@ -1029,7 +1029,7 @@ def test_stdlib_skipped(self): class TestSwiftImportResolver: def test_local_module_path(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_swift_import, ) @@ -1046,7 +1046,7 @@ def test_local_module_path(self, tmp_path): assert result.endswith("Client.swift") def test_external_module_returns_none(self): - from desloppify.languages._framework.treesitter._import_resolvers_backend import ( + from desloppify.languages._framework.treesitter.imports.resolvers_backend import ( resolve_swift_import, ) @@ -1055,7 +1055,7 @@ def test_external_module_returns_none(self): class TestJsImportResolver: def test_relative_import(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_js_import, ) @@ -1067,7 +1067,7 @@ def test_relative_import(self, tmp_path): assert result.endswith("utils.js") def test_npm_package_returns_none(self): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_js_import, ) @@ -1075,7 +1075,7 @@ def test_npm_package_returns_none(self): assert resolve_js_import("lodash/fp", "/src/main.js", "/src") is None def test_jsx_extension(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_js_import, ) @@ -1087,7 +1087,7 @@ def test_jsx_extension(self, tmp_path): assert result.endswith("App.jsx") def test_index_resolution(self, tmp_path): - from desloppify.languages._framework.treesitter._import_resolvers_scripts import ( + from desloppify.languages._framework.treesitter.imports.resolvers_scripts import ( resolve_js_import, ) @@ -1130,10 +1130,10 @@ class Calculator { return str(f) def test_function_extraction(self, js_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC functions = ts_extract_functions(tmp_path, JS_SPEC, [js_file]) names = [f.name for f in functions] @@ -1142,20 +1142,20 @@ def test_function_extraction(self, js_file, tmp_path): assert "multiply" in names def test_class_extraction(self, js_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_classes, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC classes = ts_extract_classes(tmp_path, JS_SPEC, [js_file]) names = [c.name for c in classes] assert "Calculator" in names def test_normalization_strips_console(self, js_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC functions = ts_extract_functions(tmp_path, JS_SPEC, [js_file]) greet = next(f for f in functions if f.name == "greet") diff --git a/desloppify/tests/lang/common/test_treesitter_complexity_and_integration.py b/desloppify/tests/lang/common/test_treesitter_complexity_and_integration.py index 2f62db98..c3cbe82a 100644 --- a/desloppify/tests/lang/common/test_treesitter_complexity_and_integration.py +++ b/desloppify/tests/lang/common/test_treesitter_complexity_and_integration.py @@ -18,11 +18,11 @@ def test_nesting_depth(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_nesting import ( + from desloppify.languages._framework.treesitter.analysis.complexity_nesting import ( compute_nesting_depth_ts, ) - from desloppify.languages._framework.treesitter._extractors import _get_parser - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.extractors import _get_parser + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = """\ package main @@ -54,11 +54,11 @@ def test_nesting_depth_flat_file(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_nesting import ( + from desloppify.languages._framework.treesitter.analysis.complexity_nesting import ( compute_nesting_depth_ts, ) - from desloppify.languages._framework.treesitter._extractors import _get_parser - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.extractors import _get_parser + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = """\ package main @@ -85,10 +85,10 @@ def test_long_functions_compute(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_function_metrics import ( + from desloppify.languages._framework.treesitter.analysis.complexity_function_metrics import ( make_long_functions_compute, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # Create a function with > 80 lines. body_lines = "\n".join(f" x{i} := {i}" for i in range(90)) @@ -113,10 +113,10 @@ def test_long_functions_no_big_fn(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_function_metrics import ( + from desloppify.languages._framework.treesitter.analysis.complexity_function_metrics import ( make_long_functions_compute, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = "package main\n\nfunc small() {\n x := 1\n}\n" f = tmp_path / "small.go" @@ -160,10 +160,10 @@ def erlang_file(self, tmp_path): return str(f) def test_function_extraction(self, erlang_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_functional import ERLANG_SPEC + from desloppify.languages._framework.treesitter.specs.functional import ERLANG_SPEC functions = ts_extract_functions(tmp_path, ERLANG_SPEC, [erlang_file]) # Erlang functions — at least some should be extracted. @@ -195,10 +195,10 @@ def ocaml_file(self, tmp_path): return str(f) def test_function_extraction(self, ocaml_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_functional import OCAML_SPEC + from desloppify.languages._framework.treesitter.specs.functional import OCAML_SPEC functions = ts_extract_functions(tmp_path, OCAML_SPEC, [ocaml_file]) assert len(functions) >= 1 @@ -225,10 +225,10 @@ def fsharp_file(self, tmp_path): return str(f) def test_function_extraction(self, fsharp_file, tmp_path): - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_functional import FSHARP_SPEC + from desloppify.languages._framework.treesitter.specs.functional import FSHARP_SPEC functions = ts_extract_functions(tmp_path, FSHARP_SPEC, [fsharp_file]) # F# let bindings may or may not match — depends on grammar details. @@ -284,10 +284,10 @@ def test_cyclomatic_simple(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_function_metrics import ( + from desloppify.languages._framework.treesitter.analysis.complexity_function_metrics import ( make_cyclomatic_complexity_compute, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = """\ package main @@ -326,10 +326,10 @@ def test_cyclomatic_trivial(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_function_metrics import ( + from desloppify.languages._framework.treesitter.analysis.complexity_function_metrics import ( make_cyclomatic_complexity_compute, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = "package main\n\nfunc simple() {\n x := 1\n _ = x\n}\n" f = tmp_path / "simple.go" @@ -351,10 +351,10 @@ def test_many_params(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_function_metrics import ( + from desloppify.languages._framework.treesitter.analysis.complexity_function_metrics import ( make_max_params_compute, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC code = """\ package main @@ -384,10 +384,10 @@ def test_nested_callbacks(self, tmp_path): disable_parse_cache, enable_parse_cache, ) - from desloppify.languages._framework.treesitter._complexity_nesting import ( + from desloppify.languages._framework.treesitter.analysis.complexity_nesting import ( make_callback_depth_compute, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC code = """\ const nested = () => { @@ -418,7 +418,7 @@ def test_nested_callbacks(self, tmp_path): class TestEmptyCatches: def test_detect_empty_catch_python(self, tmp_path): - from desloppify.languages._framework.treesitter._smells import ( + from desloppify.languages._framework.treesitter.analysis.smells import ( detect_empty_catches, ) @@ -447,7 +447,7 @@ def test_detect_empty_catch_python(self, tmp_path): def test_detect_nonempty_catch(self, tmp_path): from desloppify.languages._framework.treesitter import TreeSitterLangSpec - from desloppify.languages._framework.treesitter._smells import ( + from desloppify.languages._framework.treesitter.analysis.smells import ( detect_empty_catches, ) @@ -469,10 +469,10 @@ def test_detect_nonempty_catch(self, tmp_path): assert len(entries) == 0 def test_detect_empty_catch_js(self, tmp_path): - from desloppify.languages._framework.treesitter._smells import ( + from desloppify.languages._framework.treesitter.analysis.smells import ( detect_empty_catches, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC code = """\ try { @@ -489,10 +489,10 @@ def test_detect_empty_catch_js(self, tmp_path): class TestUnreachableCode: def test_detect_after_return(self, tmp_path): - from desloppify.languages._framework.treesitter._smells import ( + from desloppify.languages._framework.treesitter.analysis.smells import ( detect_unreachable_code, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC code = """\ function foo() { @@ -508,10 +508,10 @@ def test_detect_after_return(self, tmp_path): assert entries[0]["after"] == "return_statement" def test_no_unreachable(self, tmp_path): - from desloppify.languages._framework.treesitter._smells import ( + from desloppify.languages._framework.treesitter.analysis.smells import ( detect_unreachable_code, ) - from desloppify.languages._framework.treesitter._specs_scripting import JS_SPEC + from desloppify.languages._framework.treesitter.specs.scripting import JS_SPEC code = """\ function foo(x) { @@ -536,7 +536,7 @@ def test_cohesive_file_no_flags(self, tmp_path): from desloppify.languages._framework.treesitter.analysis.cohesion import ( detect_responsibility_cohesion, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # Create a file with connected functions (all call each other). code = "package main\n\n" @@ -558,7 +558,7 @@ def test_disconnected_singletons_not_flagged(self, tmp_path): from desloppify.languages._framework.treesitter.analysis.cohesion import ( detect_responsibility_cohesion, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # All-singleton file (toolkit pattern) — should NOT be flagged. code = "package main\n\n" @@ -579,7 +579,7 @@ def test_mixed_responsibilities_flagged(self, tmp_path): from desloppify.languages._framework.treesitter.analysis.cohesion import ( detect_responsibility_cohesion, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # File with 3+ distinct groups of interrelated functions — # genuinely mixed responsibilities. @@ -617,8 +617,8 @@ def test_mixed_responsibilities_flagged(self, tmp_path): class TestUnusedImports: def test_unused_import_detected(self, tmp_path): - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC - from desloppify.languages._framework.treesitter._unused_imports import ( + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.unused_imports import ( detect_unused_imports, ) @@ -643,8 +643,8 @@ def test_unused_import_detected(self, tmp_path): assert "fmt" not in names def test_no_unused_imports(self, tmp_path): - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC - from desloppify.languages._framework.treesitter._unused_imports import ( + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.unused_imports import ( detect_unused_imports, ) @@ -665,8 +665,8 @@ def test_no_unused_imports(self, tmp_path): def test_go_aliased_import_not_false_positive(self, tmp_path): """Go-style aliased imports (alias before path) should use the alias name.""" - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC - from desloppify.languages._framework.treesitter._unused_imports import ( + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.unused_imports import ( detect_unused_imports, ) @@ -695,8 +695,8 @@ def test_go_aliased_import_not_false_positive(self, tmp_path): def test_go_aliased_import_unused(self, tmp_path): """Go-style aliased import that IS unused should be detected.""" - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC - from desloppify.languages._framework.treesitter._unused_imports import ( + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC + from desloppify.languages._framework.treesitter.analysis.unused_imports import ( detect_unused_imports, ) @@ -724,7 +724,7 @@ def test_go_aliased_import_unused(self, tmp_path): def test_no_import_query_returns_empty(self, tmp_path): from desloppify.languages._framework.treesitter import TreeSitterLangSpec - from desloppify.languages._framework.treesitter._unused_imports import ( + from desloppify.languages._framework.treesitter.analysis.unused_imports import ( detect_unused_imports, ) @@ -744,10 +744,10 @@ def test_no_import_query_returns_empty(self, tmp_path): class TestSignatureVariance: def test_detects_variance(self, tmp_path): from desloppify.engine.detectors.signature import detect_signature_variance - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # Create 3 files with same function name but different params. for i in range(3): @@ -765,10 +765,10 @@ def test_detects_variance(self, tmp_path): def test_no_variance_when_identical(self, tmp_path): from desloppify.engine.detectors.signature import detect_signature_variance - from desloppify.languages._framework.treesitter._extractors import ( + from desloppify.languages._framework.treesitter.analysis.extractors import ( ts_extract_functions, ) - from desloppify.languages._framework.treesitter._specs_compiled import GO_SPEC + from desloppify.languages._framework.treesitter.specs.compiled import GO_SPEC # Create 3 files with identical function signatures. for i in range(3): diff --git a/desloppify/tests/plan/test_epic_triage_reconcile_and_migration.py b/desloppify/tests/plan/test_epic_triage_reconcile_and_migration.py index f2f98924..b79fcba9 100644 --- a/desloppify/tests/plan/test_epic_triage_reconcile_and_migration.py +++ b/desloppify/tests/plan/test_epic_triage_reconcile_and_migration.py @@ -3,7 +3,7 @@ from __future__ import annotations from desloppify.engine._plan.triage.core import TriageResult, apply_triage_to_plan -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.schema import empty_plan, ensure_plan_defaults, triage_clusters diff --git a/desloppify/tests/plan/test_persistence_runtime_paths.py b/desloppify/tests/plan/test_persistence_runtime_paths.py index 99a0d926..33729363 100644 --- a/desloppify/tests/plan/test_persistence_runtime_paths.py +++ b/desloppify/tests/plan/test_persistence_runtime_paths.py @@ -32,3 +32,35 @@ def test_plan_persistence_honors_monkeypatched_plan_file(monkeypatch, tmp_path): assert custom_plan_file.exists() assert loaded["queue_order"] == ["review::b.py::issue-2"] + + +def test_resolve_plan_load_status_marks_backup_recovery_degraded(tmp_path, capsys): + plan_file = tmp_path / "plan.json" + backup_file = tmp_path / "plan.json.bak" + plan_file.write_text("{not json", encoding="utf-8") + backup_file.write_text( + '{"version": 8, "created": "2026-01-01T00:00:00+00:00", "updated": "2026-01-01T00:00:00+00:00", "queue_order": ["review::a.py::issue-1"], "deferred": [], "skipped": {}, "active_cluster": null, "overrides": {}, "clusters": {}, "superseded": {}, "promoted_ids": [], "plan_start_scores": {}, "refresh_state": {}, "execution_log": [], "epic_triage_meta": {}, "commit_log": [], "uncommitted_issues": [], "commit_tracking_branch": null}\n', + encoding="utf-8", + ) + + status = persistence_mod.resolve_plan_load_status(plan_file) + + assert status.degraded is True + assert status.recovery == "backup" + assert status.error_kind == "JSONDecodeError" + assert status.plan is not None + assert status.plan["queue_order"] == ["review::a.py::issue-1"] + assert "recovered from backup" in capsys.readouterr().err + + +def test_resolve_plan_load_status_marks_fresh_start_when_recovery_fails(tmp_path, capsys): + plan_file = tmp_path / "plan.json" + plan_file.write_text("{not json", encoding="utf-8") + + status = persistence_mod.resolve_plan_load_status(plan_file) + + assert status.degraded is True + assert status.recovery == "fresh_start" + assert status.error_kind == "JSONDecodeError" + assert status.plan == empty_plan() + assert "starting fresh" in capsys.readouterr().err.lower() diff --git a/desloppify/tests/plan/test_reconcile.py b/desloppify/tests/plan/test_reconcile.py index 4e7d4b28..3e13eb1b 100644 --- a/desloppify/tests/plan/test_reconcile.py +++ b/desloppify/tests/plan/test_reconcile.py @@ -3,7 +3,7 @@ from __future__ import annotations from desloppify.engine._plan.operations.cluster import add_to_cluster, create_cluster -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.schema import empty_plan, ensure_plan_defaults # --------------------------------------------------------------------------- diff --git a/desloppify/tests/plan/test_reconcile_pipeline.py b/desloppify/tests/plan/test_reconcile_pipeline.py new file mode 100644 index 00000000..33239ef1 --- /dev/null +++ b/desloppify/tests/plan/test_reconcile_pipeline.py @@ -0,0 +1,128 @@ +"""Direct tests for the shared reconcile pipeline and queue ownership rules.""" + +from __future__ import annotations + +from desloppify.engine._plan.auto_cluster import auto_cluster_issues +from desloppify.engine._plan.schema import empty_plan +from desloppify.engine._plan.sync import live_planned_queue_empty, reconcile_plan +from desloppify.engine._work_queue.snapshot import ( + PHASE_EXECUTE, + PHASE_REVIEW_POSTFLIGHT, + build_queue_snapshot, +) + + +def _issue(issue_id: str, detector: str = "unused") -> dict: + return { + "id": issue_id, + "detector": detector, + "status": "open", + "file": "src/app.py", + "tier": 1, + "confidence": "high", + "summary": issue_id, + "detail": {}, + } + + +def test_live_planned_queue_empty_uses_queue_order_only() -> None: + plan = empty_plan() + plan["clusters"] = { + "manual/review": { + "name": "manual/review", + "issue_ids": ["unused::a"], + "execution_status": "active", + } + } + plan["overrides"] = { + "unused::a": { + "issue_id": "unused::a", + "cluster": "manual/review", + } + } + + assert live_planned_queue_empty(plan) is True + + +def test_reconcile_plan_noops_when_live_queue_not_empty() -> None: + state = {"issues": {"unused::a": _issue("unused::a")}} + plan = empty_plan() + plan["queue_order"] = ["unused::a"] + plan["plan_start_scores"] = {"strict": 80.0} + + result = reconcile_plan(plan, state, target_strict=95.0) + + assert result.dirty is False + assert result.workflow_injected_ids == [] + assert plan["queue_order"] == ["unused::a"] + + +def test_auto_cluster_issues_is_noop_mid_cycle() -> None: + state = { + "issues": { + "unused::a": _issue("unused::a"), + "unused::b": _issue("unused::b"), + } + } + plan = empty_plan() + plan["queue_order"] = ["unused::a"] + plan["plan_start_scores"] = {"strict": 80.0} + + changes = auto_cluster_issues(plan, state) + + assert changes == 0 + assert plan["clusters"] == {} + + +def test_queue_snapshot_executes_review_items_promoted_into_active_cluster() -> None: + state = { + "issues": { + "review::a": _issue("review::a", detector="review"), + } + } + plan = empty_plan() + plan["queue_order"] = ["review::a"] + plan["plan_start_scores"] = {"strict": 80.0} + plan["epic_triage_meta"] = { + "triaged_ids": ["review::a"], + "issue_snapshot_hash": "stable", + } + plan["clusters"] = { + "epic/review": { + "name": "epic/review", + "issue_ids": ["review::a"], + "execution_status": "active", + } + } + + snapshot = build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == PHASE_EXECUTE + assert [item["id"] for item in snapshot.execution_items] == ["review::a"] + + +def test_queue_snapshot_keeps_unpromoted_review_cluster_in_postflight() -> None: + state = { + "issues": { + "review::a": _issue("review::a", detector="review"), + } + } + plan = empty_plan() + plan["epic_triage_meta"] = { + "triaged_ids": ["review::a"], + "issue_snapshot_hash": "stable", + } + plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 1} + plan["clusters"] = { + "manual/review": { + "name": "manual/review", + "issue_ids": ["review::a"], + "execution_status": "review", + } + } + + snapshot = build_queue_snapshot(state, plan=plan) + + assert live_planned_queue_empty(plan) is True + assert snapshot.phase == PHASE_REVIEW_POSTFLIGHT + assert [item["id"] for item in snapshot.execution_items] == ["review::a"] diff --git a/desloppify/tests/plan/test_skip.py b/desloppify/tests/plan/test_skip.py index b4926b4a..f62e9ca8 100644 --- a/desloppify/tests/plan/test_skip.py +++ b/desloppify/tests/plan/test_skip.py @@ -14,7 +14,7 @@ skip_items, unskip_items, ) -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.schema import ( empty_plan, ensure_plan_defaults, diff --git a/desloppify/tests/plan/test_stale_dimensions.py b/desloppify/tests/plan/test_stale_dimensions.py index 87ac4528..0bbcb0a5 100644 --- a/desloppify/tests/plan/test_stale_dimensions.py +++ b/desloppify/tests/plan/test_stale_dimensions.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.sync.dimensions import sync_subjective_dimensions diff --git a/desloppify/tests/plan/test_unified_status_lifecycle.py b/desloppify/tests/plan/test_unified_status_lifecycle.py index 19e3a16d..8538b159 100644 --- a/desloppify/tests/plan/test_unified_status_lifecycle.py +++ b/desloppify/tests/plan/test_unified_status_lifecycle.py @@ -17,7 +17,7 @@ skip_items, unskip_items, ) -from desloppify.engine._plan.reconcile import reconcile_plan_after_scan +from desloppify.engine._plan.scan_issue_reconcile import reconcile_plan_after_scan from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.skip_policy import ( skip_kind_needs_state_reopen, diff --git a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py index ec2ae52c..e80739c0 100644 --- a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py +++ b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py @@ -626,7 +626,7 @@ def test_triage_stages_hidden_during_initial_reviews(): def test_subjective_phase_precedes_score_and_triage_when_objective_drained(): - """With no objective backlog, stale/under-target subjective reruns come first.""" + """Workflow items stay ahead of subjective reruns once postflight begins.""" state = _state( [], dimension_scores={ @@ -662,7 +662,7 @@ def test_subjective_phase_precedes_score_and_triage_when_objective_drained(): } queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) ids = [item["id"] for item in queue["items"]] - assert ids == ["subjective::naming_quality"] + assert ids == ["workflow::communicate-score"] def test_triage_stages_sort_after_workflow_in_natural_ranking(): diff --git a/desloppify/tests/review/work_queue_cases.py b/desloppify/tests/review/work_queue_cases.py index ba779763..41782cfd 100644 --- a/desloppify/tests/review/work_queue_cases.py +++ b/desloppify/tests/review/work_queue_cases.py @@ -232,12 +232,10 @@ def test_subjective_item_uses_show_review_when_matching_review_issues_exist(): queue = build_work_queue( state, count=None, include_subjective=True, subjective_threshold=95 ) - subj = next( - item for item in queue["items"] if item["kind"] == "subjective_dimension" - ) - assert subj["id"] == "subjective::mid_level_elegance" - assert subj["primary_command"] == "desloppify show review --status open" - assert subj["detail"]["open_review_issues"] == 1 + item = queue["items"][0] + assert item["id"] == "review::.::holistic::mid_level_elegance::split" + assert item["kind"] == "issue" + assert all(entry["kind"] != "subjective_dimension" for entry in queue["items"]) def test_stale_subjective_item_uses_show_review_when_matching_review_issues_exist(): @@ -274,12 +272,10 @@ def test_stale_subjective_item_uses_show_review_when_matching_review_issues_exis queue = build_work_queue( state, count=None, include_subjective=True, subjective_threshold=95 ) - subj = next( - item for item in queue["items"] if item["kind"] == "subjective_dimension" - ) - assert "[stale — re-review]" in subj["summary"] - assert subj["primary_command"] == "desloppify show review --status open" - assert subj["detail"]["open_review_issues"] == 1 + item = queue["items"][0] + assert item["id"] == "review::.::holistic::initialization_coupling::abc12345" + assert item["kind"] == "issue" + assert all(entry["kind"] != "subjective_dimension" for entry in queue["items"]) def test_unassessed_subjective_item_points_to_holistic_refresh(): From c08b84deeef0fb883c1444415c472a54cf194ad8 Mon Sep 17 00:00:00 2001 From: Andrew Robinson Date: Fri, 13 Mar 2026 11:52:58 +0000 Subject: [PATCH 05/15] fix: unblock objective resolves while triage is pending --- desloppify/app/commands/helpers/guardrails.py | 68 ++++++++++++-- .../app/commands/plan/triage/lifecycle.py | 2 +- desloppify/app/commands/resolve/cmd.py | 2 + desloppify/engine/plan_triage.py | 12 ++- .../tests/commands/helpers/test_guardrails.py | 93 +++++++++++++++++++ .../tests/plan/test_triage_phase_banner.py | 16 ++++ 6 files changed, 185 insertions(+), 8 deletions(-) create mode 100644 desloppify/tests/commands/helpers/test_guardrails.py diff --git a/desloppify/app/commands/helpers/guardrails.py b/desloppify/app/commands/helpers/guardrails.py index 50852365..d3286503 100644 --- a/desloppify/app/commands/helpers/guardrails.py +++ b/desloppify/app/commands/helpers/guardrails.py @@ -5,9 +5,11 @@ import logging from dataclasses import dataclass, field +from desloppify import state as state_mod from desloppify.app.commands.helpers.issue_id_display import short_issue_id from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS, CommandError from desloppify.base.output.terminal import colorize +from desloppify.engine._plan.sync.context import has_objective_backlog, is_mid_cycle from desloppify.engine.plan_state import load_plan from desloppify.engine.plan_triage import ( TRIAGE_CMD_RUN_STAGES_CLAUDE, @@ -18,6 +20,7 @@ ) logger = logging.getLogger(__name__) +_REVIEW_DETECTORS = frozenset({"review", "concerns"}) @dataclass @@ -25,6 +28,7 @@ class TriageGuardrailResult: """Structured result from triage staleness detection.""" is_stale: bool = False + pending_behind_objective_backlog: bool = False new_ids: set[str] = field(default_factory=set) _plan: dict | None = field(default=None, repr=False) _snapshot: TriageSnapshot | None = field(default=None, repr=False) @@ -48,8 +52,16 @@ def triage_guardrail_status( if not snapshot.is_triage_stale: return TriageGuardrailResult(_plan=resolved_plan, _snapshot=snapshot) + pending_behind_objective_backlog = ( + not snapshot.has_triage_in_queue + and bool(resolved_state) + and is_mid_cycle(resolved_plan) + and has_objective_backlog(resolved_state, None) + ) + return TriageGuardrailResult( is_stale=True, + pending_behind_objective_backlog=pending_behind_objective_backlog, new_ids=set(snapshot.new_since_triage_ids), _plan=resolved_plan, _snapshot=snapshot, @@ -69,11 +81,17 @@ def triage_guardrail_messages( messages: list[str] = [] if result.new_ids: - messages.append( - f"{len(result.new_ids)} new review work item(s) not yet triaged." - " Run the staged triage runner to incorporate them " - f"(`{TRIAGE_CMD_RUN_STAGES_CODEX}` or `{TRIAGE_CMD_RUN_STAGES_CLAUDE}`)." - ) + if result.pending_behind_objective_backlog: + messages.append( + f"{len(result.new_ids)} new review issue(s) arrived since the last triage." + " They will activate after the current objective backlog is clear." + ) + else: + messages.append( + f"{len(result.new_ids)} new review issue(s) not yet triaged." + " Run the staged triage runner to incorporate them " + f"(`{TRIAGE_CMD_RUN_STAGES_CODEX}` or `{TRIAGE_CMD_RUN_STAGES_CLAUDE}`)." + ) if result._plan is not None: banner = triage_phase_banner(result._plan, resolved_state, snapshot=result._snapshot) @@ -98,11 +116,13 @@ def print_triage_guardrail_info( def require_triage_current_or_exit( *, state: dict, + plan: dict | None = None, + patterns: list[str] | None = None, bypass: bool = False, attest: str = "", ) -> None: """Gate: exit(1) if triage is stale and not bypassed. Name signals the exit.""" - result = triage_guardrail_status(state=state) + result = triage_guardrail_status(plan=plan, state=state) if not result.is_stale: return @@ -113,7 +133,29 @@ def require_triage_current_or_exit( )) return + if result.pending_behind_objective_backlog and patterns: + matched_targets = _matched_open_targets(state, patterns) + if matched_targets and not _targets_include_review_work(matched_targets): + banner = triage_phase_banner( + result._plan or {}, + state, + snapshot=result._snapshot, + ) + if banner: + print(colorize(f" {banner}", "yellow")) + return + new_ids = result.new_ids + if result.pending_behind_objective_backlog: + lines = [ + "BLOCKED: review issues changed since the last triage, but triage is pending" + " behind the current objective backlog.", + "", + " Finish current objective work first; triage will activate after the backlog clears.", + ' To bypass: --force-resolve --attest "I understand the plan may be stale..."', + ] + raise CommandError("\n".join(lines)) + lines = [ f"BLOCKED: {len(new_ids) or 'some'} new review work item(s) have not been triaged." ] @@ -135,6 +177,20 @@ def require_triage_current_or_exit( raise CommandError("\n".join(lines)) +def _matched_open_targets(state: dict, patterns: list[str]) -> list[dict]: + matched_by_id: dict[str, dict] = {} + for pattern in patterns: + for issue in state_mod.match_issues(state, pattern, status_filter="open"): + issue_id = str(issue.get("id", "")).strip() + if issue_id and issue_id not in matched_by_id: + matched_by_id[issue_id] = issue + return list(matched_by_id.values()) + + +def _targets_include_review_work(matched_targets: list[dict]) -> bool: + return any(issue.get("detector") in _REVIEW_DETECTORS for issue in matched_targets) + + __all__ = [ "TriageGuardrailResult", "print_triage_guardrail_info", diff --git a/desloppify/app/commands/plan/triage/lifecycle.py b/desloppify/app/commands/plan/triage/lifecycle.py index 75b0ac2f..1fcbfba8 100644 --- a/desloppify/app/commands/plan/triage/lifecycle.py +++ b/desloppify/app/commands/plan/triage/lifecycle.py @@ -58,7 +58,7 @@ def _print_triage_start_block(reason: str, *, deps: TriageLifecycleDeps) -> None ) return - print(deps.colorize(" Cannot start triage while objective backlog is still open.", "red")) + print(deps.colorize(" Triage is pending behind the current objective backlog.", "red")) print( deps.colorize( " Finish current objective work first, or pass --attestation " diff --git a/desloppify/app/commands/resolve/cmd.py b/desloppify/app/commands/resolve/cmd.py index 871eb2ae..aad50bca 100644 --- a/desloppify/app/commands/resolve/cmd.py +++ b/desloppify/app/commands/resolve/cmd.py @@ -74,6 +74,8 @@ def _load_state_with_guards( if args.status == "fixed": require_triage_current_or_exit( state=state, + plan=plan_access.plan if isinstance(plan_access.plan, dict) and not plan_access.degraded else None, + patterns=args.patterns, bypass=bool(getattr(args, "force_resolve", False)), attest=getattr(args, "attest", "") or "", ) diff --git a/desloppify/engine/plan_triage.py b/desloppify/engine/plan_triage.py index 2ad1a830..9b9c2d63 100644 --- a/desloppify/engine/plan_triage.py +++ b/desloppify/engine/plan_triage.py @@ -59,7 +59,7 @@ TriageStartDecision, decide_triage_start, ) -from desloppify.engine._plan.sync.context import has_objective_backlog +from desloppify.engine._plan.sync.context import has_objective_backlog, is_mid_cycle from desloppify.engine.plan_state import PlanModel, ensure_plan_defaults @@ -80,6 +80,16 @@ def triage_phase_banner( resolved_snapshot = snapshot or build_triage_snapshot(plan, resolved_state) if not resolved_snapshot.has_triage_in_queue: + if ( + resolved_state + and resolved_snapshot.is_triage_stale + and is_mid_cycle(plan) + and has_objective_backlog(resolved_state, None) + ): + return ( + "TRIAGE PENDING — review issues changed since last triage and will " + "activate after objective work is complete." + ) undispositioned = len(resolved_snapshot.undispositioned_ids) if undispositioned: return ( diff --git a/desloppify/tests/commands/helpers/test_guardrails.py b/desloppify/tests/commands/helpers/test_guardrails.py new file mode 100644 index 00000000..f0916bed --- /dev/null +++ b/desloppify/tests/commands/helpers/test_guardrails.py @@ -0,0 +1,93 @@ +"""Regression tests for triage guardrails around deferred mid-cycle triage.""" + +from __future__ import annotations + +import pytest + +from desloppify.app.commands.helpers.guardrails import ( + require_triage_current_or_exit, + triage_guardrail_messages, + triage_guardrail_status, +) +from desloppify.base.exception_sets import CommandError +from desloppify.engine._plan.schema import empty_plan + + +def _pending_triage_plan() -> dict: + plan = empty_plan() + plan["plan_start_scores"] = {"strict": 72.0} + plan["epic_triage_meta"] = {"triaged_ids": ["review::old"]} + return plan + + +def _pending_triage_state() -> dict: + return { + "issues": { + "obj::1": { + "id": "obj::1", + "status": "open", + "detector": "complexity", + "summary": "Objective work still open", + }, + "review::old": { + "id": "review::old", + "status": "open", + "detector": "review", + "summary": "Previously triaged review issue", + "detail": {"dimension": "naming"}, + }, + "review::new": { + "id": "review::new", + "status": "open", + "detector": "review", + "summary": "New review issue", + "detail": {"dimension": "naming"}, + }, + } + } + + +def test_triage_guardrail_status_marks_pending_behind_objective_backlog() -> None: + result = triage_guardrail_status( + plan=_pending_triage_plan(), + state=_pending_triage_state(), + ) + + assert result.is_stale is True + assert result.pending_behind_objective_backlog is True + assert result.new_ids == {"review::new"} + + +def test_triage_guardrail_messages_use_pending_copy_when_triage_is_deferred() -> None: + messages = triage_guardrail_messages( + plan=_pending_triage_plan(), + state=_pending_triage_state(), + ) + + assert any("activate after the current objective backlog is clear" in msg for msg in messages) + assert any(msg.startswith("TRIAGE PENDING") for msg in messages) + assert not any("Run the staged triage runner" in msg for msg in messages) + + +def test_require_triage_current_allows_objective_resolve_while_pending(capsys) -> None: + require_triage_current_or_exit( + state=_pending_triage_state(), + plan=_pending_triage_plan(), + patterns=["obj::1"], + attest="", + ) + + out = capsys.readouterr().out + assert "TRIAGE PENDING" in out + + +def test_require_triage_current_blocks_review_resolve_while_pending() -> None: + with pytest.raises(CommandError) as exc_info: + require_triage_current_or_exit( + state=_pending_triage_state(), + plan=_pending_triage_plan(), + patterns=["review::new"], + attest="", + ) + + assert "triage is pending behind the current objective backlog" in str(exc_info.value) diff --git a/desloppify/tests/plan/test_triage_phase_banner.py b/desloppify/tests/plan/test_triage_phase_banner.py index ca6c7fad..76e1fd06 100644 --- a/desloppify/tests/plan/test_triage_phase_banner.py +++ b/desloppify/tests/plan/test_triage_phase_banner.py @@ -26,6 +26,22 @@ def test_banner_pending_when_objective_backlog_exists(): assert banner.startswith("TRIAGE PENDING") +def test_banner_pending_when_stale_triage_is_deferred_behind_objective_backlog(): + plan = empty_plan() + plan["plan_start_scores"] = {"strict": 72.0} + plan["epic_triage_meta"] = {"triaged_ids": ["review::old"]} + state = { + "issues": { + "obj-1": {"id": "obj-1", "status": "open", "detector": "complexity"}, + "review::old": {"id": "review::old", "status": "open", "detector": "review"}, + "review::new": {"id": "review::new", "status": "open", "detector": "review"}, + } + } + + banner = triage_phase_banner(plan, state) + assert banner.startswith("TRIAGE PENDING") + + def test_banner_mode_when_no_objective_backlog(): plan = empty_plan() plan["queue_order"] = list(TRIAGE_STAGE_IDS) From 99a8228a664dfb158a46594687f19c3908a5eab6 Mon Sep 17 00:00:00 2001 From: POM Date: Fri, 13 Mar 2026 14:57:43 +0100 Subject: [PATCH 06/15] feat: auto-resolve stale issues for deleted files, triage/queue/reconcile improvements - Fix #412: scan merge now auto-resolves open issues when the source file no longer exists on disk (verify_disappeared + MergeScanOptions.project_root) - Triage: sense-check orchestration, completion policy, validation stage upgrades - Work queue: snapshot overhaul, synthetic workflow, ranking refinements - Plan: reconcile pipeline expansion, refresh lifecycle consolidation, phase cleanup support, scan issue reconcile enhancements - Review: holistic cluster modules removed (inlined), import plan sync expanded - Rust: fixer/detector cleanup, remove compat re-export wrapper - Tests: broad coverage additions across triage, reconcile, queue, holistic Co-Authored-By: Claude Opus 4.6 --- AGENTS.md | 2 +- README.md | 2 +- assets/scorecard.png | Bin 90400 -> 92046 bytes .../app/cli_support/parser_groups_admin.py | 1 - .../app/commands/helpers/queue_progress.py | 11 +- desloppify/app/commands/move/language.py | 1 - .../commands/plan/override_resolve_helpers.py | 9 +- .../plan/triage/confirmations/basic.py | 18 +- .../plan/triage/confirmations/enrich.py | 12 +- .../plan/triage/confirmations/organize.py | 11 +- .../app/commands/plan/triage/lifecycle.py | 9 + .../plan/triage/runner/orchestrator_claude.py | 2 +- .../orchestrator_codex_pipeline_completion.py | 18 +- .../orchestrator_codex_pipeline_execution.py | 3 +- .../triage/runner/orchestrator_codex_sense.py | 91 +++- .../plan/triage/runner/orchestrator_common.py | 8 +- .../plan/triage/runner/stage_prompts.py | 2 + .../stage_prompts_instruction_blocks.py | 61 ++- .../stage_prompts_instruction_shared.py | 2 + .../plan/triage/runner/stage_prompts_sense.py | 129 ++++- .../triage/runner/stage_prompts_validation.py | 3 + .../plan/triage/runner/stage_validation.py | 84 +++- .../commands/plan/triage/stages/completion.py | 16 +- .../plan/triage/stages/evidence_parsing.py | 33 ++ .../commands/plan/triage/stages/helpers.py | 87 +++- .../commands/plan/triage/stages/observe.py | 13 +- .../commands/plan/triage/stages/organize.py | 19 +- .../commands/plan/triage/stages/records.py | 1 + .../commands/plan/triage/stages/reflect.py | 31 +- .../commands/plan/triage/stages/rendering.py | 8 +- .../triage/validation/completion_policy.py | 28 +- .../commands/review/importing/plan_sync.py | 93 +++- .../app/commands/scan/plan_reconcile.py | 15 +- desloppify/app/commands/scan/workflow.py | 1 + desloppify/engine/_plan/constants.py | 3 + desloppify/engine/_plan/refresh_lifecycle.py | 108 ++-- .../engine/_plan/scan_issue_reconcile.py | 54 ++ desloppify/engine/_plan/schema/__init__.py | 70 +-- desloppify/engine/_plan/sync/__init__.py | 1 + desloppify/engine/_plan/sync/phase_cleanup.py | 82 +++ desloppify/engine/_plan/sync/pipeline.py | 125 +++-- desloppify/engine/_plan/sync/review_import.py | 1 + desloppify/engine/_plan/sync/triage.py | 9 +- desloppify/engine/_plan/sync/workflow.py | 11 + desloppify/engine/_plan/triage/playbook.py | 2 +- desloppify/engine/_plan/triage/snapshot.py | 53 +- desloppify/engine/_state/merge.py | 2 + desloppify/engine/_state/merge_issues.py | 23 +- desloppify/engine/_work_queue/inputs.py | 1 + desloppify/engine/_work_queue/ranking.py | 4 +- desloppify/engine/_work_queue/snapshot.py | 473 ++++++++++++++---- desloppify/engine/_work_queue/synthetic.py | 63 ++- .../engine/_work_queue/synthetic_workflow.py | 2 +- desloppify/engine/plan_triage.py | 3 +- .../review/context_holistic/_accessors.py | 5 - .../context_holistic/_clusters_complexity.py | 5 - .../context_holistic/_clusters_consistency.py | 5 - .../context_holistic/_clusters_dependency.py | 15 - .../context_holistic/_clusters_error_state.py | 5 - .../_clusters_organization.py | 5 - .../context_holistic/_clusters_security.py | 13 - desloppify/languages/README.md | 3 +- desloppify/languages/rust/_fixers.py | 8 +- desloppify/languages/rust/commands.py | 1 - desloppify/languages/rust/detectors/custom.py | 41 -- .../languages/rust/tests/test_custom.py | 14 +- .../commands/plan/test_triage_attestation.py | 3 + .../plan/test_triage_dependency_guard.py | 9 +- .../commands/plan/test_triage_logging.py | 9 +- .../tests/commands/plan/test_triage_runner.py | 161 +++++- .../plan/test_triage_split_modules_direct.py | 202 +++++++- .../plan/test_triage_stage_policy_direct.py | 2 +- .../plan/test_triage_stage_rendering.py | 5 +- .../test_review_importing_support_direct.py | 62 ++- .../commands/test_lifecycle_transitions.py | 95 ++-- .../test_postflight_lifecycle_integration.py | 103 ++++ .../tests/commands/test_transitive_engine.py | 43 +- .../engine/test_sync_split_modules_direct.py | 101 +++- desloppify/tests/plan/test_epic_triage.py | 13 +- desloppify/tests/plan/test_phase_cleanup.py | 83 +++ desloppify/tests/plan/test_reconcile.py | 21 + .../tests/plan/test_reconcile_pipeline.py | 405 ++++++++++++++- .../tests/plan/test_refresh_lifecycle.py | 71 +-- .../test_context_holistic_accessors_direct.py | 3 +- ...ext_holistic_clusters_complexity_direct.py | 3 +- ...xt_holistic_clusters_consistency_direct.py | 3 +- ...ext_holistic_clusters_dependency_direct.py | 2 +- ...xt_holistic_clusters_error_state_direct.py | 2 +- ...t_holistic_clusters_organization_direct.py | 2 +- ...ntext_holistic_clusters_security_direct.py | 2 +- .../test_work_queue_plan_order_and_triage.py | 81 ++- desloppify/tests/review/work_queue_cases.py | 42 ++ desloppify/tests/state/test_state.py | 20 +- docs/DEVELOPMENT_PHILOSOPHY.md | 2 +- docs/SKILL.md | 2 +- website/index.html | 4 +- 96 files changed, 2898 insertions(+), 692 deletions(-) create mode 100644 desloppify/engine/_plan/sync/phase_cleanup.py delete mode 100644 desloppify/intelligence/review/context_holistic/_accessors.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_complexity.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_consistency.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_dependency.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_error_state.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_organization.py delete mode 100644 desloppify/intelligence/review/context_holistic/_clusters_security.py delete mode 100644 desloppify/languages/rust/detectors/custom.py create mode 100644 desloppify/tests/commands/test_postflight_lifecycle_integration.py create mode 100644 desloppify/tests/plan/test_phase_cleanup.py diff --git a/AGENTS.md b/AGENTS.md index 55dad4af..9df2da93 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,7 +5,7 @@ description: > about code quality, technical debt, dead code, large files, god classes, duplicate functions, code smells, naming issues, import cycles, or coupling problems. Also use when asked for a health score, what to fix next, or to - create a cleanup plan. Supports 28 languages. + create a cleanup plan. Supports 29 languages. allowed-tools: Bash(desloppify *) --- diff --git a/README.md b/README.md index ff4f2935..db3dadd0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ That score generates a scorecard badge for your GitHub profile or README: -Currently supports 28 languages — full plugin depth for TypeScript, Python, C#, C++, Dart, GDScript, Go, and Rust; generic linter + tree-sitter support for Ruby, Java, Kotlin, and 16 more. For C++ projects, `compile_commands.json` is the primary analysis path and `Makefile` repositories fall back to best-effort local include scanning. +Currently supports 29 languages — full plugin depth for TypeScript, Python, C#, C++, Dart, GDScript, Go, and Rust; generic linter + tree-sitter support for Ruby, Java, Kotlin, and 18 more. For C++ projects, `compile_commands.json` is the primary analysis path and `Makefile` repositories fall back to best-effort local include scanning. ## For your agent's consideration... diff --git a/assets/scorecard.png b/assets/scorecard.png index dd149ef62ea031cedc442de965e3218fa01baba5..1b303b9255b1bbbd873e665c88aad61addce73bc 100644 GIT binary patch literal 92046 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 literal 90400 zcmce;byQr<*DgpLcY*~7!GgP6(!mK5+#y)w?ixXZyF+ky8h3Zs#@$^SXAa5l{l0hZ z+*vbs)?HJp|6rXyU8hd%s$F|O&wlWil@>)oBtV3NgF_J)6Ox02dx-}J_Y@ueDRAZ1 z>@)}N2^^fb&_@L)=-#}&iu%;Ut0OEl3{3KB-U>16{JOeATSr*ou3M9NlKqV|&*IL( z0tn|lHhqWs9MRL`+k3GXpSLJa)YKM=vt>wZY;D%(5{3ru=4=Nu_b#vaA0P6kS+Oc8 z01x`x(85$U4^L$>)68yNf-I&%7@*h==10F|9$swQ^J3~`@iYrxj*?o zcf55Rke{uU{3ZB}=bv%lk-nqsCl#Rzx43rx=eBCzxe8&7+RFbLUJIW1Ki_=_75nF> za6g1F|GE7C;@M*4|JC2z^Sen#7V3Mr9U?fL5~0trthdUTVI*)%MSKQt>z}~|Hq$=6 zE^G>g|CQ)Bj||6DooYXw6;UL5pF=$@4+rNsM*VCV_+`5m#<1nO52^QaIHoPORCen7 zW~P1$iVl)y_Lp$YOgsicQuvYbFI#!xnlgPk ze8&CfnR8LgNyzy^m}O#caAfo`UVX@L-|9|uA0Gr)L(T_5`R7%;OT@@ixq&yw{~8o- z)kFY{y52PC2o>&|i1@!P^DjI8+XVlbhL7(M{^=AR^Z#jv;r_?FnYO}L(8xPTKJfqT z3HQP zfAR3RutV~-;K?-Ee6~z7OHF-&8#K^(elblh*R)A1|LR8KB1+KXVO7aO(pmVb)01;B zmU;CxmG%S#)) zhc<#8&a?=)XBXx+u1l4_9Npy7PtczePY%jRH4KTo-x2UFDC46-;(g*9a>tdX%j*qV zwyC*5y>(!xuR4i}F&(T0kJ}5yp3w3&xp>Vl}eUc7?5fvDFj` z7GZQ5xF{~~JFS!PG;LueExLz4{Ill1echUv(#C;*?t)clUf@c{XL(=me7bqgLEH4j zBVG{Nu}_x$^ae5!k5sQdqlEM_KqL3k4hE}HRL%|zR>kAdOqHX=HE?r3nhFf3eH?Rj z_)8NrOJ~=<2XUN}89hoKwP|*L^&*l1+0D0Ri1#zg+egBHT<7 zU7e2M6z>j@R;3+1T-;x_eIg-fxFQ;0XTQSbRWo^yO)%8D(8(L#!@RHjy^%VDi2X&6 z`FSRyG1Zut<-wNeHm2D7$X)FspOZY=O@pLDGkM8Z5B_vTvaoWg^%_G|0WKlez>xGQ-zL?duMP*G+YE1#f)Cos_B9fkDwL3L~n%8fzb) z>lqrQ7(Tk1(v&P7lp0RhVl%95?lf=raeO??mV$Bd@cc4fHcOfFG*LCxUalGx*Q)cH zW(A%jpjjhb-gl>HRTf2vb`g9TJrZ{8&Co7#nU&DVjboYc+~ZYmygeV^fWR8n<&+mD zXBuf7zWYKXeG6>w{H5e-B0H)_jxtJWFC+K`>EM$LJ8|%;_V-cNDPn?EoPBsMWfXF; zQ7BZsaUEPb=?r3zkm-gwqvWjVodqMvtWcB1!Ett#b~QofD6{`%@c#q&HjQ~jQpHvmP#tQLVr8FYQbqY9Zm4sVZKU%M#SX>6J@>R z+9=AVgUmU}O?#wbJT=x`+QQ6r2g&iQK+`7uYV^X~$cEnTf#Lr6U15E1+AJ}!cr%T= zq7ZY(VvRpzd4Nsb*Q3fMYWkt9{msJf$%#;(M0_sPw5O6YJ_~!Zfbrw;$UN|nt2uMp znCVz%t%$)VSam0R$M*v@Bbg;FV>vv4MYsMFM3o!_A0&~mMrqM!_eI?DhoMa5#%LLN{K8aDaV%PFoO2HX+ zHwM&^gtAhI^ZB_l5)$H23U3G$j)}ntcPiSxmptN5uR{Jkc5nNa5n*-;xtejmOj<>W z(v0+}X)ff}It?0&d|GS7_+AXPG1WJX-93|>S*2_VXX!1uu@ZX2Tc77Wu@UXbeH|+v zBM%nLmoiDLwu8Sz(&ne9s}07YGuksYHVl!F0=8neqVkn&YUZ8{UdZ)k?$1`@;^6cc z*eEMc8PG-x3yb1cZPnM;4-j&K!Qj3OmRGNQUj)4VoWwD)g_FSU9({3mqhxPPR zx2sIGvaM!n16TUa1g19#J{A4f1+@;ap(n1yEtXHuYC#_?MS_Uex7VF{?$4&J^?C+e zoVKN=>gQ^};JMuDyPFGTMWy4bTfc6<8{+C>*Uhbuf`#J~ljhJ0Y6|X5NTwn=<_q8F zi{(4Ssj6r<^P$z|I&2415|a}X<_p!_kGDW3Mn`S-E=&8A>A>YP88P>E9UUF;hmIOf zQ@Rc)-SMIM91gd<_J<@5`^%bGfe577G!2q^X%E*#gdm3fYH|NC+=Vc}G~en-yg^r6 z5g`>#Bb>M8Uzbh`3Jcw@yklm}E`E3;6%-Wq_VvQ{79tW8Z})30U$L~F<;rJY94zpH z7ZP6};j(dX5DU88rlSeC+{{<$b#-1ij>O@|9X8$_#4a(*2%fS9iAah|Uv1=D^6>Ho z5mSDW_l-x~v(}&?t9)S*Cmk1w-unCeXg1_yHWnxYF>XVm?I_%5wfww1(IibECSgzS zaPT+l8~VL1w(F7pF{C!bb^|JvI5n%8Hy|+s`2oOQD7HvWPAfJnzZJ@Upo89z7k&Mn zC)bTary~|hy4GnR4wlqZ9CQwwjoqCxqjaN58j;f^uQ)f$WzapPhbNW70nFxKw0x?< z$NDD42MH1J7cUO@tP7Y7Qf5-?mb4e|!g8vsou+~{W8@gzVQr3CSy}qs(zH=HQN{IV zh%tSdWp@4$h`oWqdL#c0CMG8E>go*@!QZWCn~lsaC6p8u8%|be-!On@P7I>o^@Xp5 zYw|i$P*D`$8Jfd1Fk5eu2muE(`0f=JC2s@QY)`ASI$a^xtnga5VM*Z5)TBf$o2=Z3 zolEk<#gR08Dyx*&g%(bX%xnmOB-lD*Wn-saNHXS|2ShAf657im?MFyUtpJ=$El}3L z!Ii+Zqu|GYKhRG|PRz)!66NA||EcHVL&(sk=gnOeR1{t+j%U56D`l?MdG{xppwXEb z+8%Gof#+`jzyLdA_E7Bo-q?`ET*(*MRL%E*g-UyMF{AEyv`HhaU_wFZLM6-jdi#U= zn#lV(zp>Hr)U2l{_%Xeq=HJyj)pW$+dx~rG++_)Bn1_wS5F!R{7^n1{#B~*LkuxO} z=QXN$*S8?GWx(Mj1dm~Li594SGPP~)JGRPA7ZC#%6oJn*&wbG8s!AuSPlZ6sc+XDZ|bG{ zeF+2F5dZ01ljp-tzwHq6yz#p4p{EW@+~VC)Qsw+s#rBw%%W~#U|&HXijh={O=h^PSU%vPPleET@i=g7m?#}VX*5OFu`Wzf`RZZL|U zYVjR0bESRVR@~b-AGhH{Adztby4=)cHEgsrGGCRYrvC@yn?u|hF1ObagVn%pZu@%H zUe=GroqeArYitrV+Q}=Iu*K=6G5SS4RCgVp(gsPXm*Tu5&KseQPcM2DuK;TJO)J5}yz+A1<%uy2?KP>WjLHT7Nu0tpJ0^TmKBe?;3l?V}Xp=pcTer z9-0sNLhnY*!j=Q>FULaaz(1suxn?GzhBQnKFK*VeW}jAtN9B4~CEZlEKTEZE;+8}z z7O>kZZIA*)3`}Vm7^)eHf*MUq7&cPc$>%u{>*wk#tUoD%h$7$8v;s%16tCdAG7IMD zwra6|I~VBt9{ZPCAqT@vZUe9RIQo7LeBET$WD)Q&iTVY~7?2#bTC-jr#V(=v~0bPO_dx4S2>1SK07g3aDGuJd^tWoespX!#qC;rexZwx z_^`B#L{d_6jMhzk#lhCrb|+Jzf!)r*A(_i~r6+>Ql`oyNelc}fQ*SiK2%>g3cI@fN z3-Ly8H7r?BJ1Qt{@D1wlJItE#%UX(MX|KCU<8 zg@Lm;>o_J5Xy0tU>%bd9hx)EL^gkY%*C5;y?LkXH(?+KMDOl3gTjGnX{r+i#p!6G@ zb71o-AWrzb7RN?hUsnzBsn#UP=vnNc>gQjA1f?8^@z}}q-vV)CAB#-fjH@b_wl;ro zT##B}9=(_~YMk*B(Noy_yDy1!iK5Dz6egJBWUTdMj{uTmz2l;*^7}oOXwo1N!cmG} zyzO40G0C2}U5>L*C>>qkEk8Na#Gyo+4ojfAox1w0pyyqL6=`Z|>2c*=Oo9c{oNn-I zhli?@fyLEI58ETof$5x5`H#(bD8+^;AwkhOZK<=cho;uM`8gMUAeiws9sLbfHu$8G^`&_N|IZZ~A zR}RvkWz_|8HuLly&9Js1YU8@9rpT#r5nWEb%_O@SLz2Ne9L_pX`ZQ*hcU8yIaXwG5%xq}VTwPV=X3>emfS59}C_IFa%xBv#q%<{BmqfQu6%y>< z*Z5nUe7^IjC{nT=1!qt%Ydabj>KvV!f+yz9Ds_pN)HM{;{P$>_JFahNcy$lYK~`UW zO~hJG?DK_f<;jPijgK37hAIUI7q?iYrgdgUl{L0IYLC|Q_Wl)WY*;^#88>t=R@hfg zK{ya=vbtD?))cTWxY&G_DSF^)_4*N#>&do5Il{=J?cAzQc~QsK3SSH{Z3pH+rI!P%WLG+4bW5nP z);jKsqO9|Jf#mcXtnXr@3u39VM#!&8y$08Euvy+DzRWAgsVJ#nviO!kY@AYNH%n^K zChH5kuIz08Q85vaJY^Wx?U_zDfRbFsxgLw*PtFsxpeNlj*14{-0fb^ga7fNVGEC)kdNUHtP@ZW{*PpW_5>ixaC7fwX;YuHNN(JbiAtg+NgtnY}bZEFFDD~s-bAGqK8v@2Z^rO*z`U@=WW#DzSzgi} zL)1u5#|d0^wST^DZlCEE7U7^P@652+>kQ;iG>v9JHhH(cwI&8%<91cHa5gwNn3tDF z+R$Xal(tK_1M!BKn3}$7d>T*aGhaNjG&o9$;puo8g0B2PeP8;FF-|f5=Cat5?|zq1 z)xbH!7lREtNqk9h4qYccVWB^#dl}HTA+|mm;^@gJ-@T}Q_QSB7+(u6<@#77MdVTa) zU$%KYS?nA6RYbN(4W-^pl*}2SCfo$Hpq6?EYfo4AI1QTU3U-A}N;c(M3$M_V&b;K4kBXmpJ~7@dumJ}tfMwmI9ys zXPM{`kpJd^h3NhL<9FW5{o%Qii3^F#>%L+^jnm~1$$~5@0hQ(DWM29PhQ@t%c6NJ< zRh~<VO~vw6;$EvSXX@oeltTq?azxPLQ#R#88tCt%Tv{^}cu^4L$+<}O^M&;d2B zhq-*Dq0;&dD+E%+_OSOl3S_bA>zlQxAtf~slj6C3uv`QSbmnyAq>OMr>mFec53R4i ztiC*8ovE}>upmrXG405fP9E+1jKaXmTHgG-nP}D#cxNN3U$Y%eg%5?Lsb3D`5bl0G z8qM3VmAOUF!E81a-%}#JqJr%}VJ<^F!fI(=YI(k8u5$otygD;)o}{T(8^x(WB*xFZ zz*%;K7TegyOG@6!TaeMX;Kvgyh|wV`J7eZk*>vUCOe;JDr-Akcmw$@7Z*DJq;t{;i`-P@s2sO z{z!CmG!~__%ERgP^|cEcS_l*h1(N!%;2?Thde&N-BB~dOi6S>4_v@S5y?uS|Zf;y} zg5`4eR%bpjArnc5$T0M}nclNzQQo#t=T2_0xjIFF-ZKukoZanf3qHW&0lX)Xo=CxD z0s<{tRRt5#?;Q}2{q$bV!=HyVF3|J)uv zmaF+GhZY9#;cpbqWHzfOW0wj&W8%)5PvEkCu9VCyY0Y-=5i4Na#2$zrfa8oRIE9Io z(-nNqJ6`1b-QT~b{>3R^EYgUcw6yfkpFi6attE1K=#GR76F$u6a1J40QPp401t7g< zKv(tuRg7~8t?6rRU1_{IBpf~MC?Dd#+3728JeotY-5h|Fl>x2_+GN@EnZ|X`pCRPU zzVaLg69Hj$xQyV<87*Vu$;v6?pf-~>Ic5}g%pTCy$cXiNUKAJVVcF6BO26o&*~9fr z(?S9<)56TCR;t{FvL?UtReeO}{N3tn*kiy9z-pA2!gn?{dM@G)e(G>31M~&d0+Fvd zds|GuP6wWa)3%Y;p9)LY5{+FyCfXog#?&O-);|F=Q(1ur7;?}D(Jq*{ci-Ady?;&S z#l^){aI;toAWnz#byYRFab2q~p1*WEo#!knD*Dtw|B~U_J4OqbGhXN0wLv1@q@*Mg z=QE7&A4<&oIMQiFO$TmFIn1U*tw@)f8=u+KBuZx=@>ZjDO(&%ROF4y=mog-HLLkq1 zi6SN8cnK!@@Xm{m_pXH)iAx>odDDCYfaH{~Gk|>{o;|WZV0PfI%0#d8CP)Iu=JOPt zNA3;WXEvJs3GR>wH{G_OE>5S}8bM}f9EU}}v>;&(;;EK}ufPPJZVc^~W>0)V6C_86 z4<;6HVcvch(?`VaGM=5{sRn>+4Qqg%_xAT;do%KisvWDxX?p1-PD@YZzi)>oGwu=X zP2H7PjCD%QR+(EGTVVJLwY0Rr=3Hf9uQKt8A2Z#TMHxv+^NxaURmN>uh3b`+l@)3# zYM)b>-8=Ychl}?QkPaOTCl}`)78W8`agoMQvywC9a)C>*_Wl$cwlL{*LJYthL(-l) zkv}(&3v4|*E#>nk95yCt(>Dj;<3D7+tzU$^=k@TAxzWA&)pfog{Ywy?`Rm|^*P+;+ zZ{ORzqXAgFNimr~LZ>-OFJyg6@#9xN(z0~4;oy*A@*=JN9>O=gJoVc3PRDl>hYxkf zi?b(@GH~CP-z=brKPQ?iOV$beZ;}32+-wa>d$d?yz02!(;hd=}L|Hxg!tNl0c`Y*cc-#z^AVCFtJ+Wm*lo=YXi z^gob%9Uz=4D@zaeAKnj-l!lgOD3P1j@?Hbg*LD`HqN-}YaTa%lv=J8@t1|_M%t;ev z(oyDWmwkJ`Y5Dr~Mh-sQUk>sENqj;AiOW)0&Q|x-qElfN3(^Mtj`el2d!6j}HVFVN ziylzVmQG?Z^3QnEe{>DbmTEx46xX(Ng@ib2YgJAjg|FKyuZ}u!R&h?p@=Bv<(yXaE zFe<638&Q`mmpE}{w7^qS#|YdXMI`^cYP~`eIQzC?NfUKFvzcOYKRD2HbyMv5#hytQ zM^T?@vtxo?c{In)RdQ-;WK0-Tr{&27nIe&fYD~zUT+U7KVYLh=saiF@{loJj%iu;Z z4p(mq#jIr^EvX&y+^UKK(Nh*Q?o&1xlXXCf! z=k!rNF_E+xH;lLRm{9K<=|-!ot>ugXS}MV8<+8MU=z^^$AK&i4a>=qX%zbv%uF9E_ zK<;;WQN{9!v9lt`lFekWy%`TE@-j)RgF{uL_+=P>WyG z7rW)POiiue?;nYo5i@U3AOQ)|1?oJ@;=GbE2i~j!n9|@q<=n_m?uIq&n@CZhg~*uq zMg8&;yxVW&<-wlcT}!m^YpQDmRx>hETkQ`{f4aWJkK2U*!vI-?hK6pfu13Vf#6(9E zV_+=k#WA;h^g_>+5QoR#KMdi64`gHDSeU1h&`*jwpGp&v;jGu!v{lSjc(W_m*E#ov zCMHpAhFZBB?~D*(Zl`l}9_)#B8rN-*fEs|3auvA{dGV`$a)s^_Vvb^OeB@8i5L5C` z8Tmo)+A}PN(muOl^!O9ZFfjrizX>>>P}&SIE9%Q?VQB=-v^bVt3bVdkl9f?dQT)jd z3-Qv7eU+0+Q$=nMhSb4HE#C+Zl? zfK9u35lA&SQqWuV5-`)EdwC%pJMpxRNmuN{{4}GMJ62Z>eLCBBrVY`gXUMD>-_p_* zDPj=kI)`WYAZj1=6$g-X8O-j!@sd((~bxeB9373w8(;o;#@gjH)A zJz+ii3=9l?N_2|33iEaBKr^4M<-gLEkdzFlsd3g39+;o&o!qMeMxwWptBE{-p&wX+~L@N#6!N{&pO2lmZm8?dBi{ zJCQ8w>t|r2O9D(#q(sLg{p`xB^wiW8((@nPIes{_F{e&^>AT?A&>jlo7vN9zUAqe; zjmF|HgFeECQD=Ce=V}1F%vh0UeQKsl*S5A>;*YME{lt|RpENWxl&GB@l6`PwO^bTq zNxeW5^|c<}p|&jyF3dl{K5yN!nQqlBb(}cKZ7w+LrzR#WXKU%t<$xS3Av4opIJSA6 zHX6aZ^}7%g9_bdF&w*s;d5p=te^I5t6Xq|JbO(jp<#WGIUp(?c!xs7+@9kb*9gYOi z#ChrM18Yz`b;Q6N<&)J*{M7$!xZs%B&^69p0FW0I61lyb5>!=<`T66iuS=@8xA0+O zgW7v+2JM>9e*z@8(}^l9%HXLc@|;4~I|wI0(#$#A78D5K;6&YA>^Ip_+wUuDm(1)P zl=BmLx;!*KD>ocUWVMvGl|S{zq5?v$Q@|I~^HAnBox1HEi}LdDu~ugdU=q>sokW_mOoyz&=faUG=79e*qDV`(og z-ZN|2Xli0o>(;>{8D=1E-9ys!u)e;|9lDoH%DQ*xakbr*l24PrIhc|@Gvx}~lWd5* zURTz(s+r?;K`%OMMWTW5bdyzTQ_w%>V56Z=KLS-BX6&u#%NKDc7=z%AP4Z{0uW=pg zzC`@MMcyp57;Jif22ar-NUBu@mqhk^G;XE$X>vnVb>25)laKJmv~{DgwhJ79Ekm@F z9g*9b&R_aCJ|hD+wYnM@Oe9#=cdT3CGN`>T!&FpOB;m3;(jDz!ob*UdXx_1W{UY!Ob2EaW{yD~I-B8y zYQ6(#anmrHBmx>5QV6{3mGB)n=JxiK(M{kG2%&XKiyp!g0DReYh_A_gHu&bCsp`fI zjfn5|yvlT-zi6>3p2hw|lCiPOpigO@7UkLI_Wr8WJs}pbnaq)1_iLBgS%=J)*>)8H z>DPiYjDDbRx|G=@ZK2e?t6+weng@5*2aUzxQt9EcO~wrCB1YSN!I7O{uo?ftu_-b- z+P&(4u))~^T5?rNMciQfYB`)%KjuW{m9tPe-kwL)T8Y!@&y9}keJMu1A>9(N=)5Sr zF$U*>-^0vEub#=49O!+ULq6}W1a`PXa(eOi7w;9~-#fXuZ{*fi=ph%$V)Hc=(q$j_ zasyuRbK{G5N1>ul{s2L-C8b}gf-TV$!u(&hduY9pX=1|fFK)b&o2@hgTu5=##Rjm> zuAsZcctkBrMO_)?l+OnOBxgTmGtcddP%Hi_$QSp?8v~-H+0~&t3Q1gJ zMpk%IHUjgLHF3}T;~0QLnFDj^CVQbn)F#wl`=g)SzdGEOLO>pgiUisU98_bvz;F%QH5V*L zKEDEu%qT^;ebd{gdE*(PmTN}aXVELghQVF>T&ZdUnT2Ht<4@F8GnO*7v9n=fV1Ks> z5)!%$-siQoJ*`0VB1W8;VE002v}A19*3wF@RVGl3QUoA-0HHe!t}QGy*ECQ1ObKSe zcd

9?>?ZrNtl>qB|JYFveq+0d+^_zGOFu>06h`3`Ym0k06lR)U^8bGP|MVo0`Cr zCeL3dIXgS!#fY(3`G|~vwY;fqXwbCG$N&nOa>aW1iI!d)x31tThYzfk#JvIesf^Z= z-Ggl#C-!n~ObGgdwdSDXT9&5EY_u!H@&`vI(GT9?v9N z<-SCmD}ov5CCp+%YN;7VDBTtc`F;jg*gpTm6TOnBiK6ZS*eZK(CGt72$EkU6OpO4=yC2(}U9 zP+`*>OTwDa&Xw+2!huePY!(&JPzf~hCw#}JuCYE_Sr>nT`$A5pdO{3tOM(RoIcn1O z{(iTT$`>NR={>VhUUlN+tCy!uMZL+W_fHPO5@g(lSTVeAqzO>L(WzY8?+wBSuUYbk z8QSbm_ZmzYi5fe=p$;y|+V@yN7&NZXP7Nw;i~ql9CcJ4C*UeYXBzcnTDG=?d8togKU0!sl;-xd zj)D%I`)e7crp-WpaW$$iViXZpi)00p;sI!WULGqe%c9E-%6ztL!0fDL3jvF20dan5 z=}5QFmzRUXemr~T+T|+!yvG3%nu((eGXxu~)^8~cYd{=*$h}Hb=|E!g^66sw+*{x$)dB2~DJ+l|KgvGfP$l$v5A+84(hig2X<0d|x=LuXme|K@CRr3ZmTPpHTfIheCyX|SteFQ9v3ER$E#1GC zwX2wXoTAtvj`9ZU`Br9g2C*-8l@RRAI2Eq91ZbYmLL^<58=At#&@WJdvHkb~YS;$c zMbpD|S7@^8QgElS+ZK=ePfjY31+hm+LLSCVCW4xxG<{f2=?7(d$O|dr?s)!WFn?TB zcJIJ|sf9)GcnzW39kz6~uh(QE-TfXcG6le4qw8e8SM!MjZ$pSi3atL=FH^y7zb z4@H`FgoK3lr`n6|j`NFB;6lM(+_!O?OHzmK?k=>yDNPcNoHZ>h%6woWz7O=1boYhbi%5TpjYD|$^cJ=U9UB=*O?v-2;Nf=lP$cO>_LH^Y zci#A#TnHqtt)~BHl3eM*na^arK@z@cc_R(HLAqebG zi`2VvU&vLZI60|*sW6AIzAI#=!yRHY-oNo9DMN?2@-dr4{usU8W@ZZ$FcD)^#TJ%`YoZ1*j(K}ok z9-YG^@vME@q$5?eDFOqJyc{U6FQ_jn64;j`ASI_~pJ;6j2g)YO&rJGTM|JnAOPd}p z!0zrp>*~}sHSbb?`lh9)J4Qyqs_lSS`b+w)$IW@juU`_3j54Uc`3f|4DeuRN3q4M9 zsTQ1F&rOT#1;7WM6V;XvK*S3>vV1bH;;si)4cOa1*SnEwt6N@l`PAy_NtV5gu{XfE z=y4u31xzl*-z0?3NsKazf6jiqDV3|dnaEseEzjIq@Xq=2;pu!jy?3QVR9Rl?+Q|gD zW#+?y)~A1c1}+68G8)M8eA{77p}^ysvfQrAnH{X zf+Y_+wzfzyUFRhH*8z}}x@s=MhUJ%or$?z|(AiZ%w}BH@Cpi(p}cmmS7@YSM~2zi|(dP8X_^m|L7Z>yob|k(v1l-sYpwXKuwt4z(zlR4cK% z|B1#wtY>yeR!{gRvVd{g5VQ_19OM^ISiZAvUfj=AKgivF|K07MV+8k2os6H^ zV#zuIoh395kdz!D1rx=cd+I#2EPCGP0h7f>fFeo;hit1XH*`)5C95Z^fA%P;`8W9e z?Yq-ehcZy&m2iMvqv5f)#q9Yo@~E--;PeXa?H2SU0Dh|hM2;qG9tK3+Bc&s50!@`! z7v0P00Q1e*aQlu1IPU<&`aj6D8WxpQNlC?Y6?icVB?0ieFP_Rjz&$udHyD5|eS4q$ z?e|Z-|E=g7+`~6G&+%t)aF1f2?(fV%1^VCizld`uLtirORaCNRa}g;kei6wW(U{{) z>y*|hQ@M-(B&BE|vEmJlry+%#fMt1Za&XENPy0u#+gx>=f?}vetJ4!Y)i*d1O4=r zLy2Px3u8(UsvGya7pX(8wH62T?g$uaG~1E1mMr3*de6s^K$1AK_Ew>dt53h^;3cfi@=)UehrfL6rxrr`@U?H!5}lc*2M{* z>lJW^;a6_+LAQtB=(b3bysx^9%Qq7cpXcIYmEQb)uWx|1ubF;zZ^L0@ZDca~wfy%F z3;>pnEgF=R;~pcDjR8_qR|`H^+}}CK-9E{Zr7^DXcysZjB^4+o+sj?0LL<>(ikswc zK&Bj<5^Qb`88bS2(RVPCu(e5IcicLYV~zEHdb0pjZJxG{`Bk;A9y($w+mLsXw5E-@ zxfhyPs4?he>xYZFl%I)l&@w$Q9dB%krOvjqOeknDp?D?RS zU}*v!A?-W>cH?7vG|yV}g~e%|TBs;IV4=g*vEm?fQ1%!C>4DY)ln#?LqcRKHI@;^^ zBF>6Sd{a6Bap3m$8Ono#{HM0kXRhazzdH5-UDLGV-wq#_Rdv)JQ4(|(8c#q#BOy6o zi=xR!Ne6N?GWQ03iFNFlXp=8iv1zSontC|25iub_qG@nASNpQ;l{*GheZU-D6P|?( z6~CvYrftr%K140cy)GG zErEbgnpmKD{aADU97}u#e_PIfO+rb;QZh_D6D&=H7D8-FgMOj%yNa7Bwm-BxR$dfs zLu1g))ZE-GN6>c1$=%#s%nADfVCNp&&)(miE*!sks$SQX;+a|H_ySZOcZz$??|Za04SWO; zKgaUuy|q0$J3c=_m}CKvj(bwl?yd+ zun12t>MUU@ODi1#hs7S+H{l}bs;a6%2}~AOzt+t-)T`DCw#!`-+fvhgeR?{hl_M>0 z9ajVKSpln(VMiKJ8m8o!(`1iq1;2w$H_uFNpw0(C94ixt_~cZQCrHgVY(`+g{j`z9P8&!70oqMfSUji@0u*HS_6tnA7KGR`wetSe z%?XK%i2(($K<>hl8`z_Jp|tl`Q|5&p_gM)bCOjYRfijRu4~PeO?Up}P@w`TjbsafHS)fpkyYewC1Y#@#p zSBeS8N>LAYSnOARu3;Mos@*-aoHV@nlAfJ1z-6^`D+n7Hwj|KdQm-I8*ra-0fG;px zB-g!DJ_Lzgf1gQ&T=Zd!qjQe-bJYj=<;>0>`of}w5tbGQM5I>4g>ei;)J0N)q_|Zj z{RQTqz${m+gYVXD_z z2YrJ+zpnSnlTf0tX@d0D&2X5$x8S_1$9iN6b-e1V?tc`gSOWE1CMG8O3i_5EPoF)5 z2+F0WrFY7_d6*j;0w|^Zg`2~PXaoclQm^-l5)CJCjy!Q7f|y#)ZdOB)HHiUiPgu8S zh?_f~bJx#uttoovrQ4TJhE^7~8OL(i1|r`M#R{UjIjpQ)bYP|AnC5LoR)(M@gH4y| zq8y3E=idF{8E2;RuEY1UJ$}7mj{>sSSgDXTSKN9#!zx%rv(&;-4DY+8ddwjq@Z`yzupNm_XgpnCiX z?EGdw3JY9t2Dm?weQat7c3X4m<2gJt<9r>s-4#M4O4KSQJFCJFA^DU)9RjGcB)*C2 z+keW{ARUu7Gs({{XnMUWD4!tw&Z{IYQ8op^8)t?FBJpnbt(VnImKS=mKQ*bz0CrG( z=Sd;e17{~K2c^!&(TsyI*ws}rOtYO23(1uyp$lSNjv7CzV0WkcsZfr6gA(d9xCX5r zmAcFdZcH0lB|Hs>C$+H-kfUUVA*UxC4b1(dkeYxxS8DVX3<>OVS-e1{hr{!cvsp1# za0%TE`mV8#sOoZmW%RHOr3>#gs5j0K?N)V@#28}u=o(B;SJ(HWQ1 z(r*A>C!{t;pZK4vsNza|!|m-8I4z{brH#$aAr%#GcsvlnS;?`l3D z?CjKn&8hm`FLcRz1Bs^TEGuvsi7<~r$#pgie zBWc#(S24{N#o&9P3v_)hR1(i1vLlEwI#s@yu@cr)d!vKc*wdZY@&|uvtN&u%Wk_)# z@I;HS4F0)u!NT+dpLh#7u=6f{`F9EnGM_dcagYJaOv~M?5E4NxO~rv_t9tkPLsk2b zI^Q}A{3r=_uwhIp9RTnIS?%FmRw+`QY? z>C_wh<@8nMG|Egji`FvMAd3b2%rSO5I-M zQs`nMW782!!hlwZ)%PffqOmP>NIT83`H}I#=KU z`G7W$E)ieQ;6^W$V25ROfbUcB!&}2sJ6ASzkp7C{06YP5QK$sCGHN}Z=L!zFn!Ys=pL1|P2lna7)($9wr-XD?uY`HwR*`**$e@B*1mg0I{ zL!VH|cX{-4e$!27@w@$lI@rSF&SB;Ze=NoQdM1dF!^D%~;qc}GP-Jt#%ck$HXo zFR@(y00N#|@;xQDGkeM;eOz( zQ;Tv7?O`nsik+3Sso`K9G`>ZQ&ZR)jOQi(FUziBn4$r=&*`^xlJZCM5T^^Y}!biQP z)*Bwe74{a+jgeb)yBV-v?K0Neb3JUVavs}26S)4s8J2-BB3rlY&SaJB6CycXjMefs z`5QcGMAql)gM>rCS3+3Hy#VRdz~*UNYn#t9u4qxHX1xu~wCkII5sD7VHC1#F%}%i@ zd_f&bs(Vz2PC|m(y#I2Nh9^@iyD&IGYn6GHR3A*%1El5h-Zy zwx?bXSD*cVO(-MN=cEJG=(^Va;!%k@2Bz2!tV;b0Y9xM^z=M_}7irJ;u<8YfHjJ zGKC*F8ASYGmtPpZ(yxfv%G16~nxV0Py16A4dXFVe-%$V2xve2NNiyd1sL^6NoSMzk zXYu7IQLFzd-ziR9RjVr*FssEa>JyNJXFjd=Xz4FMJu5j?_`~03uGyG(Qt$qzX5XeV zFb|@9eZkQ(W<-aIT1X1~cZd-ClhOx8lto6TzM`&;Jj~-a0JGwf*~b8HgyLfFQkSX_4*)B3;sr(v5V3N=bK@ zh=8;-3@y^#H8XS!F+&e9#J*hXd7j_%?)|=dAA1h|f`f^BuKT*q_7&y?ht z)f;~ikJC(K;P!B)7`MZvKxflgZG4M-sys#ti+L=WtIF=1XR8+T#)_vkD@8Bgjz!*Ep{Gat~H+wSb3r)l$O>mA_fE(|@6iN@6Y^$QCNz?2TE;VSuRUW<3oxMPr{q@*X3 zz^ijo5GoS{es+|Lo>zeI-Ux2w&Cuf4978P(Uwy3H>VFYqRasRx{z!D#qMDV3Wzwd$ zEUOGYzCn zYf;o$e%55~g9I#VKtMys$!n^HL^qPWhbE)zU9~_^?CEgwP|pk~5sy%#Wi|c!a)WTA z%G^$AQyRJOu{}HUZU53dl=wLD+}@ZE#8|cRngQ$0uLe!V?LS9teC0`D##e>71zWKX zl@AFZ1l+yM$NkG|Biu&U<|Ea4t$X%pH&?gFXi=@`a@FtRBC$!m#r20RuU~XVkUojR zHAa5Pe2I1CD}n8VeqaBi=4@|fF+1SED^B(sbEg?s8ry2#&eCvo8`Gx_p+BtO3uJC> zZA}~$)`oqvohb*>pO&-3h|YceJk@?qBSF%wCqwVhqx0StYyAPyz9;D1TEb78f;x?? zn*BekO1TmDiR8ULj|2&GHQTyQrzq%eQ<$W<2Mj=2Gat*J?QtqFF)>lacwAqeQxVE}^ViG7P_=ju*#Hti?oOfv_E-z^ zJh@Y7Lr;9V+r;($6vK-tYS~X6W?Mu1`J2YuPEPjr_AT~qj(MGAT%D~mqx%RIMT;bVtqpLpkeW9!vbW3_k1L)%uI?t=8|o=FQ(9LeRqa|Ye3Wg_#NnTw% z68!m^kcuv7R}>RUYRp69*-?~eC=*}DmUB7ye)fHSX?0%RFR|i*Ta^XM{z-C}V|jV~ z?cxOdxz|H8k7A`DB5FcSjC&2M4Nuc)k~5iLGNx5SezdHFrz@jmLU1_T@7V37$R|>x z!Oy@3?tFhek!x%7p(J+3(DhkDOxyML&V7{6C=3P@Zx^S1X;O1z#WHnf>5GpP!T8WV zD@O?dX*J`TJKJ-Md5dLJ@utaS0Q<}{4B)CiZIFxk|B$zZ$2qnW~Zr%xcQ$$&R z`jOQXrgv{tM4H^owT&X#sepVj@{fz9?Q|4@|Q=vaSCZOegFzjBhi+}`}aQk^RET9B*P^O2Ly zh9b>x3axT#{{Dr*#ym6gwfe*ed8K)$p2~qa3%>DbZ^_)zR69xRtS-&Id;v&EOe>vE zKm_iEb11hZ$tJ4xrW{yKMA@&Lr`PePecv)y`2tXZ8>Rqu>ILs6lz1=uL-n}`XdHlg z!vh-2l@Z1Cm)6gaGD-4jseaH!(fE-kr&`^TZ(B_IU9!eclTW3~!>skL8>{BOt^=bh zVJGIK*1i~7%2^+g>XQJypP}#NB%WaDP%uI9U^(k=Ws%w1i7huTuVITttwYRJ&14M- zEr_2IBScM8k8d_kZ&^D$0(n8C8yPQ+QrI>iR14rJzm-G}*23HSN1e+~m6mbVD}~B6=XnZ&JS5KoLLL6L0B> zcGg$E{3};AS;=4TXq4Z{l9lFHqOCOcvdhq;~mZdX>+wT#f7%XT}E1Ss`mtH8a zEL~@oFiXOLg%JIojdHN%*r&E8d42L5mCLiHM0*DX?A-A*sWPp;d<`rG=ACaZN2{Hm zas8-Opzex{=)Pm!II$Qj09LvoFnWOpFe2DGI{uESuTcp%80#yQJJ528w9PL$*pI{| zY&{NwaSgzIt%p{BIVJ2qg@4>-$Fm75 zj1lh6^g#x#zPgUy06?OtnWR_Ny2s7a>>pw>M)!E+SK{OGQ8ien%6_tqP*g7ZeU6sX zL|uZo&}V3YO!=Rpq6Ah8ebi6o&%>EVw*6usb&5*n>fBQ zvJ8`snISG363E}OBe|!j(U(6T5cIgQA%A21P3SDcd?{gP(8v-F`60nNWm(jDA7gT~ z00hYxNELNolpe2(jE|oeNLAg!o{7K*b-5Mf<$vv&tnw8aAANgc9TY3py-anPklw*$ zRR+xJwra8Dkfm`f65;6oeucJ#~~O2T?gQ`T6-yg)59oFE_FaRi8h4 zgafU#58a@u*0R>~b>S6%WNb}Y=3yq%C4k4HQ2$p{P;Bxk7E5sdyQ9#) zjSQiSc^P&q)`1rHU39$qjlBL&789(8z=*n9cN#va6U$~_#tFUgyUupxxxqR0FBF{K zH6_W=5!x!q-=*7(C@D7*z9`Y7si)$8Dl-E!8_hdd3jIZ+(;0XlPwa4s4hUf(gcSyj zCMG7JAnec~!aMW{U`GaRnxCKHMdf!+o21Ef!Bx{&XRKEcvrgQ}DpcRA~Cl3=93=12}dFE6n7XrSwX zZA-Z)hl7=M0_wb*0_vOCG{N_RgJL5iAMN!%q{*d`E(M6G|Fcc&!4*wrw*M&tcsbS))pFKmfimm15+#JV!#zX0Wuh1seO#AejcJo*40S zoeDEuYh8Q$z5F$WpxDGjB4DNceezA0=yzHQY@KiuMNoa*=n`u{%zCu#p1+Tr(P8EG z$(MhlYn=J!y^)!PIG0&&U8-6>^l4jbZoY-Zr0COH?GuX?vprq4tQn|Qo6UuSK?29> z&(A@1lG$Bp$9Fp5rl8vj+r9dp_|A1C-gdRS)@kPebl3(h5gDSbT}wDk_{~Fn^=@ew zkE6fq|HY4OtGl2hEFf^q|A|y*a37q}kAB}u7w0C!&4NAAR6Zx`+MB~!J1ZNs3H|Y$ zj6FSF;+I>U-ZAwvnY6fq3S?p`O6dBr>pWmkO*uStrlzLG3(eDDImyoE+hV%isWPgU zP^bv6d6!_oK`rdSM(RIQL&!mW;(ScLCFD5r?q&riH$HKlK*3*X> zQQ$xxw+GL&IczlQL5daFv3g)s2VB$~zq@`i!WoR&)IbRsbZ!V;XYc=UvDo!h!I^#N$^kp1%?N($j?`JM!9)*@7X(SrYOgR=@*C#jK?oa+X)AKl&{n^b{ z+^-=S0=@^_d9obaR_UX9(^C5(2zk;XhLb5Uv-kftZkEskdhj z^lX3rdJu4VDx={_lruu@V4U1MejJjVF35!@S8J#%TA9p;eWV(r!pn0jq-zfR`2S+i zTY+hqgP1ZYGZW}L3i1m)qWnr;Nd^Mx7;Y588UbXK?99vzL8+;!Y&tI-`>MKN73~=r z`c>7{9;kU224NYG3#J@D9t*|T4M(u5rl;Lk&iX*?#7Y!SRpB2I5z%&WnDO;%3BTbv zU@F?bdsnXOs--oZ4Z{G>>XxYf@-+tKhJH^NCWTe^#NNRM{^Q-mfhp6PbK|I@C(5sc zmiDKoh|%lU>(?!q7%EX^?8>Sty(-tSUBPO|NHtie{7fD*<)SG~8>(XGyLn%}v?nJ| zmkyQ!9b92ml{{v8)~S-S_4rfR1D_>oM=Pt|p`nF(%Qhpdp1!_=kM~jN{o@}$UKFYo zfh99Hr|rHspQmj&FAA`c3b`u{<{`@JqIhfJ1yr^{V{GPXdi}U)S zu8RfE-P?Iv<0n~_-lBQ0UvB2(X?1=z= z_xc?F%Y0DW?zy@0y}k_QhkGhnF;12Q0ngEgzi#p)w6`>G2TMM|xo6tb6-~B>{$;9S zi}{!%>Y~h;Q05hI(k|`*dIf}plmrCLW@FAUM)m>7bl|AsGeUC8XGA}I5u&0i>q^Fc(jQ3 zT53@dV$;}vV|RDbLv)JZn~thCIyye&;dJN zG4e0?`Ex|_2WCIYg^{=|EIry^wc}gRcspOqUT%#(-}e-Gb*f>d1H}IcZbu{)E!W{j z7j`J5U%HlpXl70w>Z|JWinfDorE1wbP>i5pqhrfKG-HGmwijZZq(+yXot3o&J>A^- z_Jz0NYuxESM$y_IhAcP@>r!3qdtA5IiaM@-J9Tf}IzBDI00WV@KW24y%oHu|84%;Q z{Rc1*zYs`L$QL^~CY=9^E}^gW@{-kl6_1Y1s7jVQGDpkXJESfji^l9{&;d-G*L33; zc*<<9wVq>@J(Yg-s#AvAzZgL)h3)kIM-1|Gi9X8whCS=Cnwr`Lz|oLb3K)x1w=ip0 zRY0p^&@->_MZXBYAkG;H*jm0XH-l#m_Ep4n$FHDorKJPF{`Clt)MX<7kr|4ghsXcy zx@VpyQ=~=YRi`)A>)EcZ*9$ia{7>Cj@o(X);I}XXhufVw30Rx_?+&J5NEsd2-uu|6)1&GUP}t!M0i?iOGP@UzJrx=vioY08B+)ypcdH-_Oj z5v~f`cno3b zgUim&E@cUQKCV4)p3BHtkP!|^x_>KgAy3qsydAz(0q}P~*5v4?bV@ycgX#`QVKe;n zw*mro8!Uear%U;onT6S@EncIb*E~|;+k*OKOq;jqLF`RPhSz>B<^fH(ggm{b zre;@G_)OLc3biQX)zXn$=Lj2HWN=qe)6vlb-v(je5fMl)`-WR3u>n>yWl{gA9El@x zKDi1h85gr8y1E;B}Tc2fL$)LEsQA`F~ zbr_0WjL~$^gVoQ&&*bXQZpo^Q{Arj|M6$puF1-KGRR^%{+bZ_t&cM~F!J>%{d+X(O z{_96;190?U(3Ao$7j};3pI&wA=%j+xxve}nFf=eQqNf*|@MC+!~*m?AC`OKu5YcoIP_| z3|i!E*B4D2=T2>xHQCa6qUXn}A)LcoEddBM7KBjxiBivZJkZm0HM_AFytQq!bGipB z^h0cHKsK(XT!mVUVe^g`n*Tzlf07#i@!doS_Uo4vX4gwn)?P_zk=kpsY${~r5Xu^QY~@_A#A3{*P*bwl3* zx9|Jh6xr>)MwDKT@99`7mjq7m*W%)fv$0iS_ucKh_hx3l7EsNN$R=utxTYa1H{H=m z*sGTY3;yyDhn$Bpb$mnvKnFeB% zHX2iQ{QXrkt3x6Xt%^9GS@~T>NeyzgU9u#|!=MJ6LpckJjimKx5C+MmlurB*z6H@P zZE3mUU-X+=q@1bv_W}Y+p57mxZ@)o5-&Y<(0M&PBD7D}B+{!nOZ%xPTMNr^e?hK92 z6mcppEp4th0o{1O=#e&Kg_u?=x#kEkrVL;>I8zWLFP^3n+;QefKQ#c0QCS(7=Rb~( zy^+lQ@GNtM>tgkrxED^ony#T?i_Z-F)qVWMV>&kC9T3G~Z1(u)nL(Tr6nleN0mdmC zs1@=GhOr~8b66?L%QJ1Dy!HE1c70oG@o_k|D*68X%huEhoN))Ef?!Y=L5;$RPjYjmCO(j#uE@G;5@`>B3al+6_9cl;x~&%2M2rE z??oZs5QKq}8+xp9)^PpM?D*$nyVU1eib%e01M+g zj>|Uz!w9_D`&d|8Q|^w>A~{U4Dlf#LCx4y#OPL9bQOAg^7AQa~{Wcxju5(FeG1C;c zXj#XOI7Jj7k)@N@h@P9m3`+9E|60-^VWop?uoU18>gX`VdilFvBzoLVx7KDR1+Y9S z;@9K)?;NR74+y&v%3MN$>bkl~@y=lb>sADR{PEFHFVW0+7`a*vvIx&9l)t$Gyv$I9& zOgqYbBb>h%Y+zMe&A-3;zi6!+z~;<0Mrw7Qq;0&7kwEzE>?Yd5Ym$0apGX2kC*vPZ zhrf#ae9-9AC&U?LR~ZAV-so!6tm)ITg((}}&9*q#Z10N)FbiHtM$zWsx*aSuF*xXM zo?LG`t{F=Gd7=z;fD~Gww7gu*EpoZ_YCf!f_m<~nU(Yd?21r!e z=eReqbUs4<{pNnJOA{MSeEc^min1(hY_vC`rF&%_@E_Inbo>GR`W2!c*H@OWOik%x zMke+arLc8x1{{5S`Wb6#YQRRdiW4xl66_aK1JkcgjE^5*?NK3+Y@mp?2(PZ5(06Rh zwU<{nGIF}Uyf?0p@_cX6-M!AS`GhPwS%NFJMchJh^bS6}Q2(sn_(oP)86lPcz&B{P zU)!H;OUp7;fCxIS+-83NR?2`M5XT%d0v!n&L=Ayw|8@50T?FBsy z14-rY%n-7%HMYtrcH?{$5J>x4Duh$N?i=bg=qI=tm#Y;SfR|6FNI+J%fc`2RL?cDa z#z%*RH&<%v>LutouyI=TX2!nUK1Ex$0Vo?ch2D^UAx`P(zfa-_7~z(c{?Gt`=1KRtB^ zs$ShUjkcReCaM4-)}6!fqydnZRMg)Nbi3tRF?#{=hNZlFm+S3!3`)de7fb4uIwCs% z`IbFx7F1*V%uY^lK@>7>yZggyLJK6jOR-$?`QVhi7(`TqNH?j^4A?JRHim&&!yjGn z7eUxJ2n2u+0_F47JT8!iJ`@xbzE{3HbPNjg@fVPb(t){v>+2MY@1|5SB{Ph#>A1OB zt9N1**V?*O0ZSX~#mrIC6Goxh01hDHsS_|JjBXGR78Dc)m8~L;d9W@0{gJ5l=pX_H z(GKVPpMTt39bXv-T)PNeE1H_FmTlbuAntlvL$3X>Y29re6ClWP%~+=$9ZQw)iT ziIFvv%U9!70Jlr5k(>Rc2R9&uih3so2M5#KkCDu^va%W+?49&!(6_LdzA*NW2#W&S zGB?*dbp30!0JPXxAHz8yl3k(2E6g?@O9FQ|D24nTc6LLdmswMeUB9Hz4S07%Zh4o? z2Heca7Eas=ybU1GeJ6MhF@@j0)z#PA4ggJC+ex=@jL5~0`WO-#vk(9Nx?bD`W)+mR z@u1N`1AGCHn81J<(%#!(*vZ}3%FP+YcEhFTevcFsb5#W>@M3yutLu-Bk3q2?8wY2X zJ#GwLdhx^R;HM0=PwHdmn-=^B!Jj~mn3b5Cm=>q`<_(CQ!DDW2uFve{xo3M!Nz{b%3sbQXq{ZqqiMyR!3yO+hppp|S7V5V6r ze}oF5|AgnD8w1$g?XU;G9k_qHkeB_o2;`p8fu{OD4{WRjpzi+QFWZ`WInP=_E#`W6 z0bnOyNP3gK)kv`zmD8a6TRRRssX5^FxeG@I!GZhh*WKE&48ZJqN=yty6(gCvcffyP zhhfuw+ewJlW^0o1=tl)yTfBQ0ZF3iFw;09xOo8sLasnH&bn&?j};7*F)Nxvkr8@pk0b zpk3QOC3`mjj8S__vi4*T*z@+MtWb7WS4&LXbjYzReJ|KlLk(VUI8fUD7hSAXrPf7E9j85HXo@up~UMC?Z6$iqQ-croBA!iGXC zoTVz^Xa%5qtTiAl`L@Sf2-;l37zqJHe^^P<9Hko9%&$qj{c@y^Un52$Me+f=w({;c0deSgTx zSoxE8VuVR7=5NeTKL!N=IkFl0x?T$0 zrX$w&@)z!z*W7wiEL{2j;7G-v>y$* zVuW6dpEgb}YCct;o2RiBidgn@aXXBe$YFkQJsdovZ9xFF{3}X0uLh2ny3yB$mnzJA z-&_=xvaaqSJ0SP;%Jb`ul+<18xIHZ-V;*M*I<{>r8h91~_R3Y+!;H?_lV_Fx$VMB; z>FMb&&d%1>*FkSlMk**z5-ET0{2Uy^IsT`Wpc6b9^2ETdxk)9l7aU6!ucNZdg%1oi zmW#W`*9mhf`8=BaPqrw0yM|G+;}-f4Ed%PY^JXMiQp}8$D5wQez+THV&8rPs?v>Zo zc7v4p&V6BtS4ql(Z_o?sOC=a+d~g`T~zW|Ze1{H%Z^x3JbE9INdS@JHcwQTO;#8Gm5(yy zUB3s5m*H@D@_r~q#XCeg-@4$e>GieGZb`$W=#eS)O9upHJfE-vi7j_1(ou7o1mD_o z=6j2)EJKQ3@UTT{Drkn1yGG!=xJjWLK< zV9tNG*aCO3&oRz17$^7sbFZC5Ceha=h`UTVw1=J zfolno&{qwXgaMm1n1_NZzWEp*GgfrZ@_tpr;Mcp1S%}T?{Mu+KxE%I!)p^iks)fYI zwHk0ahi_>t|G{q+$F+IL#Qg^5iBe`S}Vzb8HgBTTh0>Ts95#(zf!vSH*%D1bmfG-V z+|J3M9lg5;%f&+hcA6CQjmr>=8RNoWa`%RFsR0{k_QP3JOEiY=^?m(P#Hcmw$`@ma zGDi}^)Le_&BEF21dT&0#NfL_h6b3x6W4q3q7B^HzPA=6gBsOrf*whNKvDM@^n)jS$ z0j`O3-pQr){6M%zVH1Rm^s4t>q%e-r_$vuQ+#Awf`;6OWC2Ofq53<<};i`k)~+j=*aH@ zhxVy6o;1+7xt%Q3IRLg3&=go$Ta)rIzCRB)2hyC+yc$Is5yWgXA-LIk#>Q>-JEsaM zY72V$>}+hNCV3!(9JHwR+4-jWzk`gCO{C_>*pI;|I_taI`x}2FP{8&<17CGR;q%u_ z_dZqQU!X!xLl$C$yq!uUi@r=mp5qp2FsmJngj__%c=53tZ;`H*@=DfDy_JEwR4}pK#5I&zW5Q0_+Dx?>imAOqX zA3<93rVVDFNMZ-ePyU`UM6&yp1Z+f~*I=)uf^x(?u2JGQUZ|_7HO8T*jszmS5{S^7 zGR*qs$@%#`s%$DyfR=yl)#ccB^+r>7eHn28ir;#=x+koW$E>4CiHUae4X>+1{=;Lt zgBaA*)2s7Z-2gZ>z~u+kobh!9rP~|*krTM$e~=2Wp_imrA@h(P zYM;ZR!kkn-zjQc-k?*oONF@2;zPQGuLQ!L)H3VO$AN-Uz-hAAWaTnZ3GGDYxzE$DT zNy~4?*6naej+9}eh;V3vzPf0A9VK0BldfRVWlC`D;A`X3B2svpzh#A(As~uBg)dU% z{@!OlWLL}fGW-FR0CkH?>GOZ4*?`U%6YGw%s_MwA+c(FnBbrH5U>F#Hhca|A{5Sf` zz&=ey{G1K+*FYfzNrlX!q&#pc1errwjM(|;!h(W_mMuIW1~8y=+Po%`Q;hsOCTlh; zHK=?p$D*T^l`5;o$7^ldP7e?D8l44GdP>TQc%MSgG(g?~G+xi15$%K2e$1+7QlV(E z0wX~i=Sr;y=>OY8{O}d$hKD5VM7m+cCB^s@0-jum6%yOF(W^9vB{ER%R+6({hHp1Q zAQzx{z2YnwLBd%@q???ah@7kDXILKxQV?q}w1sBP^%8M~!2`#=3y=$dT#QLM^Ab!- zF%DR*-Aes_ja-pf1pGSB83oSfFKQ)$A|_2{DMUc{URJ2_Bubts=y~GHRRTHfa871T z9N4r98S!m$vZUlUo-|MoHFu{f=9$bP9-1JY+NnK(tB5Apce##-SWYDwN1QmKl3~h= zLbYmg*tx0@zNx~|NgUmq4XC;c7$^1r4n&i9=iMUayT5$jIN&5IGIFrJ{R3Q{luG30 z9JBa+>wD^KD#(q{n>qf>ENprWRy1HT5P)dY7u)Lf`{82n`QJ54{U2|y zYb-XRTy0~!e?CktW_tV&Wd3|re9qMt@0vn(f@;uvd zoJmhJY$M?}-(E{G@--hwE|aE@$MVyElu6S#&@&lp*e_1G_GHM!weJp2<3>r({Z{Jn$@3vNMaHZbg`aIGumAacrJ%Al-&&gB%{vsu28hAqGbKl|c!VC^&Ua0H;? z=H8%z$@y25@JfJt&0#7TB=K?oTYEQ4!!XJ5@|m;G7C-Y|&aD(nW(UT&e+AgSj=i2N zGi#T!n#Oq+S7I8e>1ov`ZDRmSIuoPFq69E;Vn-T=^ITZk&vCNhTFDch>zVeGw2X_l z-!ovLw0JAy1+fG9RU}6(!Viswzfa0y^ z?^S$tIKgQ^<*_$oyp`n_S)QB|aG5r+>VH198OZypb7yp4YW$1LD#+)6{ewCqJ-wz@ z30u%-gCb_+;R9UKJbZxr6JELH~4v9si_6kO7Cqhxa}Q`P3@ym`x32DL&D(5h*>{|xon;*AJ0AZVwg zVdpgjAMXBa^yf$7PM2$hDq`?eRBl%U3BujX<)1M%2yV-oF!~}XNo*%)=gBMH%jpHj zezU5N6~%gG+w8xapErT%&RTh4_I6ZA)<86Ak|9_}&zkP-Kp3R}u{x9f6UADFx z^YaxeZ=uNRG=?oFCad2rF;$*$;I_}o%Y)sv4 zlq6o^Rd$3h&p?OA8E7!68Cf|GB1(i)yVh+IWDWWPJnbs{3mvRy3)PKpR_{qlk|ADNTFT=n>N(NuZVc~P7J zxyMi@vxc6Jm$K<8X#}t|a^xgOWawDbCI69N1?B@Kh(b`;nj<171|XaYOJICN?@1te zDIIme=`M(9b#-^rVo3tr4-1Q**X3}fJBFaYDIu{8#8}f;yDlqd59nCTMlEM6gqouO ztY-S=awquc0c7vnaF#GNIk`gNYH@O;J1&^zr~r3oapR{6lCWfdhWXsmds09xlH8mm zpa1$oiOZppa-2`HclnzVJX!*z!oXpo8O4xts7x}m#-4M=lhyrfd%t|ku0&3(z0&<@ zbel|>MqQFQ|2kv(=S-d3CCFg%BLeI<8P_vLeP5^@S?&coS|iC#O%Q*9u^c8Q2vxUt zGV1>E00BtH*KGR3{zGe(te?vLTQ5bje{=YXNf#u!3#5T{#=*fTCb$LSu0j{&>E%^d zUt3>q?3lU-P<`*-U2olNb5(n&E+rb(`;bLRm`!~!uoPm-B>^@%N%K>cv#HuUR-)zB{s zXQ|)VPUhsA-#E%lM_%FW*7WYGHoSm?y=eZr%!^!2s6cyJGLIJU&7BQj!xlkWkm~h% z(lWEzeIFCQ+U7Q$@&=*Us_@~XOLFbB0vW4=x07V<`22tiSS*!c2D6C)aeeha!gRjG zE09;MyjMI0^&J}!&5-liHCs!zp_V|#a-DMDvMLqAsmlhowfvVB-&NjI_j@Ze`u=Gvrx4++MWj|D^&3;ru;tFfBXXJu;#CGl)X=Y$noDknjB|;`pkEbMM8s3@n6;EB!}XRWw)R z^#H@YhtR;JaXiV%^@EH-zpvJcbse}_@pm0s_+%gly#Hq;p#Y={NeM|9 z+XEWV#;yjl9$jgum!laSZBce!o*U%A;!+qG@WE#d_(6{p?}F6Xo3x$-Y^G;}pOfl{ zm8Cg_W^JL*Ms!-7TG{W_rehTr#(-jLEs<{Pb+;|#3KrQ6Upm6* zL~*w2=^6!%AIx5GRUQKHy$)CCjTT`dXIf zrS*%&C(gE{fmzHiM?N1!dEI4!HThcOIy5-h5)OP0wgAtGrDA3C9t6>!8;XDALB0cS z>ad5N+g>|<(Bm1w5u>)j@4Y1>;nh(Fy##s#^JLh;lIA~n6g2wG1=uj{>&__^Iv`_9 zwpK5M^LA8Y<~H4j_VJ24zi>%N<}LxZ>OT^4@V zAmTCVps&#h7-r;c4rB7|Vh(bUI}{?Z`GA2S>5V;5x1pT&`oYWKL^(@bLr-ni^`OUB z!%jrSM#5}KifRcpBZI6zrPiQ}uY2do(w#YULPr=3b5^BIVOu}=ZvQWzR4Ye=aLA!VwbfOLs_K$G57!ItbVd|T%C zqi4>=0_^(%r-)74Hk~G9CV*d0*IPStkA5s$|wC%-pR z`|NP62>|D^x@khbdCEH27FQR59Ds+y@#75#KfA~+H`SJfMH$16ol=A2e~nV;ax-(UA#T-^3pgK;2l z69~H1yVsDF@gEwcx61h(;G>yHnxLiB0EDv8GUW~Z;o+f|NVYrnH!zboSTZ+*b@{-P z+d}cT^ueSubzuE8l{_B*%w65|)g78&9hD0Bmmon#GVD=OVAI^Y7i?r?C=HdBQ|^-; z*%eb9e_NJYmcyA!0>0!n{HB@9snKsXSfsT0h-p8S2N-r}vUO`{s;HD=mwB zm|Y(c73Jn=nbVQ=&fnkP5q-CG~|rD%%gxIxR;sLA`Tq zp*$|EXM<3ZOwab7!Ihn|sV#0+_vpi7z+P<{xwf!G2nm`UC|UYX>}S7U_f*&4^P4al z%P@kecJn`Zu~nLj3no>af3G|tWzv)voS9cD)2K<>tVuDfj4*Vkn@aMNX11=!$u5sq zaHMd4l>BiyOWrcwOJ=HoiVGdJt|M4NR0XQbRmpm9Mkm3!%{9x{K2-hMD&p=7k@bxY zUVeTV>1|`^IN~@qcIhDr0VKd|bJ%cC$U_$xhX7~4C%T2pb3d+ACdYHPC_Eeorn0`a zRyDUv<-(9|A(2LU$Il=gK(T4)G0t`F@?dx92n>a!@Ng4i-91Ci)fVQhN^kmB>RbXP z1^=mQfX|O<)#pT5Soe_dIrBzyb8}GZ=}~D=cf`imT8HX7%TJ^)kazkqk?UMZDq*eCSu=-6FEi0jtS)8kOuzC~ zo?0*4CDWhZ7ByTI6AKGB!Q=t31lCS*iIE7z*y^0+2Vh?5;?K&BD0!IBH|mqFFX7*j zHenf}Nl8W(We76>s>qQ{F`sMbJsz3y7yPw#d@cehUO&`XkOZT8wjAp@2QGMHd*=*E z9!Mb!Ik5hd`%x!3AKA47Ok~VNDrBP=6uw)CRdi?KFJW}RIi?!w0r>WsTWn6|61vc~ zr<-*kXx%kQ;Z}N`?ymvEt z*BUICN><(x6LQcb`3;U6=Xjt?|KS}g7fsyA<_@pS_~*}&0zRh(US7e0fi1{mz{hMk z?I#E5zb9dAU{!!IL4d~UK2rQtsu2AvY?W!zdo@e9+ES=VVBlL7Xu*Mn@3+)}v96(l zAc5s8nrt1tP!XV^q2cZ2T!H>I!GYou-{eddY9P0 zv*vP#&H`{@b!%$}3|3ZNem&ap3N(F%`}>QzW^|#QBSJ;&PXqnO3v+cVVF(=4o>Rk;cKYa83|7wUbx0nY->&gugKP%#`iD z0;|{F$@T+6L~%>xE|3C})`zHwo%|9860E(Xna#l#u1;{>k&7OGReS@}x^{u|4mHo7 z&__#43k);PE-orr;rf7F3927a-(PjIT5f$k0PWd2J9x3`a}!h3{rraO9R}yAx`v!< zk;{OO$gyNe{d{@dDOKlloA~^8cY`Ggd#-%>M%1M-z-moMrf5x)?4a(kdXOc-7x$6x z#OFsCj(_E6bxnCWxcf6II=GqY>MaZ2kJE1$`L>dN`FG1BI_Y6ge|}H>GlSfJ0Hi0R za4$SDkx;7am6!jFtMyxtk9~dn*)RbIeMoTViNL<<``%|lS=p(v4QAFU77PDdm?w*R zmL(F*w*@7!0dR4$L|q(ahG7OAJ!5@{7G4xq=<$5T^`6J#e3iAWiOD$N#jZOGW+^XL z?sVfG{g%6+cCPoYV$#JaD0TzR4t!e9MKI8bjKQIml@&1Nd}nR#tUVA7kbXc7x!Wow z?9)`yY6P^eb%w$ofEol0OVOl+HDJ~SH#axkbnN594h;2n>*dA{d7i}HTz$kAwDx+t zgtOjZuFez_4XhU~508o_3V^W0Ob57t-|IiB$ZS%S@Uk$~-;4a56hZ{jGNG*2#YOg? zL&FuQclyUB;3u|S<_F1&o>gGnmj=uKN+|96VD#+0$I$t?TOVMWqM=9<--Pl|5j@MV+lXM7AH3=&-F)!JXHMtyP%Oy z_=I$L^=LnT^u=lfRqBBaVEssRtphOeca3yXW1<~#)?V)90`5<4a!UTX_5c`cbvTXW z_VPvA7}Ybqct!xX461lf)M#m>6sfXM!uTtbGn`bEu9q%dGMBb_vFzW5BAhEGCqOm* zochA@&xf+%;vXtamy{>b-1E13U-)CK|1bK92){pWy%;o<6P>BBirE+YjJGR(hH(to zovkhF*(jF=p~?AKo=U*Ys&gUl z9)KZ5e=8EeKern)|Jg47XM2Dw3D{?CpgKz)I9P#|E@*e4E$RG&?C!rb%)j;H|05px z4ch+a@!#Xf{{5WbFaL+(W&bsL>_f(vJRG228RgQo(*Q35NUpaY*MQL{|9bq_ll}jD zX(;p7_uDV@^krPUV6~8f{)^=8x@Ze0%MuNaH_z8Wk5xK8v{uG`U8+94^H;BBjQ9XYWYM2(UrI|K z%}Cz574mBT?(fAFd6z(Uvod0#g2;F~?@>Yr&f(|N_s{I#*>qVr3FohXD*_!q9{ed4 ztOj2w1W>c!(!6tXQZNwB#K9)Gn9AUUed<9$-XsZ zu6aGxk@Z}R<9hVttC@1cgn@NFK0ec)7{e;p2NAqhfmOhvUO9_wX;nM%5_|g?zOvc1nx8(J`kuW2|*+ z8BCbezUUNxB+A)QsFU^Sy|$crHJBRe-QMNoB*rf2E3&Jq|1gtn_b!Fl>1yvAP0d;t z%rF>f(H$bqn1I+_5i#FRw4NwDf!R3EO6~`N+1?mUXI0{;edXWZNkLta$qZsKV}bnQ z`Re+!7j!0qp+ghO%W0{Hii%mKqCb7RQGyt4r5wZM?TnHevCFCWu$VlVr=-n9<8zU( zyz!WCWGmt?2=!UyPVCJ$M&5M2Uig91%WqBEO+UbiD|t4)EN1mB-(f*I2-KVr*)+a#>$60@}T$Z0GpA0^)2mJ=f1y>$;!QyMp7kXwNdj>$2ZLQ_KVa z9am`h|3%eXMpd=F@81|l8l)SfkyN@-kS^)&?(PyPkp=;2>F#C|0@B^xotxY=Jk#?% zzcKy~gBOmm0r%Q#t~u|x?$1?UU7y0|Ru&(j64I~%fE{Gh5B6*KK~q+$6MJsUK`38o z7hxy1?tLFME^N@DuW<2uDa1_wHt;0KviA?aX|cph-_l`iVsKD8@{kLxV6$$7sml0z zc2+_OH7##{hAK19d7kCRE2UTBHD=Aj3j?pZ5&qa%FU=`01}d5~oI?T5KVHNclpiA6 zbyf%W*Z_K5v&Ga!+4+a5l(Wpmtb@^t`%whylePO{XwPR+IL(w{XkR(=qx)R(@$_)= zTO*$ik;Uh<CAjr3ag1m0ZKnVc#Vo<^<bni7MYX80F@)^if;a9e)CNp=4K?O-?cM9hEr0N`8i60msZ? z6EQj2k4Tu3p4doTYF2GXXo$LiM^g7N1{8dtW>If?nH+G3KCH)0R{L^v<$oV?O+e$( z5h^qo`|sy$?Vi7`1usx!%edmYztdVR;hHc!(UAyC5FLMK;IPxZ=r*z4gOuyNv$q1A zRus;~1{j9a+n{k_JPs`;F@RNBaW$KdTbA_Bl(|a6erC4O$jn)$hBGW@?Px>5rn^Ro zR=#k`QW*oT(YN}eC;$23`U%1O$}QoB4<)d8MaxNV+5<~8Eo)*|>A?uzD!zuzI??sD za3JwB@;~7WAeB>}FJw~HR)dWlyG*?3W{OC)xu_~CORYbR#BO}`UdElVY;@SJq%ht| zwq0}x!p^G%)f3q>VYt$##8uXEm)yktl>6S9wx3rEphI(|;R1#@+(@Y{N@rR$bmB4& z2?g;&3erK#I`}p?cOYT^Ashv?0%<3m461pEo2w$45)A4MT>^doO2@_iPlNcB_;mM=nsFm)$WnI_93|U_98DZ7n8=g=OQ_Gm$>g?Ppy0ot$C4 zg-jq1Unz8l+wri#e1ZH-8E;V*sA`bTfaR{{>;sdZ-%}?%dRUhsDYW}2uc_&;Q*Ay~ zeobB7-{_P?$n}53UTAeZPCU`$QgnL4^4Q$k>gqecc5nY*JBwC8rJNwE^|#udk^)pX zSw>lEWtx3kjuFdQz)l0z&#t$>9~c4I9@{cNHTq1efwx1gALpZyg@vT;^g-qwuq|l@ z|0lqq4CJuF!-xD6hAWfC8IR9LbCsIpghCwWHGQE0g!@`kxrO&&_}*6Aab{Z3`AG!G zF%JQq@ujes=VH1TnyFSXTp9+3L zeh4|e$cxtFjk8&A78@ctX3{6NwAWcl!U%7z3hwoH+%~*Bpd^sqYpmQFk@017Q|Q#z z;O?qYvTt+GSt-YivQ%zi1O#J=ffv9%L`a36j<*^8q9I4=EZkqde85;@lh{vwCnUrQ9^lEXB7=7`omv4I+0PB5B}sa z>K-I8*N-YKZ@xxK`=|%8E&V`eUSKy{@22Of3d>{RO4^CtKiKDLZHnpKUUY&AJkR{q z+WP31^0c!9<#NXW<&VF}%y=oCR>Q{9G#lVN=>Gr@X8J+KR$O^GqzqgPE=Z&FGJe z+k=rdF*<8T3r5(!RXJK>C}@zNA|is?V?_grrLApQX=%&Vqt_Z$#)k(>9N};5lM;ng z6d2?=<3-{Pe%!jzWitnO!L+iIw?9Wlg8*UhwLGqA$v53-RmZu6A+yhW2$|FAk?1gA zoFjr;`!inlvP{HU;1k)Y<&0M_gC;;FVJ4eC%4UeN#N(#AgCNksSVT!4*vpQaE)iQd zGs}G~v0zoeC@5Tz530;(-+L}{v1#yzN80%X1Q1_#w7-DY^W35yAi}2@yQg_&#BOV2 z;j@*ihL6&{&ry7Ic&MqRg-*ild~>!{-uh^1t%Ct(7UMuNhrdfmNGN!7jV0vQ2Bz&3 zy9_}+K4pD55MKUUs{Y`bPb%Km_l)xiLv6KdOY_%uM-<2NCupHm`i0Wts@f@RmhaKw zg$~c1aXrTiWr7?p1hvl@Sa|<{bl_aaS?y@~BI8cw45MG>JcEPQvdf0I0TGT;sTT)< zJe=c8>(j9pX6VIby&lm(Pj^>$cMovxaN?^wa^GDGk?Cr^xdqxK*i^k9K{0FB-`BeZ zuLhk0%&u4Lo(2pnTW?_u6EDueU6vPo+#EjQ8#4R0qyMggkuV!%)}pdup3s1+ za2B)SWQ%wBuC^;lP3$fx@1KQqf|poPAv}%-Mv_LA6%`d2w&SMxgO9fZF1y!Zfp=MExe7vQZF@-YpMuFYPA?L%4DDqiKG2Wf7&aWcnsETetTOT52X#5_Q zX7Y-=n{Uo_J=bzGIG--Ig;t0=317W@`SbbGbX#4ScCF)5unQNhyYS{qBV_1C@fMBk~mMREMV1cfRJTyGSDvKM(IGLUv8P z@!e!pbpD{&UlR}NFmCi4@;1+dIqNV(saUw|F6XDVHE6lG>Nn^5fK!dAX;kgNK>tjc zmeul`;iXO=``R~>QB<^iX5gJ{4>4aqf6VF%17xF~3MMcf2!;yOaU+)6gl_BKh8Z`B z?(OZxT=wS;f0Rj$k)ViUPHp@03YID8G(EWBAdy!%m@stZbTRL;^{vG3w^Q0}S)LO$ zUguJP*!5vy$GK&Mr{rd8sAf_-n>K#>#Q;`@O%oI}P7a?smY$1NrC(in@0skt7Qgzf z+BZ1B+=4sTY+AB3rAMw@Ckatrwa76Pwb2x@7%zCCX^=>+Vgz?;Jy14Q)2M-el5HCZ zE(~}2!CriHB0Ep2l%vL~PtH&l+74T2we z%AAT&rezxyu#}rbnpJ~)6R4T2h4Lz(JfpnJ8Egf%3iXN}KKlN!I@iExP)Mw7C$qM& zc#n?)T*dnRiAhNK`1qzQYiq5(`HUI;8Z!?sHfwGlHD_1a86DlbxW2v)zd)Jz0fLCU z?!39T)oaaZ_VRg)3;D{;l@CwMD%-H$T%DG6qkk-*$B)9LQ;bORq_F!jOSG+YIYde0 z33aS0!p@;+Ns|U-9XcwhDDB(!be1%C7z>MUO=u6Nm#P*GVQLoX zCPaA?TgNbk6xdQpXNrwE-G6fSsEbR|lu9h=qt(@Z-bNHmkT%qtaL_&S>D$Ay}=+Is+#o)ik{~qHMn?MSIuZ<{jU$Wi4!~xhGua=`i-Vc^EPPZ&oqfG)BY(Q}K4kyZ@`u(M3;3%H> z(~iE8m)?565UZP=VD)8M{7BS;X{Uh9Drug|C8cpeQ^Ufr8Lz=-sJ{+}hj)E+dm1r0 zNdub+iMux#Ix{!l6+su8 zTwZS7ieiGe9nri-0M7~>%$#4_J%g^>x0c-TYa!Wkk1P4lXwj99lSt~vC?^azE%%U5 znE3jef+<6iTLP*>1YY$vp7>>6pGX9lyx4q6Z-xm%I+?9Sg=^ z$E~c;ND?1!hJ_lnkE3?E|34<c)UNf!5vF4kz#=V@C#6k)fE4RSUtYOfez(CtR0>KmVVZ)Lct1m3`Ev0AR+#f! z{qf}`KJOXImQ+_8%vY9nVp;nUB}t;_$QrxPQ&;_3;!B)cV#(dr#S(7|nzYq)jPISI zx$Mla;%;htRQ8=0WOJP}v7)kOHO_Ss<~r%3x|8hl&t(^_pD@BdBYyX{Hey;TR(l>- zyVUHFpXX@1*X&zeEZFWQIq`O~FW zd!q{Z=&PHEqz}EbZeD0r-VCb?t$H#gvTvuINNQWTrYJ0FIxhRn8}jx5z1Ev()K>wz z#obtayb+l4fo4Jp{R90D?u)D4<_MV$*A3@MJ0`4Pk+$PUM9e&|RJSf^3+U>7?`lsR z(2HnWeiGTTd5z~Y(8-tZyff%ZVaMJr*lm{*@l9AVBfj)>T|&g-(D|=Vv9F9oaA=11 z#d%{}k0G0IBrP>66j+&KtPa&3iNE_$j=$?kGbYqWU3Hz~!MDYy#HGZg84<1n!W3di zr;4hwCU!Ah`6}{to*|$bAY}HRk$=~aad2??h=7BKr?rfDbyZ(m8<9zf0Taz`J2y-t zNeh5NWc4cHOU1*vukN#poynDBryM-QNC84%$bf)ZZrfX!S!} zLP~;yur9K~*ALeBvdsd#5$dbbBeD zMLitV>;smniblQy*zafWx}x_IggBLb1ggqj`HRo?I_=uhOPFKcd-d&OUM0lxoa4bK>sI*H2*$7^^54kwZm7O?o;>{% zKpy}$0&ZB403oEI;Y}bt1C!C=R7r7)-y(l7J|E6kT9AcpgS$c1eInR_V(0Pqd1*Ki zJR|;JeEg+*I;c*pSTF@brZHAclPBfFT&FwD*{eu*H%U0PWbce*RYjljU5p8LFGYfS zV%7MS5pG-!70q5go#IKq0Qju~$oUs(NaE$A>&&Tl2HCfk7chbG1Fq-O=s(*Xz|RkC)4B z-S3nsV4{?P0M^rIeAb6W3!jrpPd^w!=jiPG2>}OZ8G#TfXdOJET<5#^8TWXbc;TAk z69W@VodTek=DmHx^A`A9x?_3!?W4EoK3z25iPJf?@?8mwd|a~fbcPoiScwB#lo^LE#ko6kdsXxGD-= zY4ht9oiMM-9Y{Q$s}(O*?dj?P^D0&2RbWK7M7zcDAfdFI^|}9>w>*3KWPV_U1E4fW zt-&n0Tx!hhb{ zPk`V@aC3V^GO7Bg+=ej16r}j}hVpeA|Lo0i1lcirnFjjLqP*&CE$+!~>CnExPtPNi z$q+XBX`rCw5mIx|SxaPtZyhG6ZNu}`CJ~JZA;pF9NxQ-8wShP4H{f?i64y(OJ>k>P zVi(?GH(1bBAftQomB`3HX78|lq<+Hz$&+lzXdk*L?Yp$2pk-o zF0QWIraKgYU>G|bHLg(E^0WQutl=U4zfXJciLH(#%9>9gfn3l@WaaOIHJ@Id#o9Fz zOi6t>zI5c64;`~8sN~KRR*8zG-%zCpYK>Wfha2ZmYzx#%E<>rtmh8>P&(RDlq<1$k zJ8~RWWnQ_(@94P;Qc-OJ%GVCt$iby2Ep0yPm907`ayS%t8LNuy96(!_VKa4L&;Tao zb@LqXBhF`5s+T9rP#*-&hC$)P=Ei6MsNq48v!%I3*YDh=R#SjGW#jPhe#ozFuGQtP zJpi6s02A0*65`%&&FG;WS0EaYUhIUGw_cw|3Dw^>ik7N+d3v@sovO6x3b~IVWcu;n zqoaj5on7}8Yp4;Rh=ET*Ji~i(YRW`+J19|i^{l~6K4S@DR-TfwKp7?2v1adjG|S;` z3%x%lIZsRxTr$4Bo9#22#$~$#HcbzgGkS?EI)aY7-^8-XF+)QlNeP*0uR*<~yQ_yF zrT9zV#2d>SHm8x))jxD2G2KONit#fPwtlwlBI?^Wi(f-p1#b9+cjs=Uqr%V$S!0ZpBiDh)~MG*By5xL|Iq&*JXQM>z7el&1vzz#;K^p zRpU{CJv5z>tr6Bj=PSW5sbax(D50R;ZE_4>-=pcs0#dH^X0^jqiMY46aEZ>EbXPtr za^!NLfDc#bx!AiA+B|Cg}-OHg+w&Hs=~f%w&u@eH0BU5dFCBaM?f<9bZY~ zhDy9?oV)AbL4j)^Ia;b#qr*muLWy2) z@)-p<-EDuWG5Wt-owVF5B0HUEATU4%1RU;~6Oxsh((<8x1D_cDFbdhCrohq-+z*_`81TNLs6(O_f9H1 z?SBED0tM~At@y=hMJ&?m^FKQqePeV}4~gI9OcQfGxUaR?e^6pdkn6sG?_X{6^WLE> zUwJto_x#sFqQv+zwMExO+*b+Q`B^tu4Qb&-)mdV~OmTx&U6Z#jCzY(W%$5b5+g^(vxyGe@i~ zRqRi8*tHpV7rtgw1x+lr6oK%!o;n@Q4RXG+xEn3)gy;dxS6*Uzbo>sPCohFxF|zT; z)P@aU65i=N-?iU@IXv}Pmi7#QSX_vnrY1IO<>pe?-y`uH0s`&Els`L zZ8=Xj8=uAEUZ^|nUWu~lFYP5>=*cw=r9z8y3pqMZ_ty!HvUc5c#7zsxe8Ws_NiEDB zUOiOUn_3`O1=qAxC4u1hf9jE!KHw%uZmpjMe{Gts${Qw3)8(pUo7r>8ufB4XoZpt$ z3+U8{SyV2<*=B0v9^@;vNcm(cN`dG_8ZlCN?u1%u-W*(MR@~el#@313UJthvuaWcq zDltd(W3~hwT*Hfxz>63TjwANB1j;KB6Q!{-rxZW_lk%G8fXk!!JVs3a589Z18Bx** zuqGx-hJq&N!+x~zhY#7AXN;+QWfm#I)IGXCWvUDroApQbW|8rxjN9GT(1NK&Ubfi& zXLtH~68KnJ9TtEzpiN|ve-nb(e*RS;J3t^?G#18?YbJGYez8$jsH_}EUE}bRG&;Nl z`Ua8wkHMma>;k(c2dsnYIii<=o0lGif6kOe1$M$)s-tyNuXHx=x1(t((uA41n8q>x z-2?8~%U`|}eOAL3$VqTPN;F!Y}$h6C!4xc@17zWfry{6MK96mu;5qz7rR z2xP?&MEv7_si*ENr})WIxc5FQx#aNdg4Bxl>f?($Xa@lA%Gdw|R*5k?q=Y~l zU1QG6Q$!r6yW?m{_GIdVn_df5FU5ab!r%P|VN!Fd%t^>qQd686O#k^bcrwTMvQcoV5V=>#{%$;-o_%U1$btTBNtCqLN&;Fjtd|Nn2JH&S<= z*AiFqcjZo1ASL$iHTy@~wMScn+)Ix=j}T8BOe-}?2>%Nuiath2yTRFor;ezS!N;wx z;7H42-Xk%;sAp=5iAsuzlr;`AC_1YbrM+C6buq;l|V&5bbU2{rGI$Ndw+rBt6W&G7ouI>HU8aWAE z#3WSBtA)xDB)h%dD{Cuy)WTY+VpBN^#nH`+>3`wBfB*2u2&yl~CxUgynLI3N-~8L z@lR>it3Vzv$HOyDNxiGV3eoz_U-tN_RI$pI2Vh*`d3#ad8*lOduH!H2NLy_|Gq{p! zAo(yjv|L)k`g8x*`UL&}!w=TL#(WzrJgst`3Dx=YRHi&O3u2lGqY<|V#8jOXRfn^E z=ED|ou=$1dtYM1aE#C)FR5<+BRTrEm6$vQvF<_CQQCQ>qdwhI>_$%_Pt`P?bCt1F@ zOE%UUTCR1v0`PA38mhImL>qR^eJ^bI{-?Xydv9(9kRdai;Y)Pjio z6OBSFMS|EZO*rprG9+MyQhIqd@zl!3>TNei+h=#--<4NxVGVuoUFp!Toonw@H>&DP zGE_pT&Oe_1d$GsLo-Mu)^In7b_h$o@<^0EJH^#ZSd5(%?)bYS|W8Obj%zM}I zX>!8yxM@yo=txNtm9-9syB6(=>f^LxaS0MlwP}$r-W3gop96A1NqO;%B?sU^BZi(b zs4{~A!U{7u{F1y}DhNfX^tjY-thAS;r|st<&0k=bSEljlg*HqI1)C^@3xNB>`7TJz zfN;g;xJY(jg=O!cZl`fDt*$%xEk1up_ps%&p7h5naX9<{P^kgL1Z-^W1B|dfJCPgEmvwzjrOd|X>-+|zF3b&KA5hn_Bh zZhE>9#JeD%GyDP~$mxrUiKyBfF;VJ??mBF7f4=Tdm~q{tjlb`Ix`2=zM|Q^36QW8h zVA_ePUQ6?mpPXauF$4XHtou7ZsDBn7E)|;!SWYSKFVKHKs7m3py1VrXeVK(C2i?QQ z-b>-$pH6b;3(=RMy6kO=j&CtEU^!&G2!ta1tojR5p2!~tZ&I_tUNH0%aNAe_Q#G)u z!zb^1J9?LKEtBod&Br^vr=Me;Hx5@kGjnW3q#jlLbYVlZYx+JyY4x&?_Lj229ace4k0(NCXpv#KOf|LD zM{0E6!=(MLeb2WB)Ru2|QgB-Y^xXLS0X6R0p=+Mm;?{y(; zgo~F!hJ~ZS!b#6*l=?1$Di7T9ZMxN4iwX;L76Tndn|$N%Pr8`41>`MUl3g8~APqba zMy9uh7C%-{7|%~#P+QcUpBq@F&Kgc_M~!OTyy13(*Sn7VQn=S~6Gkha>Umx|1AGF* zl?*owF)=rQ)F919t6u27S4bc4*%#YMQI)hdSN2IZPLp}djUR8Wc1d+lL*B`jt2jKYm+9daJ9!=;2W2`*ShrR| zRFs{E^*=Bs!UgEg#5hfM(B&yPMwikFFoB z3E!7*DHu;zy3Ke4uikfdGQ;`hyIYS^O&V9qNUWaVEAhK(_oP%zfio87t#-IoEj2=J zy@d1NaDTpb%Q9m=1tPoD0f8?js;=6!@YYtd<*{0EM1-T9_Qv2qmLY_1rPR0Nt$6xi ztsM>;z?%mLDXd)70s=4YBx2weQF*CLElcTV*}4y#!jaFu9lz#Es&`Ac2%T>tGJK&l zNK~!VS0j-@P-|o28K7IZCywyGfHClOT)$ZFukpo#nMG=grNo=IcjXPUzZ=2Icadt$ z${yylB#%G%@QZb~?)ZLHBQFItK$oSkA2)a;cdiMeP$n;qWkg6XkKJ6}L?xSwUVd6lN2l8QX1v`FQ25jN9e_76TM`%H zN!X_>pr`<&X?>nvH{KtG4ex=lgfY1-iGB?*whvbzZFO~W*$R+G2ykZ|r_ibO-iye< zi@G=Z0GW9a0!w=Iz1)fbeC}N+sg{b=*71@T*Z`VDmpoe@&shY|&ss4QfWqDNcu_}H zGf%ZREtOa)F>hEhNno?i%_Y?JXfZx9WoCf^3*jXIr5sF`*H%^%bP^I4P9<;jL}u`% zOplFy%pLWjsUnENI;G=lPYZ}~t z(<~PDLy!DOrR}G?#ALG)S2?%B;V8DdURXN^222smT>t68klcl$1nDlxo1PXn6QNhq z5o?tSdm4@4ORt~gJy2OOVkGJ~hUA8D(r zt@F5Z7kcWb1|(Q;ns1#=Avn3MqN1XL)aspWEd+8me`$5$*&^yx-PfROz{5OkJMc%h z2Wo8@!P>U({bQwsd?5|Rjl6-W6GGtO74fm$i1$`M?CJF~dCbf1p^5i!8*m0pI<*K9 zr&(c@{W3qEN>b|91ewXXiI??9jlTD4swkO7Kmy1J-(LAul4wQJ2ta>jNYh1h;5VvA zi%)LFPArY1p*-X#1iQ=iRGG)rw3N5u86242ZKJEf!-)ZUJ_0%347ueIH5CmN70oYy z0pKEWDhnb~%PA@U&!d1vy862vxP(02ZDzOYyfw)&BNlW9yMB;#0&~oT#BeIl9dNB^ zhTV2w2NLzITrKhXe7~*0#^xkegJlqkRSjXb*x3E}DR0^-9N}QPtVy zY2VG>F;H6*TDmB_f!c*znO}_g34-83FScoRV4+wqQ$l{geWR93=zgT_{{EK<5dN8O zNYE%8EDZcZ>^1SHsm?Jof-=;7!!>QBP7A-<;G_qVOQOu0CS`iU1AEE8rg@pW_pDla zzj_WOy>iGas>DjZ+mxl}*Idj%{(K!4opYYkm)&`dkLIlY9itbaUAa3vq-!%PxvYa) z>~8|uk>17(e?-98Bj%4`v@12_z3E#h>a`XWmY7ziXNK&)Zu<_j(LFR_ArL`Cq|E!@K=|9Cpoo&XTIRFGJye^C_7c=!L;hNne9D}wsXtAS#k>RF2 zF4lNlMvNGgZF*Tiewm(V4+mMPb=^t()sOt1et zsYq>3j~Cf+@8leVo|FIi4LiKbCwmg7h~e}(O*+*$z1SO@Fv@GY=okQM12D97$B0D6 z=XoDi&gsxNlkq8cFztLito(4ca^fD|9MHM{R_MqBzlsP4dwt#Cftt~S!K|{afy7eX zYRleOFd7y1E&O_C!H!UmW?16gn@-S$!e!DmKjpYT4H+`Vyg6qPViUMZk7K>7jj+4F z9k3(P^Xi)C_=Es@6F8fA%}uBAe+Urs#+)86+e1Ka&vR#~eoY2q6dn2_=OowS2L9X2 z*hHgfxpJnWp(5M2x*X>Y?6<$L`m^R4+DRuIxQWv`QgK?@1)lUjUWy`xHgO;O21YA0 zFULJ*hm~F}T3EeK{*H%c;4Wph+!q}8)VYTEswEQdr#TQ!?`FLUsG*74!u{uN#`bC0)@z6(_2F+so~h#m!suMvUs`{+cRLja8i?rvXR$4XG~)j_?_3VR}0KnDVL zJeNOnaO&Rd5GSi8@O4PY8u$UEv|dlD3%T6_sOtN_o-+Hg|88~w_j^|-bL~RB)F-fB z=)}O*(Xs)L9w=}Yw91JJ-M#&dfU0RiHbD*NbszFq5%uoby2!R#{f}fdTe4WWe5Qg{ zY%>0l`5Wo2^}Moq1>cQWy0;Uyu13o6{zR}(vF3l0KgPD&7K_Oj+b|Jv#00)Rb45aO zj-oFeA*t<9w$NctNHG6r>Sy;b^4ZVrqn84M{)GdxHP3|XSJN{$qLh;}^iFm+qJGwM z+q<|(N~OoACkS4{@9uLj$hHaoW&0Wor_QxK+(Hx!iAS7F13n5Z$~y&)-jOw1dGKKn z#JDo+(17E}x;gTiNnm4}XKzkXSLZK2Gf*TmLYr8i1@+Qzf8;F(uGveE5S8^wA5z%j{IAxxNN`P__ zWWujzqml93oPNnF{}idP`JD;LocOLQDQETZ`(5X%yx8fuzFlDf8!1Le);{S@SZ*WSxtgU;F5MxtnAu<@}k zu0;E%?sHQhDRTL7QeKVPB_t`J*R86eBJ}vjXuGs|X>l>uj5dSE$5fF;150qgUCio$I#bYY0XW*&SUepn+~=Uddhp1 z!7&bt~MHL}Y*cjPGR#?FC1o8=l#GPucDu z-$%Trvj8)fL}ORH+&QuKpIdR%peG9|9@5fM=jX^k%>H=mbO0;mOJLITTzR-!KQ%g( zciO}cQ_!+XY1gl)uUDgw-<}{LCT`+|Oj@EQ$q;Tp$J?-|jgjW=bKe`8Eb~kj%rEf0 z7H$pDq`SMl4Ud*cj+UNE^CW3wGIyCzJq!OlqD~mZQ-|DsgtHv+V_mhjWI@pM2LEpW zEkWgfnoQDIQVMaHWcCH(3s4)k`FY3qO#V0b&i8JsAPx=6M9J?GmoA7cH(E9*KW6=c zqE5=5X>fh|vHYv2Iku*@Pu`a2CRcGuNcerI%nzmX_rgrH0qxN-e(sZ9V}&Igl2Pbo zsK~#67&eEE9ylXtQF1enR84#`lD%seV$cX6Esmw3$TeKncuQCWJ!yNKPjI0w&Ns`! zu2#$i)U-ydn-`H%xvf`^kiQImqbUBhy*&(UVr&5cUOGDa!7B@p^dz+um+Rf0bj--! zydm3({#-tLWY%gj&OPxW_!zFTMsUZmZ!hRQQ82M+jowr}tq)t=utxI98{ysFEhg~2`Qll{I5aYr@JNdB;<-Sav{Y3Xj6EP*ZlFpr61jOos4&x#oj zC!g<6*_+S1$%60Qx_S9S4L7islAN&RO8d|*+sWI(_mz;n9-uVTl`dQzEy=%mecS>i zHQu^LQ8#3)%CoubR?{Q%)bL>?jp9m=Tnq8BKs72=EQ{D;(dUqt2~f>AJ^>xqSX$F2ULPM%AP-lJ@^{^-|l*|#HX|5&7S&<8{0`jh9R9=$jCzj z>z)Fmz}aM70%%pu0K;>8NsPkEk50BjGhfWRTue4$3)T$9N*XHZBb8cd0OeFeHbppv z&;@#}O$&E(jwB)8SHf$d3O!avqqA2z{8pWqzqy{vICSsSI0gy3rmnrYyW7i8 zAtWN4DbYDv-xsEcc`dwUV&Zq-y0u-BQk-&-$0BHDX-VI#s;sDZmVqvWiSSQ(OY2y3 z3sFO9A9iffc83ZZ87;cE#BYO>?0Zv_#C+5w3CrCA{`hJ>a%0~wT2zEZ)olUcd9?KL_~W9 zKY4WMY`Za6Soz2HYsgnaqx=LHN@6tmtT%xO*iE`Gm_FE%0uxFQE-Ms|kqS6kcM2R- z(n4t8b^~^j7}4=-$s|deO%9MPVTjKp^(WGQ5wp82A7GY8cFyR|a_DvRt_b8Q9&9$fj{nCYIQh-*3$Byq!?>byNes97x2p697IrK z#Efa?e$@4wInl!P6f4;Xcy+nX-T?tUvCdV=EyHl9bNiEeOO-Sm0cg_Q;&8RlMe(Nj z?0!kI&W^7-*N#PIL_n98My?qPZW_J^#`DOBqMV)vpewI`0Sw;*KPwq!Lm*o^dKwxx zm6Sc{9>*3Nlu}0hh2o1wW7T4A_4q(hI65Xlq$mP-pEw3D3}MD#RN-%;_3!a7km6G% zA(w8GpXlQxO!^m!G|ISmALHs(6g(og>w8HWd+7MZBh@xvYvgn|!72ydYI_B~PL~k- zPbcW}~FTe!k+lu9H1 zmluxy;k;}zJFW)R{x(HN)6F_H&?n&=d03@#zH&iyslEbRjx&--smfLHCdqo{tXm5#5_`9!xRq-t@UJz7_8XfxoZl1=^+Dp&vD5TS+Qb! z4on?fZPFI6gw3_xq7$#;`?s`r~^5LoAJ>)i6|FJAB zYOLmjFt%i7TW%)7H;6KZFTHcDLith{&}ZoB;ic2$?g0cyxOQ7RTcApjMBl{6%?p(K z{YCU)Ua>_*^nw{&>BpGiLJb@nzNXa2$6^RP5N`B_2q-2h24`9thOmmtRBP*trk38m z;YQWZ*S$vQQ3j~gn4zl098WI8#;kaZKd)}`SOEATp#4kSk=%9bXAOkR<7GLt&NE!$ z#f6Vl(TvG#1K6>kLg$L@J{YRWu^Ij0ZuqHW%3_*Ez+?_>UjL^fQB>#YSJQ80X;TO6 zD17n(atv0?2UhehGTL4nw6c-? z0fNdId1H9^z|WEnp_R!v!V;OEi3L2ZztR1vMMOpAsj&N9*SmGL;``7E22!l8+<`mn z5(MUbzND6yOBvYT-w%kd_q=UJC$p}u+B?WW;w0{6>`0yWNuO;^On+(pxY<(A-CJ>c zG~|12%UMSn{LE=dvwsJV?yvqZa+V*X9bFhV-Pb z`6-?;D!EC#3RpW}X|u4fNTP7z0nAY!@8+xHB`&9Fl!@Oqpxy*N!2frpm_*#f3Z9M! z`i0*J|C+F}gPbfY#Sb~dDAC#kJG=ZMgpvL|vmKd*w0pd^1!raz(o{Ul>S_n|N9B91 zgE%7oBMud&gjHjEuK{&tWI6(lcS9~iY011EYPkUVr*?9Z`uVfA%*xZ% zM-kv`Z8cL$V5U_8_+lAPS60%}#pUJbX~Uy?HQU+w99$fr8hPe)jv;*G;o;p12LPOk z&!4{--08$SF&j)h9T)*Nl1sX}={h=DM&eOjJv~qhOVZ|1+6>S22(D$%%lH{w7G0_u z8~{8e6Y!KNRTR2E5iwF12^`H5MFxbYyX}J~?Hcz?ko9Qh4)^s5WOzKbhmhiH+_#BA@hrsx|-a{s^Le7cT4>Q$%hww$6k%)yr_`I`=w@3p{r7$+!wFTLdNt zQ?nXOM+drGcLZSu@;BCeXaR1OyPtl#dFxJjxWPZgh-0+$f#SBa))n~*#d~Z1#8&PL zE$89Y$a-)N?Py$e5O5TNEDK=g(zt!IN@^HATw~MHN&z(i=v#gE!vnHAfdZ5?OpO3 z`{2-Om1QR?MQ2DCkl2OSzPx<(FgCCtHf#pEKiP?O0(BQmhhwEGlloK3__Zh@eO~5k z#Uaf1JjP0_6#nd#)&?@GFE1E}^A;GtX>hSwJ1E$wdWf_aw3w$*V!b7eeDpt703}qV z{SZO8Y0ulF{I6fX%B6FAoUT*1=t5U_D_ob7!Nq<1l-1=lIU@9Ay%VYP*I4x^{`9)J z@mz7bL`UF}kjt*+VLQ@>uUxy2*Y%>|U)7`+?1;6+>wXq-VqzXl^etb9R98>9t@v5J z&oImI@+68%Nl5V3fBLAVmIzPg`DJMBaIV_z1d}9K68y0>iM`vRe*VQfOU*|WcjOQSdg@fAtXS%owdwm=FY^-2_2 zeeo?wCK;O9x)c@1XC5~E{m2KWVn}6uuJo5fOzWMe`r=uir<-?fdhq@uc1@$n*FYo& zVl|+S08=*(cKJE-jB5Stn(?an?Hebbo+nA=RpN7U%Cs`g^!Y>g>FjA&Gqc)B3Rb1& zuQxb_&H35-q=Yc>lMs4HoPR2Zs{&+n` zB1B#Q+5+JcZ+MUeN-g;~6~vAh=5w<1|1qK{1oX9EgF)`H^_D>bBro_$Uf9k*8jR2S zmKltWVEijM_<+!Izs~T?|JmP4mBn|lY#x_0WeJIQf7MB&HK>a?w_=Ab2&nkqWJ4>B z4PBEe_m}OpBy^H*hh|nl&!daByIQ?uIC2=PN8Z)Vt?lA0tilQIU#&vf z7Y}zXUYrU2sr6+!Bd*u#pWvxv)7Jh|DSgPk&`AG-cLJuIYmUl~T3T9&(fFv?H#4kO zoShv5(_Z{fbn${H56*yOFg+}HcB;yGkZtqNt08}pf8Pe2EoEjVIry$1gM-6D2)2A) zkL3n06i%J?GCL}9Y*9rEs3R8c?Lp-vH`?4D;eWsMuc75LdoBC=tF`K*(cMlWWPEm5 zuZc77(J2GpYgT=Yg)$c{?_N3!61$yMjAa#zA9rlNg|=_os~Ud(o&y>l|0T5l`|&rs z{~u#-0aaDkw*Oj$igb61(jXlo8<6hq2I+1#h_o~ah`>g=K|s1hq&qj=-Q95}PrToI z#yS7*oHZN_alqcowda~^-q*bD-(^KK9RZw!Ll&cI-9v$136j}$6Bj6F6NiDt^UQ_aMHvrn5=yE1<7pLBLAb|#|2g5me8$yN`{R}Tl|@ZjPqqQ7>hD9}P)L~c z-*5hQuKv$=|AoB*|M=estG~wP|NP+niT=;=4_d1#tB_uU`R&;vSnKK+{OyDL=QZB{ z07iDOFrD+h*m2QVh+mBdA#8NmpX)6C{yCfHBIEbBnvLs*`9^yLG3YJ^OebKRd1KnE z-eAfR0Pz(tVy88c1yqH4gd>{-92;}}x- z6m)U5d-IKa=U%x${ZMqsF3(APM_!BEfZ2jOb&!mNx3!g^%fPQNqn#;#!fH+oB&+i% z1Sh)Ta~mbGla1{efifnf#;M=cp4AKs^E~W7)t*@suPftvAvJ%ksHoVPY2adJmYZe- zYA4`@ymnMt?M)48SAE+W;>@!JO8kKjKl$8Rz=rkZE#IE) zL~Q``e5AI+Mp>3r0%OCJEDD2Gk!k@~W4*#)iF&Tv=pET)58z0+<1gKS)%5c{73d8O@#MSZy`TyI9rjexV9?sbSck`CW97xg8M9YF z%Y0r%K9oRk%06ZB(^_hi%W_An;GW+8=hjc(_$*H|Z_fW5o@Mt{ZdF()bOy|31Lao8 z(9VjV%B^v56~QClu~lV4Ga#&I@!;B!+ori~<1pf~@6#K?nlHaA9KTjZ^$^;jif=vV z*-b1wr33Xi$rXqHce^5FC`W|r09iL}tx zD*v11jBH*`}eayuy1>P@bmyI z(A}U*TRt}za3eW>#5&}#@9FjF6%{AL{emx0Q5%UW)rwTIR!C6JB-GLCnz?EI(7SYp zFw2_lxqle6T&0QBz7B0!p5wYRc?8o>#@vnF--?dx*Pdyhy9g_NB!*bT?@HdyO=q*`}5ER-7Mic-Lzio{(k*3ErtA*$oa!p#hYo zx)~fbY7T_c=%d%fzL1gWXje>%KlaZ#*PV;hQ1`Emc#4H|S`)2#+Gk?+-t;Odx)#+P zQ%;*pBNnM%U1axDWl+w!?~y3oWYiq3_9b&1HMq|5d7Q78;dJXWKh$4dz-MtwS1kIl zo1cPF+2LjQzBx@*;Rbr7SGHD1nDfM41P_i#R&$<{F(CY_w5j2D-QHmWL-sLe{OQPQ zl3cXwSe5oPJ+k!A)XI+U!>7t?BdHfH&|Se`WyHU(xLrH9cO{hR#wA2d8Nxm*n`?5B7Tv94v zzXNIY=Vi-X`)AMn-IQ=UJNoBrXFs_Edc5cHfmqtbV|<~eGBS!~{XM$`E8CoEjUt7> zi$6)(Kz5Pe8^=zwO&?Vf$Xenn4ntocsAX>WyN}{2vZ>z71=&|FHT~nOVyy9L8 z13jQB_o~RJ(FCI{BU@BdyMUtw*&^_m~g(X^C2cfm~H_Ej@jYkMT&YV zu<7u6eZ0A$_r=N6a#N%LQT@9wv-9ZU9U&DJ)gtv8!+k9Z3X1kf(uD36>6gRo03u;|HMYYu!2=dUk9_sp3JHL3CPOjr zLvA+G$;k=W=LRL*U@iwKDXAsAghNg(q;>IXujX!IEmfzwdV)z33kMMtS<`4o8AqU*txjqR(cTx8C@hF1+3|UB9P5GSTPU8T#G3fM2k}o zZJo?{orPCLR;g$S{C>+m7mj~+YJIvC`Hsy;f-(vNf@sVlGq~X_1RF$sZ2JZs!oUmH zAD~xxM(G=du4t)(OcD1!1f6ZhG??0&ug?plf2Ls9cu87wphk*;>t9JCM!jeU4@w!# z!!fS>__BIX4Li=VBw7js(ot;|R)bO=7WlLAM*(+>^O%4!E?WA5F^fx;ps}s%9&{h3 zn^Scv^_ev+Yyi=E|G2oX*m|mR#dz&l(lY>JV640>a5ihyQqfFm$M74uP1I-(cNY61{*1xIEmlri0r3@HA{#Wk^TtX zZ*5jP_Gr}~#~&vRxSV_~1Rp}8h*=HIj4-(p1|;}h*#SxmR%ek~B)(@(>g;Y%ULLh_XTW`r>DPqELY^8m~X0|K7GeskYg9oxbZ-wgaB z)dFp-IJ|z1E;E|I$0I-Y!*;K6yKq}Z&!$W~f!rSi(zx2)HPc8XFzA(PGvKDab-!#u zdkb*>RhVYlK85W|2OvtS-walDzB4sBq^YG;2M`OxU;6s`67<{>C9^>E`1Dv`Wli1% zXn+Oryn4{1(I_46@Y)al1NXG1^T#(Of_EM#6>3O1I$<0#VXe|MgTXTsvh#hVl2DzS zHZ?AX@np~41~GE%5jgzL_UP{V`i9~2Kg^?Q3ZQDGdR>R4HqAAh%>k6qN<32>@?+Yv3&NG$p^X0EjpcW6KN`s`W9CchkDvK9gVkI`N{S8$v`%{*#H81F zJqp*;$n<^5AErNtYgrHGkwA6`OLjvZi->c9wLe8+2p% ztT0Y3+MH!Qsu$s3a!&VrJ@MqBK4xUS;0 z(Zz_~bnh}Y_u~1g;MH-t*4?DVEtdOf@`RrE?Y-(t zf)BhsN!izDQ+H+Rg(ZzQUB}u2V2?UBQm_U9Ih(s%tJibQ6_6=Xbc4{JJ%3JA*7gE5 z=nd|hxcWpsq&nNiTaa@KJ=sxft2HXMF9ip%vLuU^e*E}gIMC|Ga;r;)9&WA91uJSR zLn~tBIRV>wpphV@Z&rpfsy;>7$z!J?Un(vfK9l1X{Hgb9e8!q~}XgU6C+-y(Q z&|7GZc#>)F#kj8)CL;P7tevKS{`B4?dc*p!j|x8g+$_jiqr5Ry6n{Jvz$p!2WunUM zYvUB%Og}AOQ`1FSd-4UkIzjdQd99mz(ho7B`(8%nK^ax7;O~Y-G#n8UI|J^$IuF`J z6;o_sq7Y;ScT~SU*$-Z{N&q;Qxe+VA6 zi7qaiFA=P7mga>*apyji+r3@#TI>;FyST)YAEN5)?3*~he19}X;PudFa8VQ#P{Oyt z?PcpvBYb0jII?VRZ!<8{`v9e{SBt#XvpT0ohR1!8nvnC#7JqGLZiZomukYi)LAREi z&P)J0CDv<8Q^6I(Esjm3NS#U00I_(ti$~REs~Y9`Q<-VC)LKHsp`_mIYQvWJyjTj8 z40IEL%bf2lm#uJIsXg28w7;0cZ#=M-c_NxV^c;oHl@9K0w@@5&giN6nL?|srW-CVa zmn|prMQaMYZz3Sa2|HP(`wx3#EOeRwQ2=Vrn6cY@8q)UmPNmJnC16fbVupC%dIKVU zr(;Y2go1ES_|HLLG^qDJT|Wx#0A3R^&+F3bYcD4yvS8FYMx$y(1OFAs{$Av5IAYc{ z$d#hsiYw)@8Wv%|Q~Fp)`u*sWYEA^|S8LXkmSs>0G3)ZJE)h#-OjjSe1SdT&VD{ug znu}PN$*kMP?04n0neT@XqxPc(?{)A6P@$_wG$J+>=e*R@j$=gm_V9iqVLsm6+NP_{ zLzH22i0D|GG_|*MV^57iv(f?{KSwQKXp|UAu*PJXER4)kQ_ZAXnw^(+d*0m8R;4{7 zu*M|Y+gq!sp&4fP%6*oSpLA|)XnJf&ni^w`nPA{nb()c`qtC+JW+ZpiDk9v+PF!D{ zn>3QlKttU&ee)R-T!BzK?2mqi(2N6`EcJ=R<@qkHlhXtgtN328Oqmh8?L)oASti;vPmAAv#H-4A zzeeMsUzP}sExO+?@ev$*fcbmPU*&^59#PCUud^>m_I}?WpdNA3<=bL2(y<&f2u!Kd zIZy7hT;n~I<7?1l;)!8%K(3|#J3TTdjCTm*PMke9Eqfelb{;ciIWHuL4NOG?u;Bac^?5a6& za<{&4d)Mmn!m5|oIMFiJrNWHNF-(iI+TG38NJ8w^JRxx_T!*2iw=wly_TjaW7BiW@ zlBMFp!TG>nM-ZuZZbJjKn@kJjQOJ;^le(?@vi3V(8yHvbJ0FGrJyyVsL>}9D`ycpO z^cv@8E4F&pk4uN9eCC(0OgdZ{mY=-`$F-ehMU+%)2jX;L|$1s`F)0s zwFU8sA16P|_MLoRoK$*oL}ty=1Tm2rmusE~CMHHJ-Xx6Aenh#YBR8jx@8;MZtnSI3 z5#rtpBeSYA_{)o$+gmL%9Ll%2t3M1PnjWjFTcn$6O%*qKVI?$Xs}KgrM(0gP?llCH z4zjr>iw^}tJp6wpKHVjCLL{M}PUyBBeJ1i=6lCZ;$75oU(D{Vk)zc#lOX08XIuo3` zpiSr|DMLc%4*u{po{*}(+qB#O5A*@l=cJeF&m^1mSmIFlTYdes;agrV*>_JNv!xgG zHks<#rx79@6rPqUzySr66veP=zjur{c|~ZF$BIB+2wDwTi=2k^FK>@-Igg>Xe12&n z{vy2fJ3qYLo=E+nMvf|{-gGxwnAx~HN*86E%W|qqVrfKIh1$tybX2o#sc3P7bq+f2 zIvYYy&#Ukf+YyTjz@KT{^Sx@*e!U_4j4H#Xo3RFw03|T;?#Lbry}5j`1)QGZ)R>T5 z01t!fd6OKqV(UM1^_Yo^8K%%JWw`v2l6A=A0``x$)J`O>{-6-@H622f%zA5i`e!2+ zZZ0QJf1ZVYBQa7G>x9Y^6se)bCh`|+I8!6<8Tke2JZO{78O28l%nsxo{t~tSsz^0- zrCbE8IE?q!|E!La`x|1KzP&y^^7d_hlvbqoedQ=`LfWPk6rW}A*TVDBEUogBlRl6 z2W3J48CXI-W@>sNM7ms~->2p#3=r9z-r5Ay+Gibe? zv=Z(b?x6W1%C@z&9WbC1r8!}mvKjFTmLs@InK4972Vp84Vnvp3IH{NkuPUd1Tgrnx z1t3*|hJ`ApiJ>3+EK8Um^{Cy26=57_)U*?OXd$2K1-HN}Y0pN>$igj$gU$&B`mnSs zP>=YWML12gz3His8H~D|%)ip4BT2_gg3-VGt0YF4Zty~fveYHsB(U-c6joH{?`Lg{PFS}g}wmGFtZlmOU~5gd(&dZ4&`&eHkY z$?JYiFFQJ28$0f)9}_7EW}f+u91bD1RdofgbTsv-QD7!?L+(4tl}&Q^-wNTm(syAv z;d~BqytKufCMn|VxFH6^I`*O&>o{tr!%vvd!)aT@;PyW;b#k7I%M?`_MENL*^fAiouZ+Mx&nLi74$e*9A6;!_a z5#P;;sxN-$$RtSqi8IOKh+6@FoOr2TF;Ftlc^IbR&@V$Zix4S9xQMWY$$vKNML*s0 z?QathnUo(A{BetMd1aqfSo3LRy~W}5O{GQ)7BHlu3%$FJ(x7fo%}_c4jXJ3#W;PHX z2i&HZ5M_^>3C1qiL$0TqS@k7Fl_f>0+KD^ZRmp!oX0y*nlsSxc^}oGf*pgJ0whA*h z1hXEnHLUhF4a&9$T7uY{QZqOV1R*B9A2Q-q8EaHV9Q&Urcw<6#Oug@$wwP~Pi zEHFG=M&0eJeNA@pE5OylON98(}6XpGvU;E$=;1Ojzg3)bqDhu zxk7C>lPgZvlHHSU0~6M#H`skAo{XUCuLdG7c#dfum3m*RHU&mCzqZHetzQ!%?tAT` z;kg?E%O@u6?|kcl;lJ1!#X_~PISMd)3Tf>Yzs}V&N>;frm9m>akge!l$l=Rz~prGhl|b552J~|?JIGob=@b^JTWn`#X5DT3rJ+yJu)G|VIUosgM%Xojnu{2 zu>x3{Hq27JS6bC{y>44Uk^eN{H+Wb;JYtF5YCTe#r{Ko|j{?=Hq!kK{Lw^O^sZ zD0l6d-0ke_`~vmq?Df(r2ypcA@!?G=9^U8?d*0RC$#JWoqY{o@>$3ALPb>^*CtPN0 zVVgiXhVB6RmfLLrXoY%i9dP1&f^<4RTs?GO_QwkLc-& zc|y%XALLEg!?XlSJ+CT%upgvZ=QPfG&Ff(_z5z-cZ$qVuvQN=wdeqhzVrMGz+~KX$ zth*7$9d&$HIVrQEmEs>q<{wI;Iz-O;d_shX?1V5TxyM;95)s6J6tVmz$CDRf(OxO{ zkgsJn)?klkS2|_JU*#wj>D=^_LrI*@vFYEZd2V7h5v3g$~&_;_d z@9fM>Ot^zF`G+6`Tq>iwuaErG^zyq~X`wn0f6fT?t~FI-We&U|S??h)yQ(SHdOm5r zPkHLchJTGorQim?*ap90l%njyT$U|EQz<1Q9htbCsy&h3)b}|{2W}0z%&{_tbHY#9 zMj0{@RU(80t=c5PhQr*<@1yWlkH975KWQG5yQ0Y9-!RAoTjfu3k{8tm+)#bE z93AabYASa}Y;LAU+ynPR_<*@RmlP1l!FXlRiKwpRdAe+Jj{(P?zL0Qw(cc%V2nDX)hScE0QF zMTGkTFm1ElK)07mlgb^@0}lc@p*7~9a=5)-k}Fc(TG=_dOe!fDwFng%0-Na4k!4M{ zhnB~#!!f;rTAUQkjiXp~RkqLhD|a&T?&=jivdcC!W!(u$gVxHd%|sc(59KJoI+v== zsg8{+n0ToRxV`KzyyWuhnq@h2KSJdgIBC>G?lu$fSnN8*N~q$S@aT)wKzsP?yFLF8 zFQ8RpVPeUW3f8!u=_X3Q&lyh9N#66>zop5O3f!JETV{TJ%JK>Qvc2VQ-j16#GPVAj zb6m6j69gpaai^G$&SN@1J{~^k(G1sArOi}>WtB1|&a;5%=;*U)*M4N-8iS``mJ0{w zrV~Q;GCW-m-|i)t0Mum<)&SNJk^Gm)K`j#%M(}Z_Y<*?GO_>>rpn3ZB{hRG=bDo4c z!5+TZDff4KKf%8F7<$86yQ>T{Zb?-kLPDH3^-J?kH{2-j7k*q`sk+CV9$8{%d%9=8 zs8-`5%b4{#`ujd7MPp-P1fcW&^c3^dlCoMX9Oy8|C1dXCu5qAfndpTMmZ{*{;@~Xn z_DQ?iImqf%^l`83&!$*2_A=S*K1agEbq%GH{JdoPGQ6H)8^uG%R>@uLmY~7q3*xCU zZa?cwXFKK@0gelj3p1en*nq-(zmV7f$ z+^B@3EkWcn{T?~o?B&1MJiymdZZg(>YoziMv;=}pX=Atc7-ZhsCE6z`)_(Rt5^PX3 z_m+*n5P2CIj=p$^(3U{W24qKh6jrvXhXn6;fArSh2^wkU=cP3klpDR<>Fr_Xk}FY2 z2nbMpy;mQv3SADW+&1zk(nLpZM+@daz2T;=ke>e9sPo!JSoq|p%(rFE7LOuRyZq;J z)GwGi9S+F&ORGvzWcB~`dLVzR^i4vPBPaKFVA4}QJ_(RZlFb;dtE(+uF{!KdqdJOoS6YNb7!Vy2lA>OjN|#fSp%dz0%_191a{yU&b>`&a z};)XvmKWGShp;&ZtxJfbH!qz z4DUn>YhT#+YQmS$QIJ!qd{03{my}^s)YU{ZpwOgKd10 zPeeAd+|`NDT|=EyWMX*G;o_rEiLmM8x_LXd`<{!{3laMUN}#Ul(BL`IArLCxiBHNK zE)keUiw|{V`H9KB`7mM;uFi;>tV%_NA=HqxWS{Fo51gwHx@%{Jt%C|jE35p@k+I&S4Izm;JH&Ae`yqPAn9oRAKdACnlh z3a(-7#=}DXe&zW8oaaa9?~;$Ir#ktF7_y_*x0_pol>?;~^P5$Ck1c4}EbUDTD~y*2 zcH_O6y9a~BjTVtb^23W-eg;$;bo#Y_+^Tl5u_};RnxyKsfnk66O8SQ}8~xQWt8vM{ zm*D|08SYvjrnuO_OxEf6kuhF5#mA=pZ2a&`Ex3*SrU<@;@3QNL+4|NYm}1K9?JzdU z3+PV8Di#d~f>pwU+FuifMYWPlKzQ67ktFPI=421)a{Td?Xr^z562Y_(h2yJ@ek+ZC zRO{k@-VpFJ9^m6dyrY(1$Hj8qyj|!*D=rkNa(;6oL$080T4?{7q%weH&L`OPBTzO& zUo$44eWow3kgO3ZQ40P>#O8uxqiD87YQ-v@1ccMmvoxX6Xhb>VI)vY8_xQN`&^3NUREb=? zkS_n4yKX`JlhGPiX&s^#pMgev?^FBhxc7jmOQECND)ftM>iMG}vMVEvuD&Mak6y;E z!xsBd41JZ@TJ<#@Zti4C!kFh-hvXy4NMuMU$O1D^C3{8z90Q_$wFZ#KmdZRL%%A-J zV-W;)vX89f@*kMqj46(D9rDqctEp|YHq(fjB(Os5-9ZUXn6$f}3v;f>M0NSP=! zYxj^orWVrhUKERaDv$;(@n&%A=Z9RI`e=>eH-SY-?r)KUXpui*25CF;hioVRkkpQw z((!KP*4N&OYe5}+zEN3BCt;@5XWyXehyEL@Q@aFNNWZ?~B!IhFQlFtqvjcQut_t|3vnIc*4N~}yy1@@&Mkcg?f!{o5xZwjkw zAcGSFbHlUoQ0)?h1qtIviES0I{$M9W>XKQt*!VW zudTernl()1kfQq(&Q7B6i5uRJ!d2<%8on!Zgtc}s6qA#~b_kI@QT~0q`wQjDNI2IC z?R)&W_@#!FiPouog?2hT7adiMT*;hY?AxypgSEaNjzJ`UdyTOzq)9B~cp!F)VYP-k!( zI=E&2c6;tVNF-R3OXk+lQ!5#@0L42N=8{^WwrrZbet+1WO`3E2X^P`owtABI@1+AW zpTp>by~DCHLGL*S*PT*#$DHk(QM@``V2n(F+W;t*Y{|{mu^Mm6>a9C-Y%sh@6?Dy- zUtG~ZXHNMOYKF(gSrGgL$3bhz{P^%|>2uD9mW+C}4$F^_Pki+bR#jPWFrfKOd z*i@CFwrsL>sXpYv*M|-djftnjgFQ|{gg^h=4mfXmzHmh*m&zN<&u6~y`+^#?rm)Zo zG#^Z;mERp5G=T=I?NlvF@?Uf3LE20~4Xnj_0C3X<*8m)qjD-9?meh~&cfvlb=so`*QR#^E#!aB}Xtmt&yZu)M4*D|5K2 zBw=p2ew5T(leiTX8+*0qbF=1BB5$t3-uQ;|VmEWpTu`8_rmW#D4~vWWGI5b?f|lNO zZ=T?@Bsx+#UBSwj@s!t%=a#Fx_$B)_6d{B~oDJ7qb)HSvYh`9$I|5$_M-ynhow2wX zL%-FnZI;i;UY#FD*DEY zZRy3E#GxS(6rBudd=PO8o1Mb0p;uS0q+!r^l!84}Ja8xkHWAs*%fC@z)OGq?LxcOP}0d<+4QulW#3XP<&xCMLJrC^GZS!p?%8 zFf^ELzaxjtcFfO{f@RPJvhB`97k((+ryH&+Lm4B3FxeV@)qjV%liKsWEay)kvsag) zq@I+hEp#v{K(uv(A>kdc5q^g|FB4ZBgqZSPoqf^Sq~l)tT8*1%674}({EpK6H^5_M z5IHY8A*anpp?BCkU`b9bdkL7kSbF0)o{_gnf6ne830KL<_ku-8GkbbR)SNErTtU_<*PU_Mo?!64fOttQa z6Ubvf&KU{j;XG#5WyTh;W(+VpCtWzb4MA+E%&94)So@)M%!V1~3ux~@^Sy(95lH(M zT!;|+2BWjBpA@y4^H<4NHYDV7mNaaCvK%o~A~3hi%59vFkfv_VwFXz)#t6tC!Qr8- zz)1+yIHlF>%p5a(6vS~+;5cmBq|n7nTSkS2kaH3Bvz5Uo(X>0iCtUk*`ns7daupPjuOP2f^hgMV-GBvN@D zSLeF-nu%!x*LmyYvcKuPr+cdVyjYxivcl2T#s*ecmC%nzP2E;yQ0D#@*EXSwZ1faza{sttrY<{pRVrSt(~~1Pd@Dj z{{X)Q!a7i@9=W?;T%GNf6cr7B7_r&iEl?}@+2Jfp@-NVf;pkH2rJ3VdK1Wvo>zO*r zkqBiJI>e%=>#G$68RIEjaQ43;X0M5Omv=Y-)Mw+vMX-9#Zi2GORD1Ee$CYsXdR7QB z1u-c>Pnoz$0`Zbs^jGcRwkqN_mQSpNNoNDc9fG8ySa2?^`1z0aT0frfvS-WYvDh41 zW3TVJ^$P4rhSN^2L+rm_dk!|aJXB`l*uGJTmlktrUt$p-_1ykdq3@<~A) zGDX)MO;YO)8Oi0_W-be1?ai-MIt9CGoixOrwnrgWNU4>JC}9XJW8#Ea{u_h_Fwy)@ z=MZ)M!J!v_bwT`M92*+?gzjMPOmeLXF@!)2KV5ujC-qTITjx5h7#ta|HXp_V@h3!_ zg+?riAc)4Q@1)xcXzW`=bH*&|1*%2Z$Oz#t!jVvkdpbLBn&jRRCi`5h3z8)y#4$_g zY_IH$mdI!3nA9IkCXwB)>3MrM8oe@&1N19QJhFtSuls9cTHet_7* zsJIkGgSq7?`hl5)FZb3$5&Xq5m^eA5zw+eP2E{f_sUsHmV8@7MxCs+K((oV47bZ53 zXz4;0dmPCZpXP)zGlffczUs#;b3=JXLNW4k<8poAOo6l+tq)%`Tf1x;~Zr1(G+A>rFD4mAQ zzY&lrLPW}puKGY@@br0EPLA0g4C>K98rg0%7r)nZ)RSke9bG7Bm%dsYDv}8Tb&7CY8-Vv z4&q4oTx6TC=)+Z0v=T9PN#rOLkU-*XH{ZPJ-qeUnto_ap)trS=Yrkm#GtXYKRRR%vT`7cLu2l~w%YA$%$E1~JbGiwFPR$V(W_#57KMpn&sYL6 zwg<<@g@^smdi`m*^`~*ed{H$fUgMm~G=@K#nfVppD~7D%Ji_O&!!Vm~Rge{(C;e<@ zGG<&s;>#75>b1QAbE0^J1KQZ;&oxPAGdNCT^d&YVSjK2J;fGgu>rKw*zTwW1wKV~M z^v%tk+y1mWL|%8n_@AU)javxOUF1=(py}@`Q*zAH3kzV!u8~q1xbMa-s6#fNJt1A- zKa)?<939pk`s(}q8@z^^+Lt4Y*zdWZ}4M*12(TRyM%gV{pTIK+e!v{LXW3PWD z**2u97PQMt=P5@V3R}-Rp8Wd$y-BVAzi3$pZp3ZY8=Ko;mH|%ZcIn;+z{YK3(^(!1 zn#|wiiGg%s07GoL?h4J;dg+gz+OPG)&f9eLqLe0P_HJIMJ5$S8WU|HyY}{9u&USzy zl$#@_=vK5}+D^tX7Y-uh7lO!YRpq&t#Z*f)%xi1F6A0O#$ITFl;JVA)=XV6%D9P_z(;?^CwEV&%_!D09FT!_{%OAEISxp66sSw6 zDK)aAwq@@IBi72uO&XoT#<<*xOsm)iIMti(@EQ^TClOcR~SXUHuinEOB5Jtq{FD4<68LvDQj+PZx& z(K9SBD?F6!%(WU;oruRqHOrN+HD=V0p(wt*`?j+Q?G~=IemIhR)#lUiYhj`B|BjJppbTdz=veBtc8a8e3?{NTO{+b+Rb9iQGYGhRsW zYde!?+All=P$T!OOEwC-Do?_}S4DacbK!|5CcDIx={;xt*L{@Y)`yq=_ef##SsS-F?p5^`3q1U~0?SG!8f zAGxn~+IF772H@JWI?3i_b?I;Rp6IN1p}|IVVkUGzzI_Gq;%3n&fiV5Bwpg=~d6vMa zV1a>|W$TAr6B!a)volvKe4dT!WOaY$2BivySI6-7`gpU)ELMa1h_xibE=Rle`mFMH zth7OC5x4ezbSs~a@U7tKk@VdL8g=onrF~?ImjO0~Tht22w`=o0BsDJm{XV&s<@Sz~ zr!Eo+RSi>bUY|X0pH%$1Mi|zzz}v-KVLp5yf*EHW3Phdc>ry;?8npo0YFRBq*1@*d z-wR&0e-*#1`^p;XG|J)?WEAdl@j;iBn-1%pF&6BGS zM&UtTRV8wqfzIo(CpRbXO3;ofARw^BPlgVWj00QSE1IQ*g+ikb#ksaPN9kIfH6$ze zyL^K6sz9%2B7}|BAxm^moT+lwcXzm0MUVYuOz|8f_wqE;)^vzR3X4<(nWUyZpc}gf zSu0t=?%Zh?2GChzN`z76yLd7sOy_LSe9Z6^2#Hl0l=`4C1uq`=VVDS@~;FtS_^1cT?K(=Wp!nUG+Ebxl8v+ zJtuvS40YUe^^C9sD_cE0wCkA0t?&_AP#SoRm(z9gc#%d+tI%f_567bi8^g3dSlSbUNF{J%{~9qU45U(fF6w%_yY5yokSba!Nd>qe50hSD*R?cWJa9vR?JBr+2+bXD| zq-OF08?FPo&D(6^zHHw9e=^FJo+=p^0PJ;EwJ3g#{=Qb*2$+=B2WP}%i@OU%gooI{A~D)o=jZ!q zPR~w8MI%8uQd_(VrsOw{Wc#lB*qwj0n1}~9oc#}Un1hWqwaj0J^pO@<4(1{RHoA1s zq<_=S8Q}Tw>x2EXBSgyvk_u4YCbz69XgrG3{$$7fC>k^kMCExDA>PY}4<3BwO-@cm zhscD7@9x^*+JaMDnPVH zLKye9gz@t$UxY}ek^6gi{DGv+%UqzT4K~HhgBnL%GU9=7r^faJdWy4L_k)S?@VOp{KhsKt!_i{q05SW12c+Qt@m1l?nvn8tD zUgt=}zZ)8tCFnvvp~uj9U_c&a1B_b#^5%=n+1s~FM%q-=ry<`iYYC@wn8jM0YS|qg zDp(h1W_{Yj=yOITR=)^NTQ`q&<$8182h!EY=(6WM9%+s#z!mH#c&wP>7)6j5o>GIt zu!4|3I&(O8{|P0a4_If+OA>BBVZpgiZj*fw8}$E%6w{be^7G38>yd)O{IYeH-2D8{ z{c9RMGN2KwLi33IMQo?`5B=G-q{c7ZE5M$WZ-@mDwIFc!AL16`@e=^A<}r52FE8%~ zv5Q_F?(Qq&szVd41Qg1eil+APOl3NN8v_QJ3KF}|b#*f392=XM;qF|#JbYCC`T6-! zC{h?IEH=fl==*+jJ82_H6ZijMyBycI@l&nEsG~L~yAX(xLaQvMy4)DFKyc7t{#nYM zM!|5Qj7OKlKvj}TLN6U*qWYl1Ud-Wu9m09D#Eu3M5NxJ6)JujX=}JBY>I8ccNf=& z?JEjY^5V>_QluK84>gR)r*m<&i>%K^6j>m}K`$!S#Pu^LNMy~;%4y*yO|CJu=Svh% zk2R+Yzl^0y8rAIO>rTx;lU|XVABB{txGHO7y2(%tsvFS{3~Lv|^Jy4ya6_m;@wOlQ zfw2?aL&j)7ymC(XoIbnv=*f1<}U!JkY4_Ivj z^0`eCgQD~h<~W)@U5BLLqZ(?Kym)54%hokL6TRLD7^(HQ@xej+<^4fW2ott;Uh`{g5SEKoU6Wb=4!Ff1lQ52~o&X2E(B3@6Ua5^77nm zZ>G*xbx3-+NLg4|*h4e0m48NHy3=?lao7wZENo+(O;^D7hONCah8UHWo!xk@@kXMv zTpH>F%*Y^nFgq*D1jYFYF)=YZgr=1yyP-(_RRpO3=ju$y%A|i_An`btK3CVjsInW* zo3Sq(t5TPLq_A#TwI8yD5N@*y6dZ@uHKY!-4YD_+mwqqHW1+FgQqAG9TY!6;%uP=8 z54_^CX-Z^Ah2*LYwwUe%gSQ(oOx8p;x@b4A3kb9rK_FLoV3fk!S?*$Gb<&F%CSLCB z`mF{aCfC^|uQsIe_{ENxI=9ntopE4sW2;Ivr@w>U(Let?JPL!<-HHY%oxQuOOnyI} zVVpK*A>d4%Dt@z0CO6AMLDM97lpr!_dA-zx=BoZqJ4|~I`U+6_06B59nt5)*$V|%&zl7;E4hI5>Vkzb%Tyy3lvjU{bIdlq%-3euJMZtR$^Ly~OdG^@FPCMHX0= z(`l`vvpfc(QPu=;BzjkW_tFul?CIh#(ed?lxBpkhSgHE)|4RHKM@JsRO+p#3TItMz zov-}`#;O2rp?|mGs3=Kc9YXTv$#?ic6jbW-3 zN=qnDRru>%Ovd>IB)2*@xVKSPPk@rm>zCx)lXIeyhLbKSq68+b#pP`fC_6m-2H*i_ ziP)<-aDgKk02Kk}K1qCJXJut#lm@`4)V;i}VcDjkG5GyROMUK3;Z?eTpw=3S2O{S0 z1*%9=rGgPO!E5wd#sVsW;&|AJ%QH;7_q7Vi1eKXmL$x>CRcWx&2nfgy22o6!v+C&U zq&S;6YE!B&|Av$y#+fL@g|y7;Fz{lmlBB9R&(1W@aqIRg>l5+#jIb%gGK8<`LPMx| z+v}I8sh+`S-NzcxeRGh*?q{Rz#YIeP?DL~LZ)286cyBWIUzUue?*0A6rVA+ZTxNdu0O? z0*tZO%#Ua0KnZT%_wV0hXykRFu2LlvfV8qur-s^T6N}vL2j|{-8Fn^O^}N^B&B;95 zfc(7I9TTB?*6Puq&~%-_1mKhhq>uc9Hha*ooEB;r-n#v3r9yXy6`)8sc@PT9vb_=g z_LjCT_dIMQCB!4rCJlkZ3vlIkXWf!oHP-XhP7SIBC;P{)C*$$s=2bvEkL>t|-&@ii*e(nSa+GEiur$q7I;`&jRw-#p zCBzs^EaL0UYz4$KkAUHdL4n5bPB|GFq0+nW1qHo+7y>`mY(X8Sg(B+m#mA@ij`r8r zp@7qC2Ug>f`VPkM6q%g-Cy1l=KF{Z#$t%gPd&{`3{gk~Y#+=-@l6tcnsP|@_)QLN3 zJmeStVW&;(QIcxGBN8n9p;+Gii+Bye7;|70;oZV!(rk{yDbJG`rF2!{kM}pSkK=== z!otW1n@>(5K;s)~PqjTcy!;0|xHnZ}L2rrD@!AAr@>C$G)Nc)3wtvYW#XK;enDL{| zUr~10yE)k5S|$~}n=Hlju3rqNxLCJ0M^Vu31@K#RuAfe2GQc0CTzX7QxScAKN-}c~ z8z|G--3ocj&tEuP%IkSVN*Wghw7Ph->|Pv5xO*I2b|P`h5SZxSw|+qu`VhhY(=-E) zVHTFC(0kllPx8u|}<3fQ5*Sy*5` zn>8UN)H)hSX{MxQ99dd5WGrjeJ2~V)c&xifG&1^T8*iX7Q}ypXu2O3+5S8Bu$-@0{LdrzXBX3P1Mqo zy|%W{Fa!_y-%0*S$NxUl-_U*;^%Y@idL|_uU32)#Ps6ex&-jltvODGqBrXc6G`gOx z$4Vs=HB}ss0{vSP{-wqEM{*8Va*d98m2}Ajb}%JR+dt>~JL^v!bY@*r zk|%Q@Z+-P!JxL6BV#&L%_gkjM z1+3SIN%THG?WzA}ccPCdVybDG-k34E+Q*S6W(i+;>2hEnuIY8V)BP(>;+0>**Yct9 z*529_!tgcwwYtQf@>}mmkp7U*a;V7YqTe8;ALb<}G)gKn8lAfHPu7k$Eo~a3oa-}+ z0z|T2y=u_ccp~zKd{17;0oquV0H}W+R#%^*Kdw*;)E*>rnaD-5Te(jkTV7mWUY{Pu z^0cErsnMgCW!H)cInAO@W5T||)ibTOp|{r211X2|Oej67*XIJh-a&^UaB)Ah-xvOu z4GzRKRgf*>`(8HgqeYavHe@x8OwGFRqnPHERJxpgeC~x^$vvUvR0{Qcz+vtrsTHbO zlt?1P?kw>#R=)X*oBRyZ;Q@vivPx_`F<&X)E9(yESS+aCSnji77bUBb3ftfPw>GlJsb$TGsnyHl5tpqlxmXWRUZ zH~Bp>rjGRu@q-H|j7;?S_AZZtB*Q(QN(%OD=0q6l^hE_X1URExr_2d|h)#_nviT9Rtm8KKh4XOxoWT(f)C51mRvCj1;kuJl} z@sUFDooe(~2G}thsMMW-+smY5B~fSH?j@<6uJ>cwjmvlqpHT5Ij=X1etgecvM=FF# z7)}*4O+xk3j+HxU-@%|%4Br^JV%p_XYVdoNzV_Ub*l`Dl0LO~o*A{$nkp#P|9buJw z?JVb^F!2d3&7j_wa?>eft*yOPA{^ZD`I0EbiYan)1GK6hiEN0#Hc`xS`cY_C zy!<>m%JNwOek7j4pB9InkabNULvp5QI2WiYRu#<7jwiV7Ws1!_7i8ihqgy?15m?j6 zSyXR;ZNRtQ%z58?SV0*NEx{mbBVMDRU@_WE^cYbfEh#82EXsdhK6w;ZXlrj*VeS%c z`};)IPm9nZ;Y)iOI*MEd&ZHy?ZwuZLGh;N-{p*JRfmA{j0-x%$e(R9!37a}<&1nz2 zq$_wr;UCtBcXHM{{G;tjf(U^qu2hjKeExt2tQ_m43QDqi z(KGZ#iJOJ40;{rci4Mlt;IBXcmuJ=}I`YPN*J+;0yN zW1KEG?p0~ZQO6X`>WGrGDMr5R5ZKvU?bUaXE?%{(g@SG8ya$1?>%sOA=zO3953WI& zRBB-$%H>2!OD0CMh`uRKO;HmE^EpFh70s77W$ZD4hn&SYX){)ugHTSmxHekyw(H99=1Eua(n zAsd^T1CE=d`V-$beRZCKXFcKpP*CdOR9*F|t~R>cF!Y4j$py{jci)2OR|<|(b-`EZ zWzvqjXNQ8LCU!j9wyy6|3nykboDS2iP&|1V_k>T#{qs zQ*X6Y-bIbh!IqXuIkXo)e@Qn$awhY4&-wx_hzAoJUlvy+nC2-A#``Yrncf>d9YrNm z3plHgQ*7C@Z<`b^^D?XR`FT8Hz}!;EP~CQ{{|PM+PQ&axh3A(Pi6DOiXAgBbAPl=v#`=~=y%mz`-uQ65=o(R(Kb}Auw7}Ag|>}_*03wV!}ZGD z6~oRR7RL)LlX1h#5by-vO=Wczld5K!f zzcuy0u&z{JCyQTNTijh+6mV5Ns8~bQ9b9z&Z4~+6Z@MQ8esGlouWO~V4$)AvM@;v< z{=KToO(P&=Dw zMnC^?VS4*T#1XB{)o!O~LrrWv&dUVL2sAwTe~i}O*jtyJj4K!2H+mRJ^-{(L^{Lf{PfoNpEo)Rq%F*;JiU+gSc0`K|1b+xot zy^Q{rNma`5<6X?3x*&Ir`!0C^09#pE8C#$VxH=pi_?GqREVC}YGHKQ9Kf0c_)B4*w z0PMbwlDUrz+~2U?@dCAZpLMV0c^=}3miIiod{mT_nana-Z)uecsUTX3HP%!0?^`}W zk~~|M4UvvIMIvxA)kXaP3$Hvt9DCnoINda zipJ#|a;j7sf}U%(H`bIVe|+(TmS>WEC-z=9JaQ8MzW(dCLxWeVy?8T8Gah@3YrJ)X z0%tQ}eNN3K+s#+^1sHN(+&FfW9d3!>_I4>Qk!*2~Ypx89e|co27C~)QR9sT}j86gG zd+Za7+1)90#4=>)S6HhgL{v>Kfg|e(z-UQdGu$)vYPt=O*VSp-;PZERLHXq)xO5TR z#|wcI^R7BCp5~5k)z{YpW=u39F5*|N8x<^qG3rtz`*8$20_sPiq6QBLlD;(@`N|B% zXBpEF3s$&A9Sto$=&Y=yA1z6_yc+6}q=6c;*s()1)5V)8_P8xjt`^8*um<4ME=zE6 zjK=J<)1QY0)B4`-T=wGgQ!Xl@B8k!JYEk3#Hu?^aL~7E=2crXVOc{Hb6!@|&3pvY5 ztDmz?eVbou2Ad_#FTU6HV$MAdq5NLF{$&V#NHRi#+T8xZqQlyN zo5K`@)a!h>#-hpS<$>(uj}RQD!*31^H%MXbv>P3wyk0YYzeqKmILxN8mFHNYhT=|& z70?emr3BUbCUxZ(Lz}clp`WY_3%xu-IBYDABZcR%U9&$mRa~{_xYW?Ep0-3=7Qfb2 z)^*0F#;KU8U?a=J(upHM;zxkHBgi(xJ7JV$ul z+VN}cgj-kd5;lSzLL(7L5RQ0nh`xmW9j%e~1CdIZ-_cyjp|nxRvHY`FEOg2on3(Yf z@?!kT4&+s`!fk#bG7h4m-705!gBAUKAzfX8CcC7HUp!w! z-qfqybD)8%2FP-}r}XPCwFO2I}DF z16-)JeCYkQ3f9|n$pYJa{9QzTC$L`kdIX;#4BoRVvvUv01j&Wma77dO)V#br%+PkS z3=yEu_hZ#QZ}!LSZbNmaSm(}cMNMX{|KK_j;v;5v&*A5DD$!q(%AI3 zi7z36ia7f5zIlJbul~Ec#?`bX{iM-J$?ywu;&*3BzAegWZ-E}|-NtZ67FCw9vGD^W zG*8FHj6IS)7kn(V;R*-WcI978PE4P(+1JiJAqRl7U=QM6}roi5WL&7PesYQ)9|M7 z)&`FiX^q3I$&W3|PAph6@rycYUW(QARqZn$qCOmuEKUN z^>1Ai8wjf`ucl|DovCtA11#}iW>^V19S1gZCkZ;evRBO%Bk%6-p9LhG()K-Da8(Ed z;!+|AXuE(0ObVBQ=1N}|=){bmNblnoNt?za)s2lI>oL|F&r3d=Ms~-^p>;f=LH)8X zF<+W5E+L?vn*d|*JKwj6wjUvHP^a)VAcc%Oa+66G?HX8V$?!08CUH&L)3Mj7n5oH9JD&w&>ud1CtW(@j&?HQtW*P1SiJ58y2!kOZ!33W6OBX_IJ=bor7i8(M8I)&uOT?YbtX!S_s%I&SEk~_q zLVZ1biI}{t1|KDr4U~@$HYVbrrx$ps7>9&oyHTd!Q)Z6=JIKV?WF}o)eEeCvi5@C3 zhwWl|fTv({W#zjw9mG?-KzR9LQF2Ujh2`c;6qL|_JB{2;+2+fo0TM$@R-^bXRX$mI}6717yUXM^C&hVL7%N=DT9@wUW3fvEc zC006CnhN5ze1GiBqIv!3V!rrB_3Cv^@MBEC1~{`O2T653eB4+=(?)Z>e}utL5*hsI zlOGU((AB*u*(sf*E414NE*8%ESYu)2V288`OHJC5v(WT7i-H zO-p`6N7@ktd=f>fHglD3mtmV>)p{wp45QKbJeVP5SNFYQ*dXlQZ95rKT2qYGL4FDa z`Kz7--8c3TLY{4f%Tm+I%$*6Paul8XQevEFv5<&jyXw;<;$vFO42->| z{^0I*lQZ3^hPW2PJe4A>RMvy6$!(wh!JcbAcDw?IvHgm_U@J;*lkJeqOPZytHn; zW!`Bh3uXvYyK*)tZV0hTeUr%Tld=|C5*S(_)8-#sJ6UT@^JPuorNSA*%h2{j9=j!w zY@?6q<{_3>vp7Gt+EhHJ{eEuR%46Egx2bP}LS4>re@sYnz?zKQfFh=D z@y?;r9&X+Zc4YU4utKXstOTvH@UU&d0`BKJ1`N)LxR>~TEpH3PXM4>~m&{a@b%yhj z`L$f^+OW-4EUfk(nHiH$zyb_DI85K?Z@5R|{9r6!6){Ey;!<|)Sy|;HrUA1P_lnJ% zoHL#jiwhw@FY;*LU!aTW4(^(oN^r~$bUSNwc_uAxqgJlQ4S33JV#T)(Zh!9oVrF3I z9T@QTJ~-Ot8wIoj+r{jTjvE;BcTwM>a{1oS3o?86O|nTy@Tg_&34UiU%Ti$*VSo}n z7j8y@YsPBOh^O2`rS9E7kKB*=jWPSU2LL_I&z?O4V0JA&t^OJ}CLk$ycnD)5Lh!IJ^LOUUExH7`ZANUvn|X( zUqTG6zX}XtOo)~c|5_fF*_^L3QT`VF4i)pLqyY26Nvzfb=`W`!NzkgZ@`TU3uixeeRzlZ@g(34u8D>f{#b|1-<3dGrt{&Rzw=yo&N$943Ljd8KCu<(d-8RL{* z=JC>|rdznsogfg|0IFrPHq+C4D90K|^5E|0dr{j5Jie0XvH2d;+-w5&xaPHl$De{^ zcO<&0HAKgTt325k3rllCOkIAyLTRG3R5x@yj1VqILFdtAW0VY0|G+5x++agt;({2+$uo%hc+BP+%Q4yIykg)Bo z7u3w>m|k3VY3~gK#%mP~2BAob(T|0Fc7o2zb&SCHuXKs&5k;JAT*=tCNtmHJnksK6 z)CB~NA4@Wv)d%JqbWf|~s~R^npzaB(gnkJ=&ek(xO~_OwQ2)*>RKa+XyS#Bhj6&p= z{1qQHjx8uSOtzLji&%0(z~sHFi?f|>qqCE@x3{J_tQ`eUNd3S!tL?DJWp1Q#voQX6 zE}PHoi5SZXp1@oJI+36(Elx*g=U@suBzVbSxs~Fl-8&cdnLJGe6XFv)j3vlpcqYXL z%i@iMRe=m7E5O-zv;p((kKqk`t?yJ&Q8)uL3K_kvqD>WHJ6FxkSxK-i9MRkm8HAU&a*t7F&+!-*4$9Ub%g7!3bcWGHF7jN27E)^ctGqi%S z(^7hf!lJ;Z>qR9#rJj*nP+0p^3*sUC(s0KLg_g*oR|%cZe_*)(RaxE7p5B~TIVY7V zsqDB2p87qqRzDLtCpmF(aR|nvNN%^D6(|(i5!j)N7IJ1jst-JsK|H4WSl)nv0E z3lbr3D0Ki19??4IWbdzExSd>1CTmXPd7+X}?Lduvs@Xl{OAS{Vr7;z*ue#6N5FI&h zDWKSYs%?(pG5SrHOAIa;F0(nqC;=iuKFwBI)u2jh3%ykDWIP{3&2#ehfWd3}_(a6@KZo*5t>anVKUU%@fUGvoQZC!_Bh9zIETI+J4T z201_;fsIsX0EWT)l|fThGS&H-)$P|~lm&WE57P45K*LKk>-Cy(NbNiPIg+#8|tTf|LWVx~r~?^StiSSrgP&5mMSeGej%Db^9XE~pnb z6L7pAQS8yRzfk8hf18uynqOM__G}jrt7T_rKab$rZHaO%;hG)4U8W5dWjS|0>3>ncqhJ-yU~Xt$jWHk9ag;1(2d!+Z`xL-l-4P5{9FF`!8jx?Nd5-9{zCJM9TA0e-+&bt&L?>`gX_GUBqhTPl|91^aS>(8}+3^eQw1 zM+I=<93CDvdYlGEpfh!`3~7Ckw*R~q#K5aoi6(w0c$@I5eqBF!Fe=sOvaYn$cIdk> z@Pfbv-t)c3)3HayE|NOwYIri(AV|E$3+wsWq%y9=*e{UkAfo?4$ogEiRc0+#w>U4J zIq8^wqOyO55i6}IiY7u~n%i<=V@0OS`qVEWOwh6ai^XzBmEE@aJubDbwJinCpO{ni zvgbm?ieCP{Ee^0SGf8w(H?QvP(HsRAI|s$CXHq6H`Ud)`*YKFLwZp&Kt zBe&nfOW!Yk0^X159kDwSQV_7kr;Z1+XB%85-c9Vg@`E}-8&#j>tu0u~L}3>J;IM0O z-leBwUOaFmOCyUEx~;AI0abHp+b3+g-s;5#suPltHuKehxalJAPLS#;aC(+JA}&iFr^B%(fh!=$867>Ga^qneHp?xxrh1ord%D?YF!g9X zhNYdAKo-TJpiI;Rl@zDLoX^C3ovM!b=n=N=h-{p&74@qR;t@A+5K2H#h8fzda?$N$ zR`Sj~LPS*XeO-FlFwR#44+{;Su6JUX2;1ISx?b!gjlkz!QnlF2i<(@9%mJW<^ZVf~ z8&wN$TSv$1i<;Di2|fI#-ar?X2mDBd*T$>BQ7Hi~uTq|)gNs(RXM#xDWSticTW+fi z&$hP~9x)auX9pWm>*{r753JlQgQOuQ0Xmv-?CE)58l5%G?gr^UTfyT8Ebs8fJKeXoPYItaFbBDaVhLYmc$4-0 zQ@r1}*xt@^d)%r}FY{G;6_DV2-gxps(`>G)cdUg1S??mOHFOoTQ{1tJe_;sF|3MkgA$1T576Q72mXdlL8R&L17I`$S*QOzd;Q0V z{QJV6*8i_J^ACj${r=Wv9D4#nU~vA%k|0xj`KPUqe@nvuJO$y&|LWg=f<=E{`1iGg zWZ3`s=D$sEXn-jn*L2#^@*rpk=XW!I&-pbCm!ws9cirJcs?YqHho-hRR+X89g9H2R z9|{o+MhXsaw#Uld-E^cr=OJq*fK+?ces^c*lj!{%*<^ivefx=gHfB$40L}A%jOlns z^W}2}msJX@-KV@fI`rmS)A6_oJ~yXsXl#8mS2vNo32~!p($tHBWqb&)hTB6og{KEa z93{A_+M!aj8l!K`DD0D1^^2oSro00#R@E3EaT!zdSMocmtb}PK<4snXAZdmK=NDL1 z+f1j#IqPbY#daHtwJqAFS6hnp@_#GFHKNps$jhZOW((h8(h&`m{erv;!?Q3g=8JLL z(X^9@fks=H?^$#6nA-YpHkT1DKL2wwYvGOcD@G0uzM4h(1qFjWJ+MlRuu347!kF64Hw-@*>T4f9d7Nfsa3Zor-p;5Bm7n>?`aXxg={ zn+{W}6sqYVEMQJGXCAbOw z$Pc~}o>5>@kLCY$M6h4oG3^p_sW*n7dk z%OIwkh-hXmFXAkG`6(E$zn}3^$93Xu6>R}asx@QN480B4OLlITQ_Nb7QKq*Z0!4e8 z<}wZsASPtT_yZ36BaC2g{ykI|S~%J|C9h(+EoUY*DvX=120jl8T`d*F>aix&`VlQq z<3W6P@p^Fj+efxrM5#BKWudmO)4txBEEU|}3&)5r(R%yt*rjuDSDnL7N?cB=0?IaK z@;SUqvH0tAnYm(1#nSMwDjSxfp816Rt1jW?TH+(YvgMe&oSMwE4SSuvN4q6kzv8|q z^G))jY=7L8pw@PiOE?y>3@wz}5zs6$XOfv?A!hxu&YJsb+fW?F)-dE&pF=Pnudw_( zEd6|~DQNf_GBa032L(xX1n`RvJ}OstVGqF1oKQaFvq@I8O&b}46J;}N zz>|O$Y8?(u(cV+z5b|UT?H*w~utU-GS=k0*b`tcPW^cSX&K_m-+^_Zpn95VxYlrop zdyer{LTB{fm#&Q`GITrDZDP$ISUQvymaDsyX%2dLG%XzJw}zEX3!f!h9fW97T{*)vwjnp6LC$dAwMi-}XU z8kZ3TEL|_syivLm6ZKz=}UtOwpVFr4a*tni^y+5w{!WgSL4*$uA zS=B=b=_%GiOYJKwHL|NUR%KoyGpLGxGDfc=C;z3*=Tly61!hoZ#TgFTlf1^nPy6!t zznAszy%weMK|vlOB1^eLietviAzMt48tP=ZVz4iShzYm&9+4)P7#mCMTI2G#F1$ZJ z_*P#25|r```lf(afL?jNmPD3P|L3HPhRhg`d%(Kmy2Xx-O#rztZEbB3t5VBSs%rLn z?V%v7t2;Na%U7b)Q2dTQNk@CFFX0(J&SYbDZf=zI6m(U)r>?%O@s4f zIv!XYz+jh?;#JdAqrugRc!HL|?!pz+x@lXrK9Dt69f(+cx-Ao@TW7B_9cZ6mx&6xu zkHz?%G=mEL_(VaI{h2L%2;I*$|e6os6=f zQe*mcbLdx0ie;KcV@GS#QIK0L_P|E0?1V7v3Atb{=BcyW9U}$iDhz|xADu%IstOF+ zVo)U@4280|S`LKiyfhT#`mCJIvpoG>ugvgXLi#ISk2MC-_b{ZmUDn+R-0ieUVV~%_ zudY%7K20F%J&uO1sKwRM-T|NY`Cggn-?@zRFv9bA_|e+^qq*BLqLGTBa61WJ2)E6+ zBe3M0M@?i&NipSXQbf1%?ygvzUip3{yBg_!;xu9GYSG%rThokLW&M5|vCOCQ%#9bL z2A6lMG1`RsZGnotxNAswa=__nf@|!Cf4Z#0x%al^6!K;-;ft4I*i_x1ZdwLMU0d;gFJMG$QU( z)zxMF<ZlkRgGxqH9cN4^X&es(R&8`MhBTsd$;ilvk<9#xeZTQwiVs_6F?-)ImVRK-#%MTyZP-kkF9arWY0T+x}Kv zmRzLVTC)aN3?XMv;r{1hjbjpuii&$DGmlW#wqxhd2eT_ozGMsW%V9@>Y7GZws*`P- zrlq5c#>+hJOcSznK%DPgx+E&(GjEdOmDsMIEW=yl-0uP^Wo@Vh<&X@!b`%l!LVX!_ z%q?1HuU;VUhD{~SjL5`&f>4YV$7_R)eo}&)REV6bCWW~6`^_|iMK4c>F|mQQ4=S7y zn?1!Z{`lHXX5NkwySO|ppPpTK!F~Bu9XF`Jqm>Yo4q_hO_wb)_Q&CY<@Ku#QR+{Uo zW4tca`!Zp0-3z#kFr@l$6wbwZA20t_LC?+YpM67lbG$s*VYyt=d?D?z>gFkSP9zgwa&;4#WdqIDI*d>CHmaCn zP@APCc*^?n1?$3ieEbGy#3Cn0X;p|RhycU5!eEtDFAo=a9ZXzGSrAKxen=C}@#xHQ zoaFFw;?Pam-I9<|TguZIy)##l^W)f5k`#J0X%rV^&_mcykg7xPM zDuhxlviOa_&$TC1t<>XqhAKwXFvP)^YoVBySD#Al44U<>M4gf-l}u&=XSq$k%|UMxteEhJj>%Q1><9P+8OmZ*YU2)+}JfCxYvnefPfY9(y83K zSb6jw!Ap;?zE}F^Pa4KxwiEb73H}#@!BVqEZTbzwNSKe;w0iY)4yC#C z6@dtSjDykXjz(e(E*emrvs+xYK8XVzv+2!eQl`G#8MMB>YLT)ntK&xPczJQ0P(khl z*8@bM3W68@UFrRAcVRHt*jQyk#q?K4dwWzOZZ0nBY9dY!Xw|e=gR;{%@vV+0d?lHS z;iJ1=n|LE7$x79O6x4#uTKgm;hblKV6_i4?5QupC$s$D{jmBiedNwe8LZ<{v@2p@U@(h~(Ha{UhZ$`$&4(Ad;WG0RBd{-?bORGiU1R`jHo(Gi+;<^K^E~)1RCO_ec z8tlQr2A0&AFp%3KGIE;M_rW?S%0^_NFQ7j^T8N*w*1~;uqoZS>qBm`!p;DIK^aZ}- z(5u76Y2px&jb#G)NMKp~{Uy6FcmLR1*Stf0sN7H==;98~GP(De(sU)zr+&d6HXtkq zv@EFG=4BCA*Vdll;zVq3P%oiBum^>6;DCE=H4InK#!B})YcNufgIcZnve~)Gc;+gu zA)TasYqh2NHWVaLuWYeEL0*9sJD%@Jjw+vk zv(IA`{75XJzQWY^86vt=m+)E~@YTI8IGi|yb-k?X$Ak02sufPe{}tJLEfy{(CuV4F zo`1DHG7;~jUYnMtOIgnrmfE^l=z7=4Sui1ZGge`3T|6fWl|&3XJ|*cheA&R+kpC%| z5!OG?h&5|}DbZASn^aKzw80s^@}3AwEs8Q>=BP-Eh?nMl~FmQ;1cILnGu z&eM!xZbx+{XyJZ_f6MGpY+AeiZ8V{?GK4ZA-A!wTrNdI*a3e;7(b>&O(M!4i>yLm_ ztcm)Lt;tFOdKHF>3`p1BV>he1!u&TccgVIjyt#3w+h)ciVfSGaL>;&g+{ z&=SqaD^4vKAx|-T+hnuey;zxZxD~w#5NQc%!;WSrrA}}2$Nqqb5w*$s;_N(U zE-FPFB(pA7d#<6^Ku(zF6|Z@Hsf>n(&rMyEf_N#Pnbii`i5w?yz-C1!zrl?2PriF< z{GJPwnKEq8slOcdlt)t9JYQw+?sZeYQoE9IRjZ*7dEg=mPP*625TAaQ z0&BQto{ys`kz+Y?2vtUz0HjwpPJd!hiJ8h64qV_MzNR<$bxAO~&DU*~#o6Fi_N9G7 znd1FqsExO|v^@_w-$?gxToy4a=G5bvAg3sC5!X&)Dd263IbMvcCM7XsNX~nv*MSmr zOe15%&DgKqhFMuz_3;@N=H`y;r7y@yBF~0Iv5$^W2#JUqG_i?@EXaGh2Zl=)S9j*D zA9^4mfv0upHT=AE7iW4Co6JCy&WII%iuW=WFr#6HiqE?Ks#+}aDp56cT|Pd~&Qp+m zku6=1BQP|q(6!AI`HR+K(&G?rL8Y;)mv2$1PekAlCKt=}`T67Ks!Dp3NH>YQG#jsS zjjtyvaz=H#gXA3N@^iA)cHMc;`=7ZLl}m^xSJJbmrR{&|VyMi@lTQTQaL(HK^K{KE zG{H?y-d@H5h)29rE_;w}t@jj{OEqTfO|Sw!hiMcj!VYSGh1$hWq5$yGHlAB(I~w`) z3{}r+-G1tk?K(poo%A@SJhSd)u%cR8)$##8AxxEDPOOcNDmn?6p+$IE+YobS>T6?@ z%~#&%JLsepL#aRc{KyVTblljAPu(?Tl#|Pw^69t5M1`}v7{s(PUs5!w{CaVUu0pp8 z^AYp^3xq&0BmG)!K3)UX`Fe#6JmiN>O@e&RJB9iABaI>NPq-}vZ_e3gF^7ZDNxV-t z??7C6vzVP>8w)tv64LEGJ?1|UB6p`hJ+=Rjw?(S*S08`UqneK=)XM(8_SUH28PDSB|fk_iNxms=oW7$Vy?p86ey3VR+a~w{8S3R*04b=baPZXr8PXP$jQV@&3fj_k-3V7` z^c4s#Dq_Mk((W5#HZwPeHQ&9ina(V@N+-xn@D^;$(InbKkFKk#3J}%5yam}o2HjXE zBf6;rzvQ6p+oIK;H88#s?9N9;aoGs^oCiO=J#E+@s30}v)R#7}lNav0OmFM|d@0>9 zbkVVf)nCxlkqEQM`+S)XZEap7xmG-4fe#IW9+a=G0tCJ!>L8%c%8i#ho_~26SXd|n zPYT0f(OKjZDPJ zrLxJ9m-Y4b&R2NAf!7bb(a~w9qnW!Dou=!e2|W*ktuZ<*1}QVC&D$F!9Q*bd1;I46 z!>RQY-O~=>@1J%YZ;moDwYyzh0L-7AqvJPjAL}zNtM?YziXVhOhzD?RQpE-<4JKoU zGKB=UvK;)kK;jNPa$jx5;wfm*Hau6*|O%YMa+5En5Y#B}u z4uOP?xc+bk3hCzfpTRMy#P8m>G4FFFN?+vY;!=qDWkb|3lqji z)dttuW}#L2nrBJp75T-UOTl&GBic6)e)Kd71-g*GtgvURu;1LL;!@k-T8@p-6Zu!R zP<_6zo~`9!d~a1n4TRfgZ_G>?7D-ZGQ=@m%-_sAN*_&=?&d!eOUA{ymI9%;v(bk5^ zHkdNA-T`?LXE-e8X=<&(l|1uA-*ES4<1;uaQL&F?9}?VW@&jkE=|swNSgHX3jL_ZE zsL$v+w3BX;@BEw&k%n1awxQt!I> zL!B#%fn(-xsJ5K02cC;AC9d2zd^VT4Bx}^4TS^w#!yw^OIWgU=b>+8)goJbj z_g0?^-$# zH|JviV~+?MYD*VAR15d6WyzQt61h3BjuHC;<=HJU9~ zRZ%hB;G$a{57llQzSr;bi1@4MrWzu1v!1;tpFW(QN zdxj4{cJcx#TvYS{!pw8C9D_Z6YwY3V!WG$_rj}NbgPM)Drp7CuJFD61=UT@Sy!Q}h z6TwPfhX+1w2$k;SB^0TsjzbW{epz8jc+}O{7@BTvk2*6%wQV(|{F9TR5 zLE7$zPU%YQ1YiZ_o}~h%BVCIWf`Xz^;`b3YgaHq1b!8>7Tc}nULJ=B*zZNJXLAY$% zWX~?qXsia<97+y=xCTU}q_13S%gYbPsY<@vAt2<^7~e`u$#-{k@jLIF_m)62xrIr- zSKa%YbNlYic~LN_1mxaQ!il)X$HyN(ToY^(v>Egm9hgH8e}G`SuBoXhcy)}D_I4i- zkA|aQi2D8e(;E|jrWpJTfqJn<-+p78`MQ(pc8M_j;w#FB8{^>eu82Cw|2K1#|B=u{ zsQKVe4ZvL_CYC>iDL|SL)TJVP_%Cyx2>-t+(f|0m|IDBMH~;>x)2jdToBy-v|KB$L z;|l+ua>1|X4S(N71RXHihmgSokahi&rTFvkf8)mecWvBoMC0IdG3`2{5)vXTFu&n@ zj*ZW?o1#X+YN-j!GdOnuIo(a><*~A2X98q60>YV*D^1w%7}wupD<^~!Rr)@{cO+vT ztYS?tJv%1~Fz4d0eD tuple[list[str], list[str]]: def blocked_triage_stages(plan: dict) -> dict[str, list[str]]: """Return triage stages that are blocked by unmet dependencies.""" order_set = set(plan.get("queue_order", [])) - stage_names = ("observe", "reflect", "organize", "enrich", "sense-check", "commit") + stage_names = ( + "observe", + "reflect", + "organize", + "enrich", + "sense-check", + "commit", + ) present_names = { name for stage_id, name in zip(TRIAGE_STAGE_IDS, stage_names, strict=False) diff --git a/desloppify/app/commands/plan/triage/confirmations/basic.py b/desloppify/app/commands/plan/triage/confirmations/basic.py index 9781d1c2..43733358 100644 --- a/desloppify/app/commands/plan/triage/confirmations/basic.py +++ b/desloppify/app/commands/plan/triage/confirmations/basic.py @@ -12,8 +12,8 @@ ensure_stage_is_confirmable, finalize_stage_confirmation, ) -from ..observe_batches import observe_dimension_breakdown from ..services import TriageServices, default_triage_services +from ..stages.records import TriageStages # Observe verdicts that trigger auto-skip on confirmation _AUTO_SKIP_VERDICTS = frozenset({"false positive", "exaggerated"}) @@ -186,7 +186,7 @@ def _undo_observe_auto_skips(plan: dict, meta: dict) -> int: def confirm_observe( args: argparse.Namespace, plan: dict, - stages: dict, + stages: TriageStages, attestation: str | None, *, services: TriageServices | None = None, @@ -196,17 +196,14 @@ def confirm_observe( if not ensure_stage_is_confirmable(stages, stage="observe"): return - runtime = resolved_services.command_runtime(args) - si = resolved_services.collect_triage_input(plan, runtime.state) obs = stages["observe"] - print(colorize(" Stage: OBSERVE — Analyse issues & spot contradictions", "bold")) + print(colorize(" Stage: OBSERVE — Verify queued issues against the code", "bold")) print(colorize(" " + "─" * 54, "dim")) - by_dim, dim_names = observe_dimension_breakdown(si) - - review_issues = getattr(si, "review_issues", getattr(si, "open_issues", {})) - issue_count = obs.get("issue_count", len(review_issues)) + by_dim = obs.get("dimension_counts", {}) + dim_names = obs.get("dimension_names", sorted(by_dim)) + issue_count = int(obs.get("issue_count", 0) or 0) print(f" Your analysis covered {issue_count} issues across {len(by_dim)} dimensions:") for dim in dim_names: print(f" {dim}: {by_dim[dim]} issues") @@ -296,7 +293,8 @@ def confirm_reflect( print(colorize(" │ ...", "cyan")) print(colorize(" └" + "─" * 51 + "┘", "cyan")) - _by_dim, observe_dims = observe_dimension_breakdown(si) + observe_stage = stages.get("observe", {}) + observe_dims = list(observe_stage.get("dimension_names", [])) reflect_dims = sorted(set((list(recurring.keys()) if recurring else []) + observe_dims)) reflect_clusters = [name for name in plan.get("clusters", {}) if not plan["clusters"][name].get("auto")] diff --git a/desloppify/app/commands/plan/triage/confirmations/enrich.py b/desloppify/app/commands/plan/triage/confirmations/enrich.py index b71a66fe..40b31501 100644 --- a/desloppify/app/commands/plan/triage/confirmations/enrich.py +++ b/desloppify/app/commands/plan/triage/confirmations/enrich.py @@ -14,6 +14,8 @@ finalize_stage_confirmation, ) from ..services import TriageServices, default_triage_services +from ..stages.helpers import scoped_manual_clusters_with_issues +from ..review_coverage import active_triage_issue_ids from ..validation.enrich_quality import ( EnrichQualityIssue as _ConfirmationCheckIssue, EnrichQualityReport as _ConfirmationCheckReport, @@ -41,6 +43,7 @@ def _collect_enrich_level_confirmation_checks( plan: dict, *, include_stale_issue_ref_warning: bool, + triage_issue_ids: set[str] | None = None, ) -> _ConfirmationCheckReport: from desloppify.base.discovery.paths import get_project_root @@ -53,6 +56,7 @@ def _collect_enrich_level_confirmation_checks( include_missing_issue_refs=True, include_vague_detail=True, stale_issue_refs_severity="warning" if include_stale_issue_ref_warning else None, + triage_issue_ids=triage_issue_ids, ) @@ -170,10 +174,12 @@ def confirm_enrich( resolved_services = services or default_triage_services() if not ensure_stage_is_confirmable(stages, stage="enrich"): return + state = resolved_services.command_runtime(args).state checks = _collect_enrich_level_confirmation_checks( plan, include_stale_issue_ref_warning=True, + triage_issue_ids=active_triage_issue_ids(plan, state) or None, ) print(colorize(" Stage: ENRICH — Make steps executor-ready (detail, refs)", "bold")) @@ -184,7 +190,7 @@ def confirm_enrich( _print_stale_ref_warning(checks.warning("stale_issue_refs")) - enrich_clusters = [n for n in plan.get("clusters", {}) if not plan["clusters"][n].get("auto")] + enrich_clusters = scoped_manual_clusters_with_issues(plan, state) if not finalize_stage_confirmation( plan=plan, @@ -221,10 +227,12 @@ def confirm_sense_check( resolved_services = services or default_triage_services() if not ensure_stage_is_confirmable(stages, stage="sense-check"): return + state = resolved_services.command_runtime(args).state checks = _collect_enrich_level_confirmation_checks( plan, include_stale_issue_ref_warning=False, + triage_issue_ids=active_triage_issue_ids(plan, state) or None, ) print(colorize(" Stage: SENSE-CHECK — Verify accuracy & cross-cluster deps", "bold")) @@ -235,7 +243,7 @@ def confirm_sense_check( print(colorize(" All enrich-level checks pass.", "green")) - sense_check_clusters = [n for n in plan.get("clusters", {}) if not plan["clusters"][n].get("auto")] + sense_check_clusters = scoped_manual_clusters_with_issues(plan, state) if not finalize_stage_confirmation( plan=plan, diff --git a/desloppify/app/commands/plan/triage/confirmations/organize.py b/desloppify/app/commands/plan/triage/confirmations/organize.py index 621ba263..979b0013 100644 --- a/desloppify/app/commands/plan/triage/confirmations/organize.py +++ b/desloppify/app/commands/plan/triage/confirmations/organize.py @@ -21,6 +21,11 @@ triage_coverage, ) from ..services import TriageServices, default_triage_services +from ..validation.enrich_checks import ( + _cluster_file_overlaps, + _clusters_with_directory_scatter, + _clusters_with_high_step_ratio, +) def _require_enriched_clusters(plan: dict) -> bool: @@ -67,12 +72,6 @@ def _print_reflect_activity_summary(plan: dict, stages: dict) -> None: def _print_cluster_shape_warnings(plan: dict) -> None: - from ..validation.core import ( # noqa: PLC0415 - _cluster_file_overlaps, - _clusters_with_directory_scatter, - _clusters_with_high_step_ratio, - ) - scattered = _clusters_with_directory_scatter(plan) if scattered: print(colorize(f"\n Warning: {len(scattered)} cluster(s) span many unrelated directories:", "yellow")) diff --git a/desloppify/app/commands/plan/triage/lifecycle.py b/desloppify/app/commands/plan/triage/lifecycle.py index 1fcbfba8..ecd20beb 100644 --- a/desloppify/app/commands/plan/triage/lifecycle.py +++ b/desloppify/app/commands/plan/triage/lifecycle.py @@ -12,6 +12,10 @@ TriageStartDecision, decide_triage_start, ) +from desloppify.engine._plan.policy.subjective import ( + SubjectiveVisibility, + compute_subjective_visibility, +) from desloppify.base.output.terminal import colorize from desloppify.state_io import StateModel @@ -73,6 +77,7 @@ def ensure_triage_started( *, services: TriageServices, state: StateModel | None = None, + policy: SubjectiveVisibility | None = None, attestation: str | None = None, log_action: str | None = None, log_actor: str = "system", @@ -84,6 +89,9 @@ def ensure_triage_started( """Ensure triage stages are injected or return a blocked/already-active outcome.""" resolved_deps = deps or TriageLifecycleDeps() meta = plan.setdefault("epic_triage_meta", {}) + resolved_policy = policy + if resolved_policy is None and state is not None: + resolved_policy = compute_subjective_visibility(state, plan=plan) if resolved_deps.has_triage_in_queue(plan): if state is not None: @@ -95,6 +103,7 @@ def ensure_triage_started( decision = resolved_deps.decide_triage_start( plan, state, + policy=resolved_policy, explicit_start=True, attested_override=bool(attestation and len(attestation.strip()) >= 30), ) diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_claude.py b/desloppify/app/commands/plan/triage/runner/orchestrator_claude.py index 077b2e3f..4fe8463b 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_claude.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_claude.py @@ -67,7 +67,7 @@ def run_claude_orchestrator( print(" - Check the dashboard between stages.") print(" - Observe subagent should use sub-subagents (one per dimension group).") print(" - Enrich subagent should use sub-subagents (one per cluster).") - print(" - Sense-check launches TWO parallel subagents (content + structure).") + print(" - Sense-check launches THREE subagents (content + structure + value).") print(" - If a stage fails validation, fix and re-record.") diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_completion.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_completion.py index 33586e8c..f6d99955 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_completion.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_completion.py @@ -119,13 +119,29 @@ def validate_and_confirm_stage( def build_completion_strategy(stages_data: Mapping[str, Mapping[str, Any]]) -> str: """Derive a completion strategy from stage reports.""" strategy_parts: list[str] = [] + recorded_stages: list[str] = [] for stage in STAGES: report = str(stages_data.get(stage, {}).get("report", "")) if report: + recorded_stages.append(stage) strategy_parts.append(f"[{stage}] {report[:200]}") strategy = " ".join(strategy_parts) if len(strategy) < 200: - strategy = strategy + " " + "Automated triage via codex subagent pipeline. " * 3 + if recorded_stages: + stage_list = ", ".join(recorded_stages) + summary = ( + f"Triage covered {len(recorded_stages)} stage(s): {stage_list}. " + "Use the recorded stage reports as the execution plan, preserve the " + "observe and reflect evidence trail, keep organize and enrich changes " + "aligned with the recorded dispositions, and verify each cluster before completion." + ) + strategy = f"{strategy} {summary}".strip() + else: + strategy = ( + "Triage completed without recorded stage reports. Before completion, capture " + "the execution order, the cluster or skip decisions that will change plan state, " + "and the verification steps needed to confirm the resulting queue is correct." + ) return strategy diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py index 2e9d5862..5200c24a 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py @@ -14,7 +14,7 @@ from desloppify.engine.plan_triage import compute_triage_progress from ..services import TriageServices -from ..validation.core import validate_organize_against_reflect_ledger +from ..validation.organize_policy import validate_organize_against_reflect_ledger from ..validation.reflect_accounting import ( analyze_reflect_issue_accounting, validate_reflect_accounting, @@ -125,6 +125,7 @@ def _record_sense_check_report( apply_updates=True, reload_plan=context.services.load_plan, append_run_log=context.append_run_log, + state=context.state, ), record_report=_record_sense_check_report, ), diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_sense.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_sense.py index cbb4007b..01d756fd 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_sense.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_sense.py @@ -15,7 +15,7 @@ render_policy_block, ) -from ..review_coverage import manual_clusters_with_issues +from ..stages.helpers import scoped_manual_clusters_with_issues, triage_scoped_plan from .codex_runner import ( TriageStageRunResult, _output_file_has_text, @@ -26,6 +26,7 @@ build_sense_check_content_prompt, build_sense_check_structure_prompt, ) +from .stage_prompts_sense import build_sense_check_value_prompt def _noop_log(_msg: str) -> None: @@ -45,13 +46,13 @@ def _print_sense_header(total_content: int, *, apply_updates: bool, log: Callabl if apply_updates: print( colorize( - f"\n Sense-check: {total_content} content batches, then 1 structure batch.", + f"\n Sense-check: {total_content} content batches, then 1 structure batch, then 1 value batch.", "bold", ) ) log(f"sense-check-sequenced content_batches={total_content} apply_updates=1") return - print(colorize(f"\n Sense-check: {total_content} content batches + 1 structure batch.", "bold")) + print(colorize(f"\n Sense-check: {total_content} content batches + 1 structure batch + 1 value batch.", "bold")) log(f"sense-check-parallel content_batches={total_content}") @@ -246,6 +247,33 @@ def _merge_batch_outputs(batch_meta: list[tuple[str, Path]]) -> str: return "\n\n---\n\n".join(parts) +def _value_batch_config( + *, + plan: dict, + state: dict | None, + repo_root: Path, + prompts_dir: Path, + output_dir: Path, + logs_dir: Path, + mode: str, + cli_command: str, +) -> SenseBatchConfig: + prompt = build_sense_check_value_prompt( + plan=dict(plan), + state=state, + repo_root=repo_root, + mode=mode, + cli_command=cli_command, + ) + return SenseBatchConfig( + label="value", + prompt_file=prompts_dir / "sense_check_value.md", + output_file=output_dir / "sense_check_value.raw.txt", + log_file=logs_dir / "sense_check_value.log", + prompt=prompt, + ) + + def run_sense_check( *, plan: dict, @@ -259,13 +287,15 @@ def run_sense_check( apply_updates: bool = False, reload_plan: Callable[[], dict] | None = None, append_run_log=None, + state: dict | None = None, ) -> TriageStageRunResult: - """Run sense-check via parallel codex subprocess batches.""" + """Run sense-check via parallel codex subprocess batches (content → structure → value).""" _log = append_run_log or _noop_log - clusters = manual_clusters_with_issues(plan) + scoped_plan = triage_scoped_plan(plan, state) + clusters = scoped_manual_clusters_with_issues(plan, state) total_content = len(clusters) - total = total_content + 1 + total = total_content + 2 # +1 structure +1 value _print_sense_header(total_content, apply_updates=apply_updates, log=_log) policy_result = load_policy_result() @@ -280,7 +310,7 @@ def run_sense_check( content_mode, structure_mode = _sense_modes(apply_updates=apply_updates) content_tasks, batch_meta = _content_tasks_and_meta( clusters=clusters, - plan=plan, + plan=scoped_plan, repo_root=repo_root, prompts_dir=prompts_dir, output_dir=output_dir, @@ -292,7 +322,7 @@ def run_sense_check( cli_command=cli_command, log=_log, ) - structure_plan = dict(plan) + structure_plan = dict(scoped_plan) structure_config = _structure_batch_config( plan=structure_plan, repo_root=repo_root, @@ -355,6 +385,51 @@ def run_sense_check( if structure_failures: return _parallel_failure_result(structure_failures, log=_log) + # Value batch — runs after structure (needs corrected plan state) + value_plan = dict(plan) + if apply_updates and reload_plan is not None: + reloaded = _reload_structure_plan(reload_plan=reload_plan, log=_log) + if reloaded is not None: + value_plan = reloaded + _log("sense-check-plan-reloaded phase=value") + + value_mode = "self_record" if apply_updates else "output_only" + value_config = _value_batch_config( + plan=value_plan, + state=state, + repo_root=repo_root, + prompts_dir=prompts_dir, + output_dir=output_dir, + logs_dir=logs_dir, + mode=value_mode, + cli_command=cli_command, + ) + _write_batch_prompt(value_config) + batch_meta.append((value_config.label, value_config.output_file)) + print(colorize(" Value batch: YAGNI/KISS pass", "dim")) + _log("sense-check-value batch=global") + + if not dry_run: + value_tasks: dict[int, Callable[[], TriageStageRunResult]] = { + 0: partial( + run_triage_stage, + prompt=value_config.prompt, + repo_root=repo_root, + output_file=value_config.output_file, + log_file=value_config.log_file, + timeout_seconds=timeout_seconds, + validate_output_fn=_output_file_has_text, + ) + } + value_failures = _run_parallel_or_fail( + tasks=value_tasks, + stage_label="Sense-check", + batch_label_fn=lambda _idx: "value", + log=_log, + ) + if value_failures: + return _parallel_failure_result(value_failures, log=_log) + merged = _merge_batch_outputs(batch_meta) print(colorize(f" Sense-check: merged {total} batch outputs ({len(merged)} chars).", "green")) _log(f"sense-check-parallel-done merged_chars={len(merged)}") diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_common.py b/desloppify/app/commands/plan/triage/runner/orchestrator_common.py index 1a3c0175..64dcb210 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_common.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_common.py @@ -4,7 +4,13 @@ from datetime import UTC, datetime -STAGES: tuple[str, ...] = ("observe", "reflect", "organize", "enrich", "sense-check") +STAGES: tuple[str, ...] = ( + "observe", + "reflect", + "organize", + "enrich", + "sense-check", +) def parse_only_stages(raw: str | None) -> list[str]: diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts.py b/desloppify/app/commands/plan/triage/runner/stage_prompts.py index 14d5cbae..ee98acdf 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts.py @@ -27,6 +27,7 @@ from .stage_prompts_sense import ( build_sense_check_content_prompt, build_sense_check_structure_prompt, + build_sense_check_value_prompt, ) from .stage_prompts_validation import _validation_requirements @@ -345,6 +346,7 @@ def cmd_stage_prompt( "build_observe_batch_prompt", "build_sense_check_content_prompt", "build_sense_check_structure_prompt", + "build_sense_check_value_prompt", "build_stage_prompt", "cmd_stage_prompt", "_observe_batch_instructions", diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py index 2ba83505..f37d90b6 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py @@ -405,6 +405,15 @@ def _sense_check_instructions(mode: PromptMode = "self_record") -> str: structure_fix_block = """\ Fix with: `desloppify plan cluster update --depends-on ` Fix with: `desloppify plan cluster update --add-step "..." --detail "..." --effort trivial --issue-refs ` +""" + value_commands = """\ +Use these commands aggressively: +- `desloppify next --count 100` to inspect the current execution queue +- `desloppify plan cluster show ` to inspect cluster members and steps +- `desloppify show --no-budget` to re-read the underlying finding +- `desloppify plan cluster update --description "..." --update-step N --detail "..." --effort small` +- `desloppify plan skip --permanent --note "" --attest "I have reviewed this triage skip against the code and I am not gaming the score by suppressing a real defect."` +- `desloppify plan cluster delete ` if you skipped everything it contained """ tail = """\ When done, run: @@ -420,8 +429,12 @@ def _sense_check_instructions(mode: PromptMode = "self_record") -> str: "Report the exact dependency additions or cascade steps that need to be made; " "the orchestrator will apply them.\n" ) + value_commands = ( + "State the exact queue items to keep, tighten, or skip, plus any cluster-step " + "updates or deletions needed. The orchestrator will apply them." + ) tail = """\ -When done, write a plain-text sense-check report with concrete content and structure fixes. +When done, write a plain-text sense-check report with concrete content, structure, and value findings. The orchestrator records and confirms the stage. """ investigation_hint = ( @@ -434,8 +447,11 @@ def _sense_check_instructions(mode: PromptMode = "self_record") -> str: return f"""\ ## SENSE-CHECK Stage Instructions -This stage is handled by two parallel subagents. If you are being run as a -single-subprocess fallback, perform BOTH the content and structure checks below. +This stage is handled by three subagents. If you are being run as a +single-subprocess fallback, perform ALL three checks below. + +Execution order: content batches (parallel) → structure batch → value batch (sequential). +Value runs last because it needs the corrected plan state from content and structure. ### Content Check (per cluster) {investigation_hint}For EVERY step in every cluster, read the actual source file and verify: @@ -468,6 +484,45 @@ def _sense_check_instructions(mode: PromptMode = "self_record") -> str: {structure_fix_block} +### Value Check (global — YAGNI/KISS pass) + +Walk the CURRENT planned work item by item and make the final judgment about value. +Ask: does doing this make the codebase genuinely better? Beauty is a valid reason to keep work, +but not if it buys that beauty with new indirection, wrappers, abstraction layers, or confusion. + +For EVERY live queue target, choose exactly one: +1. `keep` — clearly improves correctness, clarity, cohesion, simplicity, or elegance +2. `tighten` — worth doing, but the plan must be simplified or made more concrete first +3. `skip` — the fix would add churn, indirection, coordination, or abstraction for too little gain + +What should usually be skipped: +- facade pruning that just spreads imports +- abstraction-for-abstraction's-sake +- tiny theoretical cleanups that make the code harder to follow +- fixes whose implementation is more complicated than the current code + +What can still be worth keeping: +- simplifications that delete layers or reduce branching +- aesthetic cleanups that genuinely improve readability without adding machinery +- focused unifications that make naming or flow more coherent with less confusion + +{value_commands} + +Required process: +1. Re-read the actual code behind each queue target. +2. Apply the rubric above, not the raw issue title. +3. Tighten any keeper whose steps are too vague, too broad, or too complicated. +4. Permanently skip anything that fails the value test. +5. Delete dead clusters after skipping all their members. + +Required report structure — include a Decision Ledger section: +``` +## Decision Ledger +- cluster-or-id -> keep +- cluster-or-id -> tighten +- cluster-or-id -> skip +``` + {tail} """ diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py index e54a0a8f..318063a5 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_shared.py @@ -150,10 +150,12 @@ ``` {cli_command} plan cluster create --description "" {cli_command} plan cluster add +{cli_command} plan cluster remove {cli_command} plan cluster update --description "" --steps "step 1" "step 2" {cli_command} plan cluster update --add-step "" --detail "<sub-points>" --effort small --issue-refs <id1> <id2> {cli_command} plan cluster update <name> --update-step N --detail "<sub-points>" --effort medium --issue-refs <id1> {cli_command} plan cluster update <name> --depends-on <other-cluster-name> +{cli_command} plan cluster delete <name> {cli_command} plan cluster show <name> {cli_command} plan cluster list --verbose {cli_command} plan promote <pattern> diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_sense.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_sense.py index 7571786a..e872d548 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_sense.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_sense.py @@ -36,7 +36,11 @@ def _sense_check_fix_list() -> str: " asking a single question? If not:\n" " - Replace \"refactor X\" with the specific transformation\n" " - Replace \"update imports\" with the specific file list\n" - " - Replace \"extract into new hook\" with the filename, function signature, return type\n" + " - Replace \"extract into new hook\" with the existing package/directory surface,\n" + " function signature, and return type\n" + " - ONLY reference file paths that already exist on disk\n" + " - If a new file is warranted, name the existing parent directory or package and\n" + " describe the new module generically; do NOT invent a future filename\n" "6. EFFORT TAGS: Does the tag match the actual scope? A one-line rename is \"trivial\",\n" " not \"small\". Decomposing a 400-line file is \"large\", not \"medium\".\n" "7. DUPLICATES: If you notice this step does the same thing as a step in another\n" @@ -85,6 +89,8 @@ def _sense_check_content_not_to_do(mode: str) -> str: "- Do NOT reorder steps (the structure subagent handles that)\n" "- Do NOT add --depends-on (the structure subagent handles that)\n" "- Do NOT add new steps for missing cascade updates (the structure subagent handles that)\n" + "- Do NOT introduce speculative future file or directory paths into step detail text\n" + "- Do NOT name a concrete new file unless it already exists on disk\n" "- Do NOT modify any cluster other than the one assigned in this prompt\n" "- Do NOT run triage stage commands (`plan triage --stage ...`)\n" "- Do NOT debug or repair the CLI / environment\n" @@ -94,6 +100,8 @@ def _sense_check_content_not_to_do(mode: str) -> str: "- Do NOT reorder steps (the structure subagent handles that)\n" "- Do NOT add --depends-on (the structure subagent handles that)\n" "- Do NOT add new steps for missing cascade updates (the structure subagent handles that)\n" + "- Do NOT invent future file or directory paths when rewriting steps\n" + "- Do NOT name a concrete new file unless it already exists on disk\n" "- Do NOT run any `desloppify` commands\n" "- Do NOT debug or repair the CLI / environment\n" ) @@ -145,6 +153,7 @@ def _sense_check_structure_not_to_do(mode: str) -> str: "- Do NOT modify existing step detail text (content subagents handled that)\n" "- Do NOT change effort tags on existing steps\n" "- Do NOT remove existing steps\n" + "- Do NOT add cascade steps that point at speculative future files; reference only existing files\n" "- Do NOT run triage stage commands (`plan triage --stage ...`)\n" "- Do NOT debug or repair the CLI / environment\n" ) @@ -153,6 +162,7 @@ def _sense_check_structure_not_to_do(mode: str) -> str: "- Do NOT modify step detail text (the content subagent handles that)\n" "- Do NOT change effort tags (the content subagent handles that)\n" "- Do NOT remove steps or deduplicate (the content subagent handles that)\n" + "- Do NOT add cascade steps that point at speculative future files\n" "- Do NOT run any `desloppify` commands\n" "- Do NOT debug or repair the CLI / environment\n" ) @@ -287,7 +297,124 @@ def build_sense_check_structure_prompt( return "\n\n".join(parts) +def build_sense_check_value_prompt( + *, + plan: dict, + state: dict | None, + repo_root: Path, + mode: str = "self_record", + cli_command: str = "desloppify", +) -> str: + """Build a value-check prompt for the YAGNI/KISS pass as sense-check's 3rd subagent.""" + from ..stages.helpers import value_check_targets + + targets = value_check_targets(plan, state) + clusters = {name: c for name, c in plan.get("clusters", {}).items() if not c.get("auto")} + + parts: list[str] = [] + parts.append( + "You are running the VALUE CHECK pass as part of sense-check.\n" + f"Repo root: {repo_root}\n\n" + f"Live queue targets: {len(targets)}" + ) + + job = ( + "## Your job\n" + "Walk every live queue target and make the final YAGNI/KISS judgment.\n" + "Ask: does doing this make the codebase genuinely better? Beauty is a valid\n" + "reason to keep work, but not if it buys that beauty with new indirection,\n" + "wrappers, abstraction layers, or confusion.\n" + ) + parts.append(job) + + rubric = ( + "## Rubric\n" + "For EVERY live queue target, choose exactly one:\n" + "1. `keep` — clearly improves correctness, clarity, cohesion, simplicity, or elegance\n" + "2. `tighten` — worth doing, but the plan must be simplified or made more concrete first\n" + "3. `skip` — the fix would add churn, indirection, coordination, or abstraction for too little gain\n\n" + "What should usually be skipped:\n" + "- facade pruning that just spreads imports\n" + "- abstraction-for-abstraction's-sake\n" + "- tiny theoretical cleanups that make the code harder to follow\n" + "- fixes whose implementation is more complicated than the current code\n\n" + "What can still be worth keeping:\n" + "- simplifications that delete layers or reduce branching\n" + "- aesthetic cleanups that genuinely improve readability without adding machinery\n" + "- focused unifications that make naming or flow more coherent with less confusion\n" + ) + parts.append(rubric) + + if mode == "self_record": + commands = ( + "## Commands\n" + f"Use the exact CLI prefix: `{cli_command}`\n" + f"- `{cli_command} next --count 100` to inspect the current execution queue\n" + f"- `{cli_command} plan cluster show <name>` to inspect cluster members and steps\n" + f"- `{cli_command} show <issue-id-or-hash> --no-budget` to re-read the underlying finding\n" + f"- `{cli_command} plan cluster update <name> --update-step N --detail \"...\" --effort small`\n" + f'- `{cli_command} plan skip --permanent <pattern> --note "<why>"' + ' --attest "I have reviewed this triage skip against the code and I am not gaming the score' + ' by suppressing a real defect."`\n' + f"- `{cli_command} plan cluster delete <name>` if you skipped everything it contained\n" + ) + parts.append(commands) + else: + parts.append( + "## Output contract\n" + "State the exact queue items to keep, tighten, or skip, plus any cluster-step\n" + "updates or deletions needed. The orchestrator will apply them.\n" + ) + + process = ( + "## Required process\n" + "1. Re-read the actual code behind each queue target.\n" + "2. Apply the rubric above, not the raw issue title.\n" + "3. Tighten any keeper whose steps are too vague, too broad, or too complicated.\n" + "4. Permanently skip anything that fails the value test.\n" + "5. Delete dead clusters after skipping all their members.\n" + ) + parts.append(process) + + # Include targets + parts.append("## Live Queue Targets\n") + for target in targets: + if target in clusters: + cluster = clusters[target] + steps = cluster.get("action_steps", []) + parts.append(f"- **{target}** ({len(steps)} steps)") + else: + parts.append(f"- {target}") + + # Include cluster details + if clusters: + parts.append("\n## Cluster Details\n") + for name, cluster in sorted(clusters.items()): + steps = cluster.get("action_steps", []) + issues = cluster_issue_ids(cluster) + parts.append(f"### {name} ({len(steps)} steps, {len(issues)} issues)") + for i, step in enumerate(steps, 1): + parts.append(_format_cluster_step(i, step)) + + output_section = ( + "\n## Output\n" + "Start with a `## Decision Ledger` section:\n" + "```\n" + "## Decision Ledger\n" + "- cluster-or-id -> keep\n" + "- cluster-or-id -> tighten\n" + "- cluster-or-id -> skip\n" + "```\n" + "Then add short sections explaining the reasoning, with concrete file references.\n" + "Cover every live queue target exactly once in the ledger.\n" + ) + parts.append(output_section) + + return "\n\n".join(parts) + + __all__ = [ "build_sense_check_content_prompt", "build_sense_check_structure_prompt", + "build_sense_check_value_prompt", ] diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py index e01aaf03..194d8af9 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py @@ -50,6 +50,9 @@ def _validation_requirements(stage: str) -> str: "## Validation Requirements (ALL BLOCKING)\n" "- Re-runs ALL enrich-level checks (detail, issue_refs, effort, paths, vagueness)\n" "- Stage must be recorded with a 100+ char report\n" + "- Report must include a `## Decision Ledger` with one line per live queue target\n" + "- Every live queue target must appear exactly once as keep, tighten, or skip\n" + "- Report must cite real file paths to prove the code was re-read\n" "- Stage must be confirmed with an 80+ char attestation mentioning cluster names\n" ) return "" diff --git a/desloppify/app/commands/plan/triage/runner/stage_validation.py b/desloppify/app/commands/plan/triage/runner/stage_validation.py index 488ef775..c8a0b0cb 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_validation.py +++ b/desloppify/app/commands/plan/triage/runner/stage_validation.py @@ -15,7 +15,7 @@ validate_report_references_clusters, ) from ..validation.enrich_quality import evaluate_enrich_quality -from ..validation.core import ( +from ..validation.enrich_checks import ( _cluster_file_overlaps, _clusters_with_directory_scatter, _clusters_with_high_step_ratio, @@ -23,11 +23,19 @@ from ..completion_flow import count_log_activity_since from ..observe_batches import observe_dimension_breakdown from ..review_coverage import ( + active_triage_issue_ids, cluster_issue_ids, - manual_clusters_with_issues, open_review_ids_from_state, ) -from ..stages.helpers import unclustered_review_issues, unenriched_clusters +from ..stages.helpers import ( + active_triage_issue_scope, + scoped_manual_clusters_with_issues, + triage_scoped_plan, + unclustered_review_issues, + unenriched_clusters, + value_check_targets, +) +from ..stages.evidence_parsing import parse_value_check_decision_ledger @dataclass(frozen=True) @@ -43,6 +51,7 @@ def run_enrich_quality_checks( repo_root: Path, *, phase_label: str, + triage_issue_ids: set[str] | None = None, ) -> list[EnrichQualityFailure]: """Run enrich-level executor-readiness checks for a phase.""" report = evaluate_enrich_quality( @@ -54,6 +63,7 @@ def run_enrich_quality_checks( include_missing_issue_refs=True, include_vague_detail=True, stale_issue_refs_severity="failure", + triage_issue_ids=triage_issue_ids, ) code_map = {"underspecified": "underspecified_steps", "bad_paths": "missing_paths"} return [ @@ -157,8 +167,9 @@ def _validate_organize_stage(plan: dict, state: dict, stages: dict) -> tuple[boo """Validate recorded organize-stage content.""" if "organize" not in stages: return False, "Organize stage not recorded." - open_review_ids = open_review_ids_from_state(state) - manual = manual_clusters_with_issues(plan) + triage_scope = active_triage_issue_scope(plan, state) + open_review_ids = open_review_ids_from_state(state) if triage_scope is None else triage_scope + manual = scoped_manual_clusters_with_issues(plan, state) if not open_review_ids and not manual: report = stages["organize"].get("report", "") if len(report) < 100: @@ -166,7 +177,7 @@ def _validate_organize_stage(plan: dict, state: dict, stages: dict) -> tuple[boo return True, "" if not manual: return False, "No manual clusters with issues exist." - gaps = unenriched_clusters(plan) + gaps = unenriched_clusters(plan, state) if gaps: names = ", ".join(name for name, _ in gaps) return False, f"Unenriched clusters: {names}" @@ -197,11 +208,21 @@ def _validate_organize_stage(plan: dict, state: dict, stages: dict) -> tuple[boo return True, "" -def _validate_enrich_stage(plan: dict, repo_root: Path, stages: dict) -> tuple[bool, str]: +def _validate_enrich_stage( + plan: dict, + state: dict, + repo_root: Path, + stages: dict, +) -> tuple[bool, str]: """Validate recorded enrich-stage content.""" if "enrich" not in stages: return False, "Enrich stage not recorded." - failures = run_enrich_quality_checks(plan, repo_root, phase_label="enrich") + failures = run_enrich_quality_checks( + plan, + repo_root, + phase_label="enrich", + triage_issue_ids=active_triage_issue_ids(plan, state) or None, + ) if failures: return False, failures[0].message return True, "" @@ -213,18 +234,23 @@ def _validate_sense_check_stage( repo_root: Path, stages: dict, ) -> tuple[bool, str]: - """Validate recorded sense-check-stage content.""" + """Validate recorded sense-check-stage content (includes value decisions).""" if "sense-check" not in stages: return False, "Sense-check stage not recorded." report = stages["sense-check"].get("report", "") if len(report) < 100: return False, f"Sense-check report too short ({len(report)} chars, need 100+)." - if not open_review_ids_from_state(state) and not manual_clusters_with_issues(plan): + manual_clusters = scoped_manual_clusters_with_issues(plan, state) + triage_issue_ids = active_triage_issue_ids(plan, state) or None + triage_scope = active_triage_issue_scope(plan, state) + open_review_ids = open_review_ids_from_state(state) if triage_scope is None else triage_scope + if not open_review_ids and not manual_clusters: return True, "" failures = run_enrich_quality_checks( plan, repo_root, phase_label="sense-check", + triage_issue_ids=triage_issue_ids, ) if failures: return False, failures[0].message @@ -232,11 +258,24 @@ def _validate_sense_check_stage( blocking_pf = [failure for failure in path_failures if failure.blocking] if blocking_pf: return False, blocking_pf[0].message - sc_clusters = manual_clusters_with_issues(plan) - cluster_failures = validate_report_references_clusters(report, sc_clusters) + cluster_failures = validate_report_references_clusters(report, manual_clusters) blocking_cf = [failure for failure in cluster_failures if failure.blocking] if blocking_cf: return False, blocking_cf[0].message + # Decision Ledger validation (value subagent output) + targets = value_check_targets(plan, state) + if targets: + parsed = parse_value_check_decision_ledger(report) + if not parsed.entries: + return False, "Sense-check report missing `## Decision Ledger` entries." + if parsed.duplicates: + return False, f"Sense-check report duplicates decision targets: {', '.join(parsed.duplicates[:5])}" + missing = [target for target in targets if target not in parsed.entries] + if missing: + return False, f"Sense-check report missing decision(s) for: {', '.join(missing[:5])}" + extras = [target for target in parsed.entries if target not in targets] + if extras: + return False, f"Sense-check report references non-live target(s): {', '.join(extras[:5])}" return True, "" @@ -258,7 +297,7 @@ def validate_stage( ), "reflect": lambda: _validate_reflect_stage(stages), "organize": lambda: _validate_organize_stage(plan, state, stages), - "enrich": lambda: _validate_enrich_stage(plan, repo_root, stages), + "enrich": lambda: _validate_enrich_stage(plan, state, repo_root, stages), "sense-check": lambda: _validate_sense_check_stage(plan, state, repo_root, stages), } validator = validators.get(stage) @@ -314,14 +353,15 @@ def validate_completion( if not ok: return ok, message - open_review_ids = open_review_ids_from_state(state) - manual = manual_clusters_with_issues(plan) + triage_scope = active_triage_issue_scope(plan, state) + open_review_ids = open_review_ids_from_state(state) if triage_scope is None else triage_scope + manual = scoped_manual_clusters_with_issues(plan, state) if not open_review_ids and not manual: return True, "" if not manual: return False, "No manual clusters with issues." - gaps = unenriched_clusters(plan) + gaps = unenriched_clusters(plan, state) if gaps: return False, f"{len(gaps)} cluster(s) still need enrichment." @@ -329,7 +369,7 @@ def validate_completion( if unclustered: return False, f"{len(unclustered)} review issue(s) not in any cluster." - clusters = plan.get("clusters", {}) + clusters = triage_scoped_plan(plan, state).get("clusters", {}) ok, message = _validate_cluster_dependency_cycles(clusters) if not ok: return ok, message @@ -370,7 +410,7 @@ def build_auto_attestation( ) if stage == "organize": - cluster_names = manual_clusters_with_issues(plan) + cluster_names = scoped_manual_clusters_with_issues(plan) if not cluster_names: return ( "I verified there are zero open review issues in this organize batch, " @@ -384,7 +424,7 @@ def build_auto_attestation( ) if stage == "enrich": - cluster_names = manual_clusters_with_issues(plan) + cluster_names = scoped_manual_clusters_with_issues(plan) if not cluster_names: return ( "I verified there are zero open review issues in this enrich batch, " @@ -398,7 +438,7 @@ def build_auto_attestation( ) if stage == "sense-check": - cluster_names = manual_clusters_with_issues(plan) + cluster_names = scoped_manual_clusters_with_issues(plan) if not cluster_names: return ( "I verified there are zero open review issues in this sense-check batch, " @@ -406,9 +446,9 @@ def build_auto_attestation( ) names_str = ", ".join(cluster_names[:3]) return ( - f"Content and structure verified for clusters including {names_str}. " + f"Content, structure and value verified for clusters including {names_str}. " f"All step details are factually accurate, cross-cluster dependencies " - f"are safe, and enrich-level checks pass." + f"are safe, enrich-level checks pass, and value decisions are recorded." ) return f"Stage {stage} completed with thorough analysis of all available data and verified against codebase." diff --git a/desloppify/app/commands/plan/triage/stages/completion.py b/desloppify/app/commands/plan/triage/stages/completion.py index 688b6b03..3972280e 100644 --- a/desloppify/app/commands/plan/triage/stages/completion.py +++ b/desloppify/app/commands/plan/triage/stages/completion.py @@ -9,8 +9,7 @@ from .records import record_confirm_existing_completion from .rendering import _print_complete_summary -from ..validation.core import ( - _auto_confirm_enrich_for_complete, +from ..validation.completion_policy import ( _completion_clusters_valid, _completion_strategy_valid, _confirm_existing_stages_valid, @@ -18,15 +17,16 @@ _confirm_strategy_valid, _confirmed_text_or_error, _note_cites_new_issues_or_error, - _require_enrich_stage_for_complete, - _require_organize_stage_for_complete, _require_prior_strategy_for_confirm, - _require_sense_check_stage_for_complete, _resolve_completion_strategy, _resolve_confirm_existing_strategy, ) from ..validation.completion_stages import ( + _auto_confirm_enrich_for_complete, _auto_confirm_stage_for_complete, + _require_enrich_stage_for_complete, + _require_organize_stage_for_complete, + _require_sense_check_stage_for_complete, ) from ..validation.enrich_checks import _underspecified_steps from ..completion_flow import apply_completion @@ -38,6 +38,7 @@ ) from ..stage_queue import has_triage_in_queue from ..services import TriageServices, default_triage_services +from .helpers import active_triage_issue_scope, triage_scoped_plan def _print_completion_coverage_warning(*, organized: int, total: int) -> None: @@ -169,7 +170,8 @@ def _cmd_triage_complete( stages = meta.get("triage_stages", {}) state = resolved_services.command_runtime(args).state - review_ids = open_review_ids_from_state(state) + triage_scope = active_triage_issue_scope(plan, state) + review_ids = open_review_ids_from_state(state) if triage_scope is None else triage_scope # Organize gate if not _require_organize_stage_for_complete(plan=plan, meta=meta, stages=stages): @@ -181,7 +183,7 @@ def _cmd_triage_complete( return # Enrich gate — compute underspecified steps once, share across require + confirm - underspec = _underspecified_steps(plan) + underspec = _underspecified_steps(triage_scoped_plan(plan, state)) if not _require_enrich_stage_for_complete( plan=plan, meta=meta, stages=stages, underspec=underspec, ): diff --git a/desloppify/app/commands/plan/triage/stages/evidence_parsing.py b/desloppify/app/commands/plan/triage/stages/evidence_parsing.py index c5eed56c..2ed5c233 100644 --- a/desloppify/app/commands/plan/triage/stages/evidence_parsing.py +++ b/desloppify/app/commands/plan/triage/stages/evidence_parsing.py @@ -58,6 +58,14 @@ class ObserveEvidence: has_parseable_ids: bool = True # False if valid_ids had no hex-hash IDs +@dataclass +class DecisionLedger: + """Parsed keep/tighten/skip coverage from a value-check report.""" + + entries: dict[str, str] = field(default_factory=dict) + duplicates: list[str] = field(default_factory=list) + + # --------------------------------------------------------------------------- # OBSERVE evidence parsing — structured template format # --------------------------------------------------------------------------- @@ -422,6 +430,29 @@ def validate_report_has_file_paths(report: str) -> list[EvidenceFailure]: )] +_VALUE_LEDGER_RE = re.compile( + r"^\s*-\s*(?P<target>.+?)\s*->\s*(?P<decision>keep|tighten|skip)\s*$", + re.IGNORECASE, +) + + +def parse_value_check_decision_ledger(report: str) -> DecisionLedger: + """Parse `## Decision Ledger` lines from a value-check report.""" + entries: dict[str, str] = {} + duplicates: list[str] = [] + for line in report.splitlines(): + match = _VALUE_LEDGER_RE.match(line) + if match is None: + continue + target = match.group("target").strip() + decision = match.group("decision").strip().lower() + if target in entries: + duplicates.append(target) + continue + entries[target] = decision + return DecisionLedger(entries=entries, duplicates=duplicates) + + # --------------------------------------------------------------------------- # Shared output helpers # --------------------------------------------------------------------------- @@ -466,11 +497,13 @@ def resolve_short_hash_to_full_id(short_hash: str, valid_ids: set[str]) -> str | __all__ = [ + "DecisionLedger", "EvidenceFailure", "ObserveAssessment", "ObserveEvidence", "VERDICT_KEYWORDS", "format_evidence_failures", + "parse_value_check_decision_ledger", "parse_observe_evidence", "resolve_short_hash_to_full_id", "validate_observe_evidence", diff --git a/desloppify/app/commands/plan/triage/stages/helpers.py b/desloppify/app/commands/plan/triage/stages/helpers.py index 1df5d1e4..880292aa 100644 --- a/desloppify/app/commands/plan/triage/stages/helpers.py +++ b/desloppify/app/commands/plan/triage/stages/helpers.py @@ -7,7 +7,12 @@ from desloppify.engine._state.issue_semantics import is_triage_finding from desloppify.engine.plan_triage import TRIAGE_IDS -from ..review_coverage import cluster_issue_ids, live_active_triage_issue_ids +from ..review_coverage import ( + active_triage_issue_ids, + cluster_issue_ids, + live_active_triage_issue_ids, + manual_clusters_with_issues, +) def _require_triage_pending(plan: dict, *, action: str) -> bool: @@ -47,7 +52,63 @@ def _validate_stage_report( return cleaned -def unenriched_clusters(plan: dict) -> list[tuple[str, list[str]]]: +def active_triage_issue_scope( + plan: dict, + state: dict | None = None, +) -> set[str] | None: + """Return the active triage issue scope, or None when no scope is frozen. + + `None` means "do not scope" for legacy/non-triage flows. + An empty set means a frozen triage run exists but none of its issues are live. + """ + frozen = active_triage_issue_ids(plan, state) + if not frozen: + return None + if state is None: + return frozen + return live_active_triage_issue_ids(plan, state) + + +def scoped_manual_clusters_with_issues( + plan: dict, + state: dict | None = None, +) -> list[str]: + """Return manual clusters relevant to the current triage session.""" + scope = active_triage_issue_scope(plan, state) + clusters = plan.get("clusters", {}) + names = manual_clusters_with_issues(plan) + if scope is None: + return names + return [ + name + for name in names + if set(cluster_issue_ids(clusters.get(name, {}))) & scope + ] + + +def triage_scoped_plan( + plan: dict, + state: dict | None = None, +) -> dict: + """Return a plan view filtered to the current triage session when active.""" + scope = active_triage_issue_scope(plan, state) + if scope is None: + return plan + allowed = set(scoped_manual_clusters_with_issues(plan, state)) + return { + **plan, + "clusters": { + name: cluster + for name, cluster in plan.get("clusters", {}).items() + if name in allowed + }, + } + + +def unenriched_clusters( + plan: dict, + state: dict | None = None, +) -> list[tuple[str, list[str]]]: """Return clusters with issues that are missing required enrichment. Requirements: @@ -57,12 +118,10 @@ def unenriched_clusters(plan: dict) -> list[tuple[str, list[str]]]: steps overall (cluster-level plan is sufficient). """ gaps: list[tuple[str, list[str]]] = [] - for name, cluster in plan.get("clusters", {}).items(): + clusters = plan.get("clusters", {}) + for name in scoped_manual_clusters_with_issues(plan, state): + cluster = clusters.get(name, {}) issue_ids = cluster_issue_ids(cluster) - if not issue_ids: - continue - if cluster.get("auto"): - continue missing: list[str] = [] if not cluster.get("description"): missing.append("description") @@ -116,3 +175,17 @@ def unclustered_review_issues(plan: dict, state: dict | None = None) -> list[str fid for fid in review_ids if fid not in clustered_ids and fid not in skipped_ids ] + + +def value_check_targets(plan: dict, state: dict | None = None) -> list[str]: + """Return the current execution targets that value-check must judge once each.""" + targets = list(scoped_manual_clusters_with_issues(plan, state)) + targets.extend(unclustered_review_issues(plan, state)) + seen: set[str] = set() + ordered: list[str] = [] + for target in targets: + if target in seen: + continue + seen.add(target) + ordered.append(target) + return ordered diff --git a/desloppify/app/commands/plan/triage/stages/observe.py b/desloppify/app/commands/plan/triage/stages/observe.py index 26362bbc..081089c2 100644 --- a/desloppify/app/commands/plan/triage/stages/observe.py +++ b/desloppify/app/commands/plan/triage/stages/observe.py @@ -14,6 +14,7 @@ print_cascade_clear_feedback, ) from ..lifecycle import TriageLifecycleDeps, ensure_triage_started +from ..observe_batches import observe_dimension_breakdown from ..services import TriageServices, default_triage_services from .flow_helpers import validate_stage_report_length from .records import record_observe_stage, resolve_reusable_report @@ -27,7 +28,7 @@ def cmd_stage_observe( has_triage_in_queue_fn=has_triage_in_queue, inject_triage_stages_fn=inject_triage_stages, ) -> None: - """Record the OBSERVE stage: agent analyses themes and root causes.""" + """Record the OBSERVE stage: verify each queued issue against the code.""" report: str | None = getattr(args, "report", None) attestation: str | None = getattr(args, "attestation", None) @@ -71,6 +72,8 @@ def cmd_stage_observe( cited_ids=[], existing_stage=existing_stage, is_reuse=is_reuse, + dimension_names=[], + dimension_counts={}, ) resolved_services.save_plan(plan) print(colorize(" Observe stage recorded (no issues to analyse).", "green")) @@ -80,10 +83,14 @@ def cmd_stage_observe( print_cascade_clear_feedback(cleared, stages) return + by_dim, dim_names = observe_dimension_breakdown(si) if not validate_stage_report_length( report=report, issue_count=issue_count, - guidance=" Describe themes, root causes, contradictions, and how issues relate.", + guidance=( + " Verify each issue with code evidence, record the verdicts you reached," + " and cite the files you read." + ), ): return @@ -145,6 +152,8 @@ def cmd_stage_observe( existing_stage=existing_stage, is_reuse=is_reuse, assessments=assessments, + dimension_names=dim_names, + dimension_counts=by_dim, ) resolved_services.save_plan(plan) resolved_services.append_log_entry( diff --git a/desloppify/app/commands/plan/triage/stages/organize.py b/desloppify/app/commands/plan/triage/stages/organize.py index eac3de70..5c007af8 100644 --- a/desloppify/app/commands/plan/triage/stages/organize.py +++ b/desloppify/app/commands/plan/triage/stages/organize.py @@ -22,10 +22,27 @@ _unclustered_review_issues_or_error, _validate_organize_against_ledger_or_error, ) -from ..validation.core import _require_reflect_stage_for_organize +from ..validation.stage_policy import require_prerequisite from .records import record_organize_stage +def _require_reflect_stage_for_organize(stages: dict) -> bool: + return require_prerequisite( + stages, + flow="organize", + messages={ + "observe": ( + " Cannot organize: observe stage not complete.", + ' Run: desloppify plan triage --stage observe --report "..."', + ), + "reflect": ( + " Cannot organize: reflect stage not complete.", + ' Run: desloppify plan triage --stage reflect --report "..."', + ), + }, + ) + + def _enforce_cluster_activity_for_organize( *, plan: dict, diff --git a/desloppify/app/commands/plan/triage/stages/records.py b/desloppify/app/commands/plan/triage/stages/records.py index 914a4a01..3ece1f45 100644 --- a/desloppify/app/commands/plan/triage/stages/records.py +++ b/desloppify/app/commands/plan/triage/stages/records.py @@ -73,6 +73,7 @@ class SenseCheckRecord(TypedDict, total=False): timestamp: str confirmed_at: str confirmed_text: str + value_decisions: dict[str, str] TriageStages = dict[ diff --git a/desloppify/app/commands/plan/triage/stages/reflect.py b/desloppify/app/commands/plan/triage/stages/reflect.py index 02b41157..52f512ba 100644 --- a/desloppify/app/commands/plan/triage/stages/reflect.py +++ b/desloppify/app/commands/plan/triage/stages/reflect.py @@ -10,18 +10,43 @@ from ..display.dashboard import print_reflect_result from ..stage_queue import cascade_clear_dispositions, cascade_clear_later_confirmations, has_triage_in_queue from ..services import TriageServices, default_triage_services -from ..validation.core import ( +from ..validation.reflect_accounting import ( ReflectDisposition, - _validate_recurring_dimension_mentions, parse_reflect_dispositions, + validate_reflect_accounting, ) -from ..validation.reflect_accounting import validate_reflect_accounting from ..validation.stage_policy import auto_confirm_observe_if_attested from .flow_helpers import validate_stage_report_length from .records import resolve_reusable_report from .rendering import _print_reflect_report_requirement +def _validate_recurring_dimension_mentions( + *, + report: str, + recurring_dims: list[str], + recurring: dict[str, dict[str, list[str]]], +) -> bool: + if not recurring_dims: + return True + report_lower = report.lower() + mentioned = [dim for dim in recurring_dims if dim.lower() in report_lower] + if mentioned: + return True + print(colorize(" Recurring patterns detected but not addressed in report:", "red")) + for dim in recurring_dims: + info = recurring[dim] + print( + colorize( + f" {dim}: {len(info['resolved'])} resolved, " + f"{len(info['open'])} still open — potential loop", + "yellow", + ) + ) + print(colorize(" Your report must mention at least one recurring dimension name.", "dim")) + return False + + def _validate_reflect_submission( *, report: str, diff --git a/desloppify/app/commands/plan/triage/stages/rendering.py b/desloppify/app/commands/plan/triage/stages/rendering.py index de644ad4..d3ad6dac 100644 --- a/desloppify/app/commands/plan/triage/stages/rendering.py +++ b/desloppify/app/commands/plan/triage/stages/rendering.py @@ -10,9 +10,9 @@ def _print_observe_report_requirement() -> None: print(colorize(" --report is required for --stage observe.", "red")) - print(colorize(" Write an analysis of the issues: themes, root causes, contradictions.", "dim")) - print(colorize(" Identify issues that contradict each other (opposite recommendations).", "dim")) - print(colorize(" Do NOT just list issue IDs — describe what you actually observe.", "dim")) + print(colorize(" Verify the queued issues one by one against the code.", "dim")) + print(colorize(" State whether each issue is genuine, false positive, exaggerated, or not worth fixing.", "dim")) + print(colorize(" Cite the files you read and the concrete evidence behind each verdict.", "dim")) def _print_reflect_report_requirement() -> None: @@ -51,7 +51,7 @@ def _print_complete_summary(plan: dict, stages: dict) -> None: else: print(colorize(" Enrich: all steps detailed", "dim")) if "sense-check" in stages: - print(colorize(" Sense-check: content & structure verified", "dim")) + print(colorize(" Sense-check: content, structure & value verified", "dim")) def _print_new_issues_since_last(si) -> None: diff --git a/desloppify/app/commands/plan/triage/validation/completion_policy.py b/desloppify/app/commands/plan/triage/validation/completion_policy.py index 7897e6b2..cfa3dcbd 100644 --- a/desloppify/app/commands/plan/triage/validation/completion_policy.py +++ b/desloppify/app/commands/plan/triage/validation/completion_policy.py @@ -9,10 +9,20 @@ from ..display.dashboard import show_plan_summary from ..review_coverage import ( cluster_issue_ids, - manual_clusters_with_issues, open_review_ids_from_state, ) -from ..stages.helpers import unclustered_review_issues, unenriched_clusters +from ..stages.helpers import ( + active_triage_issue_scope, + scoped_manual_clusters_with_issues, + unclustered_review_issues, + unenriched_clusters, +) +from .completion_stages import ( + _auto_confirm_enrich_for_complete, + _require_enrich_stage_for_complete, + _require_organize_stage_for_complete, + _require_sense_check_stage_for_complete, +) def _resolve_strategy_input( @@ -59,10 +69,14 @@ def _strategy_valid_or_error( def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: - if state is not None and not open_review_ids_from_state(state): + triage_scope = active_triage_issue_scope(plan, state) + in_scope_open_ids = ( + open_review_ids_from_state(state) if state is not None and triage_scope is None else (triage_scope or set()) + ) + if state is not None and not in_scope_open_ids: return True - manual_clusters = manual_clusters_with_issues(plan) + manual_clusters = scoped_manual_clusters_with_issues(plan, state) if not manual_clusters: any_clusters = [ name for name, cluster in plan.get("clusters", {}).items() @@ -73,7 +87,7 @@ def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: print(colorize(' Create clusters: desloppify plan cluster create <name> --description "..."', "dim")) return False - gaps = unenriched_clusters(plan) + gaps = unenriched_clusters(plan, state) if gaps: print(colorize(f" Cannot complete: {len(gaps)} cluster(s) still need enrichment.", "red")) for name, missing in gaps: @@ -193,6 +207,7 @@ def _note_cites_new_issues_or_error(note: str, si) -> bool: __all__ = [ + "_auto_confirm_enrich_for_complete", "_completion_clusters_valid", "_completion_strategy_valid", "_confirm_existing_stages_valid", @@ -200,7 +215,10 @@ def _note_cites_new_issues_or_error(note: str, si) -> bool: "_confirm_strategy_valid", "_confirmed_text_or_error", "_note_cites_new_issues_or_error", + "_require_enrich_stage_for_complete", + "_require_organize_stage_for_complete", "_require_prior_strategy_for_confirm", + "_require_sense_check_stage_for_complete", "_resolve_completion_strategy", "_resolve_confirm_existing_strategy", ] diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index 5563f5f4..4adbc09f 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -27,6 +27,7 @@ reconcile_plan, ) from desloppify.engine._plan.sync.workflow_gates import sync_import_scores_needed +from desloppify.engine._plan.sync.workflow import clear_score_communicated_sentinel from desloppify.engine.plan_triage import ( TRIAGE_CMD_RUN_STAGES_CLAUDE, TRIAGE_CMD_RUN_STAGES_CODEX, @@ -63,9 +64,11 @@ def _print_review_import_sync( """Print summary of plan changes after review import sync.""" new_ids = result.new_ids stale_pruned = result.stale_pruned_from_queue + covered_pruned = getattr(result, "covered_subjective_pruned_from_queue", []) print() _print_new_review_items(state, new_ids) _print_stale_review_prunes(stale_pruned) + _print_covered_subjective_prunes(covered_pruned) _print_review_import_footer( workflow_injected=workflow_injected, triage_injected=triage_injected, @@ -100,6 +103,17 @@ def _print_stale_review_prunes(stale_pruned: list[str]) -> None: ) +def _print_covered_subjective_prunes(covered_pruned: list[str]) -> None: + if not covered_pruned: + return + print( + colorize( + f" Plan updated: {len(covered_pruned)} covered subjective queue item(s) removed.", + "bold", + ) + ) + + def _print_review_import_footer( *, workflow_injected: bool, @@ -183,6 +197,49 @@ def _sync_review_delta( ) +def _prune_covered_subjective_ids_from_plan( + plan: dict, + *, + covered_ids: tuple[str, ...], +) -> list[str]: + """Prune subjective queue placeholders that were just covered by review import.""" + covered = { + issue_id + for issue_id in covered_ids + if isinstance(issue_id, str) and issue_id.startswith("subjective::") + } + if not covered: + return [] + + order = plan.get("queue_order") + if not isinstance(order, list): + return [] + + pruned = [issue_id for issue_id in order if issue_id in covered] + if not pruned: + return [] + + pruned_set = set(pruned) + order[:] = [issue_id for issue_id in order if issue_id not in pruned_set] + + overrides = plan.get("overrides") + if isinstance(overrides, dict): + for issue_id in pruned_set: + overrides.pop(issue_id, None) + + for cluster in plan.get("clusters", {}).values(): + if not isinstance(cluster, dict): + continue + issue_ids = cluster.get("issue_ids") + if not isinstance(issue_ids, list): + continue + cluster["issue_ids"] = [ + issue_id for issue_id in issue_ids if issue_id not in pruned_set + ] + + return pruned + + def _append_review_import_sync_log( plan: dict, diff: dict, @@ -219,6 +276,11 @@ def _append_review_import_sync_log( "stale_pruned_from_queue": ( import_result.stale_pruned_from_queue if import_result is not None else [] ), + "covered_subjective_pruned_from_queue": ( + getattr(import_result, "covered_subjective_pruned_from_queue", []) + if import_result is not None + else [] + ), "covered_subjective": list(covered_ids), "stale_sync_injected": sorted(subjective.injected) if subjective is not None else [], "stale_sync_pruned": sorted(subjective.pruned) if subjective is not None else [], @@ -253,8 +315,14 @@ def sync_plan_after_import( plan = load_plan(plan_path) sync_inputs = _build_import_sync_inputs(diff, import_payload) trusted = assessment_mode in {"trusted_internal", "attested_external"} + was_boundary_ready = live_planned_queue_empty(plan) import_result = _sync_review_delta(plan, state, sync_inputs) + covered_pruned = ( + _prune_covered_subjective_ids_from_plan(plan, covered_ids=sync_inputs.covered_ids) + if trusted + else [] + ) import_scores_result = sync_import_scores_needed( plan, state, @@ -263,13 +331,32 @@ def sync_plan_after_import( import_payload=import_payload, ) if trusted: - plan.pop("previous_plan_start_scores", None) + clear_score_communicated_sentinel(plan) result = ReconcileResult() - if live_planned_queue_empty(plan): + if was_boundary_ready and ( + sync_inputs.has_review_issue_delta + or import_scores_result.changes + or (trusted and bool(sync_inputs.covered_ids)) + ): result = reconcile_plan(plan, state, target_strict=target_strict) + if import_result is not None and covered_pruned: + import_result = ReviewImportSyncResult( + new_ids=import_result.new_ids, + added_to_queue=import_result.added_to_queue, + triage_injected=import_result.triage_injected, + stale_pruned_from_queue=import_result.stale_pruned_from_queue, + covered_subjective_pruned_from_queue=covered_pruned, + triage_injected_ids=import_result.triage_injected_ids, + triage_deferred=import_result.triage_deferred, + ) - dirty = bool(import_result is not None or import_scores_result.changes or result.dirty) + dirty = bool( + import_result is not None + or covered_pruned + or import_scores_result.changes + or result.dirty + ) if dirty: _append_review_import_sync_log( plan, diff --git a/desloppify/app/commands/scan/plan_reconcile.py b/desloppify/app/commands/scan/plan_reconcile.py index cfd924c1..95fbd125 100644 --- a/desloppify/app/commands/scan/plan_reconcile.py +++ b/desloppify/app/commands/scan/plan_reconcile.py @@ -25,7 +25,9 @@ live_planned_queue_empty, reconcile_plan, ) +from desloppify.engine._plan.sync.dimensions import current_unscored_ids from desloppify.engine._plan.sync.context import is_mid_cycle +from desloppify.engine._plan.sync.workflow import clear_score_communicated_sentinel from desloppify.engine.work_queue import build_deferred_disposition_item logger = logging.getLogger(__name__) @@ -40,7 +42,7 @@ def _reset_cycle_for_force_rescan(plan: dict[str, object]) -> bool: for item in synthetic: order.remove(item) plan["plan_start_scores"] = {} - plan.pop("previous_plan_start_scores", None) + clear_score_communicated_sentinel(plan) plan.pop("scan_count_at_plan_start", None) meta = plan.get("epic_triage_meta", {}) if isinstance(meta, dict): @@ -96,7 +98,7 @@ def _seed_plan_start_scores(plan: dict[str, object], state: state_mod.StateModel "objective": scores.objective, "verified": scores.verified, } - plan.pop("previous_plan_start_scores", None) + clear_score_communicated_sentinel(plan) plan["scan_count_at_plan_start"] = int(state.get("scan_count", 0) or 0) return True @@ -142,7 +144,7 @@ def _clear_plan_start_scores_if_queue_empty( return False state["_plan_start_scores_for_reveal"] = dict(plan["plan_start_scores"]) plan["plan_start_scores"] = {} - plan.pop("previous_plan_start_scores", None) + clear_score_communicated_sentinel(plan) return True @@ -150,11 +152,10 @@ def _mark_postflight_scan_completed_if_ready( state: state_mod.StateModel, plan: dict[str, object], ) -> bool: - """Record that the scan stage completed for the current empty-queue boundary.""" - if build_deferred_disposition_item(plan) is not None: + """Record that the cycle's post-review scan has completed.""" + if plan.get("plan_start_scores") and current_unscored_ids(state): return False - objective_cycle = _has_objective_cycle(state, plan) - if objective_cycle is not False: + if build_deferred_disposition_item(plan) is not None: return False return mark_postflight_scan_completed( plan, diff --git a/desloppify/app/commands/scan/workflow.py b/desloppify/app/commands/scan/workflow.py index 6f592488..6f289355 100644 --- a/desloppify/app/commands/scan/workflow.py +++ b/desloppify/app/commands/scan/workflow.py @@ -420,6 +420,7 @@ def merge_scan_results( include_slow=runtime.effective_include_slow, ignore=runtime.config.get("ignore", []), subjective_integrity_target=target_score, + project_root=str(get_project_root()), ), ) diff --git a/desloppify/engine/_plan/constants.py b/desloppify/engine/_plan/constants.py index 77fd90cc..27de6256 100644 --- a/desloppify/engine/_plan/constants.py +++ b/desloppify/engine/_plan/constants.py @@ -19,6 +19,9 @@ "triage::sense-check", "triage::commit", ) +# value-check was folded into sense-check as a subagent in v0.9.9. +# Old plan.json files may still contain triage_stages["value-check"] data; +# it is silently ignored because _TRIAGE_STAGE_NAMES no longer includes it. TRIAGE_STAGE_SPECS = tuple( (stage_id.removeprefix("triage::"), stage_id) for stage_id in TRIAGE_STAGE_IDS ) diff --git a/desloppify/engine/_plan/refresh_lifecycle.py b/desloppify/engine/_plan/refresh_lifecycle.py index 4e982663..4c97635b 100644 --- a/desloppify/engine/_plan/refresh_lifecycle.py +++ b/desloppify/engine/_plan/refresh_lifecycle.py @@ -1,10 +1,4 @@ -"""Helpers for the persisted queue lifecycle phase. - -The persisted phase is the normal source of truth for CLI/debugging, but it is -not trusted blindly. Queue assembly still re-resolves the active phase from the -currently visible items as a safety net so stale saved state cannot strand the -user in the wrong phase after out-of-band changes. -""" +"""Helpers for the persisted queue lifecycle phase.""" from __future__ import annotations @@ -17,20 +11,33 @@ _POSTFLIGHT_SCAN_KEY = "postflight_scan_completed_at_scan_count" _LIFECYCLE_PHASE_KEY = "lifecycle_phase" +LIFECYCLE_PHASE_REVIEW_INITIAL = "review_initial" +LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT = "assessment_postflight" +LIFECYCLE_PHASE_REVIEW_POSTFLIGHT = "review_postflight" +LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT = "workflow_postflight" +LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT = "triage_postflight" +LIFECYCLE_PHASE_EXECUTE = "execute" LIFECYCLE_PHASE_SCAN = "scan" + +# Coarse lifecycle names remain valid persisted values for older plan data. LIFECYCLE_PHASE_REVIEW = "review" LIFECYCLE_PHASE_WORKFLOW = "workflow" LIFECYCLE_PHASE_TRIAGE = "triage" -LIFECYCLE_PHASE_EXECUTE = "execute" -VALID_LIFECYCLE_PHASES = frozenset( - { - LIFECYCLE_PHASE_SCAN, - LIFECYCLE_PHASE_REVIEW, - LIFECYCLE_PHASE_WORKFLOW, - LIFECYCLE_PHASE_TRIAGE, - LIFECYCLE_PHASE_EXECUTE, - } -) + +COARSE_PHASE_MAP = { + LIFECYCLE_PHASE_REVIEW_INITIAL: LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT: LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT: LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT: LIFECYCLE_PHASE_WORKFLOW, + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT: LIFECYCLE_PHASE_TRIAGE, + LIFECYCLE_PHASE_EXECUTE: LIFECYCLE_PHASE_EXECUTE, + LIFECYCLE_PHASE_SCAN: LIFECYCLE_PHASE_SCAN, + LIFECYCLE_PHASE_REVIEW: LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_WORKFLOW: LIFECYCLE_PHASE_WORKFLOW, + LIFECYCLE_PHASE_TRIAGE: LIFECYCLE_PHASE_TRIAGE, +} + +VALID_LIFECYCLE_PHASES = frozenset(COARSE_PHASE_MAP) def _refresh_state(plan: PlanModel) -> dict[str, object]: @@ -103,56 +110,14 @@ def set_lifecycle_phase(plan: PlanModel, phase: str) -> bool: return True -def sync_lifecycle_phase( - plan: PlanModel, - *, - has_initial_reviews: bool, - has_objective_backlog: bool, - has_postflight_review: bool, - has_postflight_workflow: bool, - has_triage: bool, - has_deferred: bool, -) -> tuple[str, bool]: - """Resolve and persist the current lifecycle phase from queue-state facts.""" - phase = resolve_lifecycle_phase( - plan, - has_initial_reviews=has_initial_reviews, - has_objective_backlog=has_objective_backlog, - has_postflight_review=has_postflight_review, - has_postflight_workflow=has_postflight_workflow, - has_triage=has_triage, - has_deferred=has_deferred, - ) - return phase, set_lifecycle_phase(plan, phase) - - -def resolve_lifecycle_phase( - plan: PlanModel, - *, - has_initial_reviews: bool, - has_objective_backlog: bool, - has_postflight_review: bool, - has_postflight_workflow: bool, - has_triage: bool, - has_deferred: bool, -) -> str: - """Resolve the lifecycle phase from explicit queue-state facts.""" - if has_initial_reviews: - return LIFECYCLE_PHASE_REVIEW - if has_objective_backlog: - return LIFECYCLE_PHASE_EXECUTE - if has_deferred or postflight_scan_pending(plan): - return LIFECYCLE_PHASE_SCAN - if has_postflight_review: - return LIFECYCLE_PHASE_REVIEW - if has_postflight_workflow: - return LIFECYCLE_PHASE_WORKFLOW - if has_triage: - return LIFECYCLE_PHASE_TRIAGE - persisted = current_lifecycle_phase(plan) - if persisted is not None: - return persisted - return LIFECYCLE_PHASE_SCAN +def coarse_lifecycle_phase(plan: PlanModel | None) -> str | None: + """Return the coarse lifecycle phase for persisted fine/coarse plan data.""" + if not isinstance(plan, dict): + return None + phase = current_lifecycle_phase(plan) + if phase is None: + return None + return COARSE_PHASE_MAP.get(phase) def postflight_scan_pending(plan: PlanModel) -> bool: @@ -198,17 +163,22 @@ def clear_postflight_scan_completion( __all__ = [ + "COARSE_PHASE_MAP", + "coarse_lifecycle_phase", + "LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT", "clear_postflight_scan_completion", "current_lifecycle_phase", "LIFECYCLE_PHASE_EXECUTE", "LIFECYCLE_PHASE_REVIEW", + "LIFECYCLE_PHASE_REVIEW_INITIAL", + "LIFECYCLE_PHASE_REVIEW_POSTFLIGHT", "LIFECYCLE_PHASE_SCAN", "LIFECYCLE_PHASE_TRIAGE", + "LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT", "LIFECYCLE_PHASE_WORKFLOW", + "LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT", "mark_postflight_scan_completed", "postflight_scan_pending", - "resolve_lifecycle_phase", "set_lifecycle_phase", - "sync_lifecycle_phase", "VALID_LIFECYCLE_PHASES", ] diff --git a/desloppify/engine/_plan/scan_issue_reconcile.py b/desloppify/engine/_plan/scan_issue_reconcile.py index dfd07839..f8bb75d3 100644 --- a/desloppify/engine/_plan/scan_issue_reconcile.py +++ b/desloppify/engine/_plan/scan_issue_reconcile.py @@ -156,6 +156,59 @@ def _referenced_plan_issue_ids(plan: PlanModel) -> set[str]: } +def _prune_existing_superseded_references( + plan: PlanModel, + *, + result: ReconcileResult, +) -> None: + superseded_ids = { + fid for fid in plan.get("superseded", {}) + if isinstance(fid, str) and fid + } + if not superseded_ids: + return + + changes = 0 + order = plan.get("queue_order", []) + kept_order = [fid for fid in order if fid not in superseded_ids] + if len(kept_order) != len(order): + changes += len(order) - len(kept_order) + order[:] = kept_order + + skipped = plan.get("skipped", {}) + for fid in list(skipped): + if fid in superseded_ids: + skipped.pop(fid, None) + changes += 1 + + promoted_before = len(plan.get("promoted_ids", [])) + prune_promoted_ids(plan, superseded_ids) + changes += max(0, promoted_before - len(plan.get("promoted_ids", []))) + + for cluster in plan.get("clusters", {}).values(): + issue_ids = cluster.get("issue_ids", []) + kept_issue_ids = [fid for fid in issue_ids if fid not in superseded_ids] + if len(kept_issue_ids) != len(issue_ids): + changes += len(issue_ids) - len(kept_issue_ids) + cluster["issue_ids"] = kept_issue_ids + for step in cluster.get("action_steps", []): + if not isinstance(step, dict): + continue + refs = step.get("issue_refs", []) + kept_refs = [fid for fid in refs if fid not in superseded_ids] + if len(kept_refs) != len(refs): + changes += len(refs) - len(kept_refs) + step["issue_refs"] = kept_refs + + for fid in superseded_ids: + override = plan.get("overrides", {}).get(fid) + if override and override.get("cluster"): + override["cluster"] = None + changes += 1 + + result.changes += changes + + def _supersede_dead_references( plan: PlanModel, state: StateModel, @@ -253,6 +306,7 @@ def reconcile_plan_after_scan( now = utc_now() now_dt = datetime.now(UTC) + _prune_existing_superseded_references(plan, result=result) referenced_ids = _referenced_plan_issue_ids(plan) # Snapshot non-epic cluster sizes before superseding so we can detect diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 6012be9b..7d6fbbfa 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -161,9 +161,12 @@ class TriageStagePayload(TypedDict, total=False): cited_ids: list[str] timestamp: str issue_count: int + dimension_names: list[str] + dimension_counts: dict[str, int] recurring_dims: list[str] confirmed_at: str confirmed_text: str + assessments: list[dict[str, Any]] # Structured reflect contract (populated only for reflect stage) disposition_ledger: list[ReflectDisposition] cluster_blueprint: list[ReflectClusterBlueprint] @@ -283,51 +286,12 @@ def triage_clusters(plan: dict[str, Any]) -> dict[str, Cluster]: } -def _tracked_plan_ids(plan: dict[str, Any] | None) -> set[str]: - """Collect live issue IDs the plan is actively tracking.""" - if not isinstance(plan, dict): - return set() - tracked: set[str] = { - str(issue_id) - for issue_id in plan.get("queue_order", []) - if isinstance(issue_id, str) and issue_id - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - } - tracked.update( - str(issue_id) - for issue_id in plan.get("skipped", {}).keys() - if isinstance(issue_id, str) and issue_id - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - ) - tracked.update( - str(issue_id) - for issue_id in plan.get("overrides", {}).keys() - if isinstance(issue_id, str) and issue_id - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - ) - for cluster in plan.get("clusters", {}).values(): - if not isinstance(cluster, dict): - continue - tracked.update( - str(issue_id) - for issue_id in cluster.get("issue_ids", []) - if isinstance(issue_id, str) and issue_id - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - ) - for step in cluster.get("action_steps", []): - if not isinstance(step, dict): - continue - tracked.update( - str(issue_id) - for issue_id in step.get("issue_refs", []) - if isinstance(issue_id, str) and issue_id - and not any(issue_id.startswith(prefix) for prefix in SYNTHETIC_PREFIXES) - ) - return tracked - - def live_planned_queue_ids(plan: dict[str, Any] | None) -> set[str]: - """Return substantive live queue IDs sourced only from ``queue_order``.""" + """Return substantive live queue IDs sourced only from ``queue_order``. + + Overrides and clusters are ownership metadata — they must never expand + the live queue. Only explicit ``queue_order`` entries count. + """ if not isinstance(plan, dict): return set() skipped_ids = set(plan.get("skipped", {}).keys()) @@ -347,19 +311,27 @@ def executable_objective_ids( ) -> set[str]: """Return objective IDs eligible for execution. - Before the plan tracks any live objective work, all objective IDs are - implicitly executable. Once the plan tracks objective IDs, execution - becomes backlog-first and only objective IDs explicitly present in - ``plan["queue_order"]`` remain eligible for ``next``. + Before the plan tracks any queue work at all, all objective IDs are + implicitly executable. Once *any* queue items exist — including synthetic + review/workflow/triage items — execution becomes queue-driven and only + objective IDs explicitly present in ``plan["queue_order"]`` remain + eligible for ``next``. """ if not isinstance(plan, dict): return set(all_objective_ids) skipped_ids = set(plan.get("skipped", {}).keys()) + queued_ids = { + issue_id + for issue_id in plan.get("queue_order", []) + if isinstance(issue_id, str) + and issue_id + and issue_id not in skipped_ids + } live_queue_ids = live_planned_queue_ids(plan) queued_objective_ids = all_objective_ids & live_queue_ids if queued_objective_ids: return queued_objective_ids - if not live_queue_ids: + if not queued_ids: return set(all_objective_ids) - skipped_ids return set() diff --git a/desloppify/engine/_plan/sync/__init__.py b/desloppify/engine/_plan/sync/__init__.py index 511ac78d..068f91b4 100644 --- a/desloppify/engine/_plan/sync/__init__.py +++ b/desloppify/engine/_plan/sync/__init__.py @@ -4,6 +4,7 @@ ``engine._plan`` namespace: - ``context``: shared cycle/objective backlog predicates - ``dimensions``: subjective dimension queue sync +- ``phase_cleanup``: prune stale synthetic IDs on phase transitions - ``pipeline``: shared boundary-triggered reconcile pipeline - ``review_import``: review-import-specific queue mutation before boundary sync - ``triage``: triage-stage queue sync diff --git a/desloppify/engine/_plan/sync/phase_cleanup.py b/desloppify/engine/_plan/sync/phase_cleanup.py new file mode 100644 index 00000000..35154bc4 --- /dev/null +++ b/desloppify/engine/_plan/sync/phase_cleanup.py @@ -0,0 +1,82 @@ +"""Cleanup helpers for stale synthetic queue items across lifecycle phases.""" + +from __future__ import annotations + +from collections.abc import Iterable + +from desloppify.engine._plan.constants import ( + SUBJECTIVE_PREFIX, + TRIAGE_PREFIX, + WORKFLOW_PREFIX, +) +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_EXECUTE, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT, + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, +) +from desloppify.engine._plan.schema import PlanModel, ensure_plan_defaults + + +def _phase_prefixes(phase: str) -> tuple[str, ...]: + if phase == LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT: + return (SUBJECTIVE_PREFIX,) + if phase in {LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, LIFECYCLE_PHASE_REVIEW_POSTFLIGHT}: + return (SUBJECTIVE_PREFIX, WORKFLOW_PREFIX) + if phase == LIFECYCLE_PHASE_EXECUTE: + return (SUBJECTIVE_PREFIX, WORKFLOW_PREFIX, TRIAGE_PREFIX) + return () + + +def _matches_any_prefix(issue_id: str, prefixes: Iterable[str]) -> bool: + return any(issue_id.startswith(prefix) for prefix in prefixes) + + +def prune_synthetic_for_phase(plan: PlanModel, phase: str) -> list[str]: + """Remove synthetic IDs that should not survive into ``phase``.""" + ensure_plan_defaults(plan) + prefixes = _phase_prefixes(phase) + if not prefixes: + return [] + + pruned: list[str] = [] + seen: set[str] = set() + + queue_order = plan.get("queue_order", []) + kept_order: list[str] = [] + for raw_id in queue_order: + if not isinstance(raw_id, str) or not _matches_any_prefix(raw_id, prefixes): + kept_order.append(raw_id) + continue + if raw_id not in seen: + pruned.append(raw_id) + seen.add(raw_id) + plan["queue_order"] = kept_order + + overrides = plan.get("overrides") + if isinstance(overrides, dict): + for issue_id in list(overrides): + if isinstance(issue_id, str) and _matches_any_prefix(issue_id, prefixes): + overrides.pop(issue_id, None) + + clusters = plan.get("clusters") + if isinstance(clusters, dict): + for cluster in clusters.values(): + if not isinstance(cluster, dict): + continue + issue_ids = cluster.get("issue_ids") + if not isinstance(issue_ids, list): + continue + cluster["issue_ids"] = [ + issue_id + for issue_id in issue_ids + if not ( + isinstance(issue_id, str) + and _matches_any_prefix(issue_id, prefixes) + ) + ] + + return pruned + + +__all__ = ["prune_synthetic_for_phase"] diff --git a/desloppify/engine/_plan/sync/pipeline.py b/desloppify/engine/_plan/sync/pipeline.py index 3f8e80fd..f64ccdd8 100644 --- a/desloppify/engine/_plan/sync/pipeline.py +++ b/desloppify/engine/_plan/sync/pipeline.py @@ -9,9 +9,21 @@ from desloppify.engine._plan.constants import QueueSyncResult, is_synthetic_id from desloppify.engine._plan.operations.meta import append_log_entry from desloppify.engine._plan.policy.subjective import compute_subjective_visibility -from desloppify.engine._plan.refresh_lifecycle import set_lifecycle_phase +from desloppify.engine._plan.policy.stale import open_review_ids +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT, + LIFECYCLE_PHASE_REVIEW_INITIAL, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT, + LIFECYCLE_PHASE_SCAN, + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, + current_lifecycle_phase, + set_lifecycle_phase, +) from desloppify.engine._plan.sync.dimensions import sync_subjective_dimensions +from desloppify.engine._plan.sync.phase_cleanup import prune_synthetic_for_phase from desloppify.engine._plan.sync.triage import sync_triage_needed +from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._plan.sync.workflow import ( ScoreSnapshot, sync_communicate_score_needed, @@ -30,6 +42,7 @@ class ReconcileResult: triage: QueueSyncResult | None = None lifecycle_phase: str = "" lifecycle_phase_changed: bool = False + phase_cleanup_pruned: list[str] | None = None @property def dirty(self) -> bool: @@ -47,6 +60,7 @@ def dirty(self) -> bool: or getattr(self.triage, "deferred", False) ), self.lifecycle_phase_changed, + bool(self.phase_cleanup_pruned), ) ) @@ -74,20 +88,52 @@ def _log_gate_changes(plan: dict, action: str, detail: dict[str, object]) -> Non append_log_entry(plan, action, actor="system", detail=detail) -def _persist_lifecycle( - plan: dict, state: dict, *, target_strict: float, -) -> tuple[str, bool]: - from desloppify.engine._work_queue.context import queue_context - from desloppify.engine._work_queue.snapshot import coarse_phase_name - - phase = coarse_phase_name( - queue_context(state, plan=plan, target_strict=target_strict).snapshot.phase - ) - return phase, set_lifecycle_phase(plan, phase) +def _resolve_reconcile_phase( + plan: dict, + state: dict, + *, + result: ReconcileResult, + policy: object | None, +) -> str: + order = [item for item in plan.get("queue_order", []) if isinstance(item, str)] + if result.workflow_injected_ids or any(item.startswith("workflow::") for item in order): + return LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT + + if result.triage and (result.triage.injected or result.triage.deferred): + return LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT + if any(item.startswith("triage::") for item in order): + return LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT + + subjective_ids = [item for item in order if item.startswith("subjective::")] + if subjective_ids: + unscored_ids = set(getattr(policy, "unscored_ids", ()) or ()) + if any(item in unscored_ids for item in subjective_ids): + return LIFECYCLE_PHASE_REVIEW_INITIAL + return LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT + + triage_snapshot = build_triage_snapshot(plan, state) + if ( + triage_snapshot.triage_has_run + and not triage_snapshot.has_triage_in_queue + and not triage_snapshot.is_triage_stale + and bool(triage_snapshot.live_open_ids) + ): + return LIFECYCLE_PHASE_REVIEW_POSTFLIGHT + + persisted = current_lifecycle_phase(plan) + if persisted: + return persisted + if open_review_ids(state): + return LIFECYCLE_PHASE_REVIEW_POSTFLIGHT + return LIFECYCLE_PHASE_SCAN def live_planned_queue_empty(plan: dict) -> bool: - """Return True when queue_order has no remaining substantive items.""" + """Return True when queue_order has no remaining substantive items. + + Overrides and clusters are ownership metadata — they must never expand + the live queue. Only explicit ``queue_order`` entries count. + """ order = plan.get("queue_order", []) skipped = plan.get("skipped", {}) return not any( @@ -111,25 +157,38 @@ def reconcile_plan(plan: dict, state: dict, *, target_strict: float) -> Reconcil ) cycle_just_completed = not plan.get("plan_start_scores") - result.subjective = sync_subjective_dimensions( - plan, - state, - policy=policy, - cycle_just_completed=cycle_just_completed, + # Skip subjective sync when workflow will supersede it: all dims are + # scored and communicate-score hasn't fired yet this cycle. The phase + # cleanup safety net still prunes if this peek is wrong. + will_inject_workflow = ( + not policy.unscored_ids + and "previous_plan_start_scores" not in plan ) - if result.subjective.changes: - _log_gate_changes(plan, "sync_subjective", {"changes": True}) - - result.auto_cluster_changes = int( - auto_cluster_issues( + if will_inject_workflow: + result.subjective = QueueSyncResult() + else: + result.subjective = sync_subjective_dimensions( plan, state, - target_strict=target_strict, policy=policy, + cycle_just_completed=cycle_just_completed, ) - ) - if result.auto_cluster_changes: - _log_gate_changes(plan, "auto_cluster", {"changes": True}) + if result.subjective.changes: + _log_gate_changes(plan, "sync_subjective", {"changes": True}) + + if will_inject_workflow: + result.auto_cluster_changes = 0 + else: + result.auto_cluster_changes = int( + auto_cluster_issues( + plan, + state, + target_strict=target_strict, + policy=policy, + ) + ) + if result.auto_cluster_changes: + _log_gate_changes(plan, "auto_cluster", {"changes": True}) result.communicate_score = sync_communicate_score_needed( plan, @@ -156,11 +215,13 @@ def reconcile_plan(plan: dict, state: dict, *, target_strict: float) -> Reconcil if result.triage.injected: _log_gate_changes(plan, "sync_triage", {"injected": True}) - result.lifecycle_phase, result.lifecycle_phase_changed = _persist_lifecycle( + result.lifecycle_phase = _resolve_reconcile_phase( plan, state, - target_strict=target_strict, + result=result, + policy=policy, ) + result.lifecycle_phase_changed = set_lifecycle_phase(plan, result.lifecycle_phase) if result.lifecycle_phase_changed: _log_gate_changes( plan, @@ -168,6 +229,14 @@ def reconcile_plan(plan: dict, state: dict, *, target_strict: float) -> Reconcil {"phase": result.lifecycle_phase}, ) + result.phase_cleanup_pruned = prune_synthetic_for_phase(plan, result.lifecycle_phase) + if result.phase_cleanup_pruned: + _log_gate_changes( + plan, + "phase_transition_cleanup", + {"phase": result.lifecycle_phase, "pruned": list(result.phase_cleanup_pruned)}, + ) + return result diff --git a/desloppify/engine/_plan/sync/review_import.py b/desloppify/engine/_plan/sync/review_import.py index e2efacdc..47835f85 100644 --- a/desloppify/engine/_plan/sync/review_import.py +++ b/desloppify/engine/_plan/sync/review_import.py @@ -23,6 +23,7 @@ class ReviewImportSyncResult: added_to_queue: list[str] triage_injected: bool stale_pruned_from_queue: list[str] = field(default_factory=list) + covered_subjective_pruned_from_queue: list[str] = field(default_factory=list) triage_injected_ids: list[str] = field(default_factory=list) triage_deferred: bool = False diff --git a/desloppify/engine/_plan/sync/triage.py b/desloppify/engine/_plan/sync/triage.py index b9f1f8b2..b520d4d2 100644 --- a/desloppify/engine/_plan/sync/triage.py +++ b/desloppify/engine/_plan/sync/triage.py @@ -67,7 +67,14 @@ def _inject_pending_triage_stages( Always appends to the back — new items never reorder existing queue. Returns list of injected stage IDs. """ - stage_names = ("observe", "reflect", "organize", "enrich", "sense-check", "commit") + stage_names = ( + "observe", + "reflect", + "organize", + "enrich", + "sense-check", + "commit", + ) existing = set(order) injected: list[str] = [] for sid, name in zip(TRIAGE_STAGE_IDS, stage_names, strict=False): diff --git a/desloppify/engine/_plan/sync/workflow.py b/desloppify/engine/_plan/sync/workflow.py index f75708ab..b06a9879 100644 --- a/desloppify/engine/_plan/sync/workflow.py +++ b/desloppify/engine/_plan/sync/workflow.py @@ -258,6 +258,16 @@ def _inject(plan: PlanModel, item_id: str) -> QueueSyncResult: return QueueSyncResult(injected=[item_id]) +def clear_score_communicated_sentinel(plan: PlanModel) -> None: + """Clear the ``previous_plan_start_scores`` sentinel. + + Call this in import/scan pre-steps when a trusted import completes or + a cycle boundary resets. The sentinel gates ``sync_communicate_score_needed`` + — clearing it allows communicate-score to re-inject next cycle. + """ + plan.pop("previous_plan_start_scores", None) + + _EMPTY = QueueSyncResult @@ -458,6 +468,7 @@ def _rebaseline_plan_start_scores( __all__ = [ "PendingImportScoresMeta", "ScoreSnapshot", + "clear_score_communicated_sentinel", "import_scores_meta_matches", "pending_import_scores_meta", "sync_communicate_score_needed", diff --git a/desloppify/engine/_plan/triage/playbook.py b/desloppify/engine/_plan/triage/playbook.py index 26564c81..69ca9234 100644 --- a/desloppify/engine/_plan/triage/playbook.py +++ b/desloppify/engine/_plan/triage/playbook.py @@ -9,7 +9,7 @@ ("reflect", "Form strategy & present to user"), ("organize", "Defer contradictions, cluster, & prioritize"), ("enrich", "Make steps executor-ready (detail, refs)"), - ("sense-check", "Verify accuracy & cross-cluster deps"), + ("sense-check", "Verify accuracy, structure & value"), ("commit", "Write strategy & confirm"), ) diff --git a/desloppify/engine/_plan/triage/snapshot.py b/desloppify/engine/_plan/triage/snapshot.py index 2a307bfb..66457f99 100644 --- a/desloppify/engine/_plan/triage/snapshot.py +++ b/desloppify/engine/_plan/triage/snapshot.py @@ -6,6 +6,7 @@ from desloppify.engine._plan.constants import TRIAGE_IDS, is_synthetic_id from desloppify.engine._plan.policy.stale import open_review_ids +from desloppify.engine._plan.schema import Cluster, PlanModel from desloppify.engine._plan.triage.playbook import TriageProgress, compute_triage_progress from desloppify.engine._state.schema import StateModel @@ -26,7 +27,7 @@ def _normalized_issue_id_list(raw_ids: object) -> list[str]: return normalized -def _cluster_issue_ids(cluster: dict[str, object]) -> list[str]: +def _cluster_issue_ids(cluster: Cluster) -> list[str]: ordered: list[str] = [] seen: set[str] = set() @@ -44,7 +45,7 @@ def _append(raw_ids: object) -> None: _append(cluster.get("issue_ids")) steps = cluster.get("action_steps") - if isinstance(steps, list): + if steps is not None: for step in steps: if not isinstance(step, dict): continue @@ -52,7 +53,7 @@ def _append(raw_ids: object) -> None: return ordered -def plan_review_ids(plan: dict) -> list[str]: +def plan_review_ids(plan: PlanModel) -> list[str]: """Return review/concerns IDs currently represented in queue_order.""" return [ issue_id @@ -63,7 +64,7 @@ def plan_review_ids(plan: dict) -> list[str]: ] -def coverage_open_ids(plan: dict, state: StateModel) -> set[str]: +def coverage_open_ids(plan: PlanModel, state: StateModel) -> set[str]: """Return the frozen or live open review IDs covered by this triage run.""" meta = plan.get("epic_triage_meta", {}) active_ids = _normalized_issue_id_list(meta.get("active_triage_issue_ids")) @@ -76,7 +77,7 @@ def coverage_open_ids(plan: dict, state: StateModel) -> set[str]: return review_ids -def active_triage_issue_ids(plan: dict, state: StateModel | None = None) -> set[str]: +def active_triage_issue_ids(plan: PlanModel, state: StateModel | None = None) -> set[str]: """Return the frozen review issue set for the current triage run.""" meta = plan.get("epic_triage_meta", {}) active_ids = _normalized_issue_id_list(meta.get("active_triage_issue_ids")) @@ -87,12 +88,12 @@ def active_triage_issue_ids(plan: dict, state: StateModel | None = None) -> set[ return coverage_open_ids(plan, state) -def _explicit_active_triage_issue_ids(plan: dict) -> set[str]: +def _explicit_active_triage_issue_ids(plan: PlanModel) -> set[str]: meta = plan.get("epic_triage_meta", {}) return set(_normalized_issue_id_list(meta.get("active_triage_issue_ids"))) -def live_active_triage_issue_ids(plan: dict, state: StateModel | None = None) -> set[str]: +def live_active_triage_issue_ids(plan: PlanModel, state: StateModel | None = None) -> set[str]: """Return frozen triage IDs that are still open review issues in state.""" frozen_ids = active_triage_issue_ids(plan, state) if state is None or not frozen_ids: @@ -100,7 +101,7 @@ def live_active_triage_issue_ids(plan: dict, state: StateModel | None = None) -> return frozen_ids & open_review_ids(state) -def undispositioned_triage_issue_ids(plan: dict, state: StateModel | None = None) -> list[str]: +def undispositioned_triage_issue_ids(plan: PlanModel, state: StateModel | None = None) -> list[str]: """Return frozen triage issues still lacking cluster/skip/dismiss coverage.""" target_ids = live_active_triage_issue_ids(plan, state) if not target_ids: @@ -108,61 +109,51 @@ def undispositioned_triage_issue_ids(plan: dict, state: StateModel | None = None covered_ids: set[str] = set() for cluster in plan.get("clusters", {}).values(): - if not isinstance(cluster, dict) or cluster.get("auto"): + if cluster.get("auto"): continue covered_ids.update(_cluster_issue_ids(cluster)) skipped = plan.get("skipped", {}) - if isinstance(skipped, dict): - covered_ids.update( - issue_id for issue_id in skipped if isinstance(issue_id, str) - ) + covered_ids.update(issue_id for issue_id in skipped if isinstance(issue_id, str)) meta = plan.get("epic_triage_meta", {}) covered_ids.update(_normalized_issue_id_list(meta.get("dismissed_ids"))) dispositions = meta.get("issue_dispositions", {}) - if isinstance(dispositions, dict) and isinstance(skipped, dict): - for issue_id, disposition in dispositions.items(): - if ( - isinstance(issue_id, str) - and isinstance(disposition, dict) - and disposition.get("decision_source") == "observe_auto" - and issue_id in skipped - ): - covered_ids.add(issue_id) + for issue_id, disposition in dispositions.items(): + if disposition.get("decision_source") == "observe_auto" and issue_id in skipped: + covered_ids.add(issue_id) return sorted(issue_id for issue_id in target_ids if issue_id not in covered_ids) def triage_coverage( - plan: dict, + plan: PlanModel, open_review_ids: set[str] | None = None, -) -> tuple[int, int, dict[str, dict]]: +) -> tuple[int, int, dict[str, Cluster]]: """Return (organized, total, clusters) for review issues in triage.""" clusters = plan.get("clusters", {}) all_cluster_ids: set[str] = set() for cluster in clusters.values(): - if isinstance(cluster, dict): - all_cluster_ids.update(_cluster_issue_ids(cluster)) + all_cluster_ids.update(_cluster_issue_ids(cluster)) review_ids = list(open_review_ids) if open_review_ids is not None else plan_review_ids(plan) organized = sum(1 for issue_id in review_ids if issue_id in all_cluster_ids) return organized, len(review_ids), clusters -def manual_clusters_with_issues(plan: dict) -> list[str]: +def manual_clusters_with_issues(plan: PlanModel) -> list[str]: """Return manual clusters that currently own at least one issue.""" return [ name for name, cluster in plan.get("clusters", {}).items() - if isinstance(cluster, dict) and _cluster_issue_ids(cluster) and not cluster.get("auto") + if _cluster_issue_ids(cluster) and not cluster.get("auto") ] -def find_cluster_for(issue_id: str, clusters: dict[str, dict]) -> str | None: +def find_cluster_for(issue_id: str, clusters: dict[str, Cluster]) -> str | None: """Return the owning cluster name for an issue ID, if any.""" for name, cluster in clusters.items(): - if isinstance(cluster, dict) and issue_id in _cluster_issue_ids(cluster): + if issue_id in _cluster_issue_ids(cluster): return name return None @@ -184,7 +175,7 @@ class TriageSnapshot: triage_has_run: bool -def build_triage_snapshot(plan: dict, state: StateModel) -> TriageSnapshot: +def build_triage_snapshot(plan: PlanModel, state: StateModel) -> TriageSnapshot: """Build a canonical triage snapshot from plan and state.""" meta = plan.get("epic_triage_meta", {}) triaged_ids = set(_normalized_issue_id_list(meta.get("triaged_ids"))) diff --git a/desloppify/engine/_state/merge.py b/desloppify/engine/_state/merge.py index 614c09df..fecaec6b 100644 --- a/desloppify/engine/_state/merge.py +++ b/desloppify/engine/_state/merge.py @@ -102,6 +102,7 @@ class MergeScanOptions: include_slow: bool = True ignore: list[str] | None = None subjective_integrity_target: float | None = None + project_root: str | None = None def merge_scan( @@ -170,6 +171,7 @@ def merge_scan( lang=resolved_options.lang, scan_path=resolved_options.scan_path, exclude=resolved_options.exclude, + project_root=resolved_options.project_root, ) # Mark subjective assessments stale when mechanical issues changed. diff --git a/desloppify/engine/_state/merge_issues.py b/desloppify/engine/_state/merge_issues.py index a0c6faac..05c418b6 100644 --- a/desloppify/engine/_state/merge_issues.py +++ b/desloppify/engine/_state/merge_issues.py @@ -2,6 +2,8 @@ from __future__ import annotations +import os + from desloppify.base.discovery.file_paths import matches_exclusion from desloppify.engine._state.filtering import matched_ignore_pattern from desloppify.engine._state.issue_semantics import ( @@ -80,13 +82,15 @@ def verify_disappeared( lang: str | None, scan_path: str | None, exclude: tuple[str, ...] = (), + project_root: str | None = None, ) -> tuple[int, int, int, set[str]]: """Update scan corroboration for issues absent from scan. Returns (resolved_count, skipped_other_lang, resolved_out_of_scope, changed_detectors). Queue-tracked work stays user-controlled: disappearing from scan does not - change an open issue to resolved. Manually resolved items can be marked as - scan-verified when they remain absent. + change an open issue to resolved — *unless* the source file no longer exists + on disk, in which case the issue is auto-resolved. Manually resolved items + can be marked as scan-verified when they remain absent. """ resolved = skipped_other_lang = resolved_out_of_scope = 0 resolved_detectors: set[str] = set() @@ -134,6 +138,21 @@ def verify_disappeared( continue if previous_status == "open": + # If the source file no longer exists on disk, auto-resolve: + # the issue cannot be actionable for a deleted file. + file_path = previous.get("file", "") + file_deleted = False + if project_root and file_path and file_path != ".": + file_deleted = not os.path.exists( + os.path.join(project_root, file_path) + ) + if not file_deleted: + continue + previous["status"] = "auto_resolved" + previous["resolved_at"] = now + previous["note"] = "Auto-resolved: source file no longer exists" + resolved_detectors.add(previous.get("detector", "unknown")) + resolved += 1 continue verification_note = ( diff --git a/desloppify/engine/_work_queue/inputs.py b/desloppify/engine/_work_queue/inputs.py index e5076c74..543026b5 100644 --- a/desloppify/engine/_work_queue/inputs.py +++ b/desloppify/engine/_work_queue/inputs.py @@ -52,6 +52,7 @@ def gather_subjective_items( state, (state.get("work_items") or state.get("issues", {})), threshold=threshold, + plan=opts.context.plan if opts.context is not None else opts.plan, ) return [item for item in candidates if scope_matches(item, opts.scope)] diff --git a/desloppify/engine/_work_queue/ranking.py b/desloppify/engine/_work_queue/ranking.py index 1f40db01..851a5676 100644 --- a/desloppify/engine/_work_queue/ranking.py +++ b/desloppify/engine/_work_queue/ranking.py @@ -128,10 +128,12 @@ def build_issue_items( status_filter: str, scope: str | None, chronic: bool, + forced_ids: set[str] | None = None, ) -> list[WorkQueueItem]: scoped = path_scoped_issues((state.get("work_items") or state.get("issues", {})), scan_path) subjective_scores = subjective_strict_scores(state) out: list[WorkQueueItem] = [] + forced_ids = forced_ids or set() for issue_id, issue in scoped.items(): if issue.get("suppressed"): @@ -146,7 +148,7 @@ def build_issue_items( # Evidence-only: skip issues below standalone confidence threshold detector = issue.get("detector", "") meta = DETECTORS.get(detector) - if meta and meta.standalone_threshold: + if issue_id not in forced_ids and meta and meta.standalone_threshold: threshold_rank = CONFIDENCE_ORDER.get(meta.standalone_threshold, 9) issue_rank = CONFIDENCE_ORDER.get(issue.get("confidence", "low"), 9) if issue_rank > threshold_rank: diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index dd9d7aa6..c185f6ef 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -4,7 +4,7 @@ from collections.abc import Iterable from dataclasses import dataclass -from typing import Any +from typing import Any, NamedTuple from desloppify.base.config import DEFAULT_TARGET_STRICT_SCORE from desloppify.engine._plan.cluster_semantics import ( @@ -18,6 +18,20 @@ executable_objective_ids as _executable_objective_ids, live_planned_queue_ids as _live_planned_queue_ids, ) +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT, + LIFECYCLE_PHASE_EXECUTE, + LIFECYCLE_PHASE_REVIEW_INITIAL, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT, + LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_SCAN, + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + LIFECYCLE_PHASE_TRIAGE, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, + LIFECYCLE_PHASE_WORKFLOW, + current_lifecycle_phase, + postflight_scan_pending, +) from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._state.filtering import path_scoped_issues from desloppify.engine._state.issue_semantics import ( @@ -41,13 +55,31 @@ ) from desloppify.engine._work_queue.types import WorkQueueItem -PHASE_REVIEW_INITIAL = "review_initial" -PHASE_EXECUTE = "execute" -PHASE_SCAN = "scan" -PHASE_ASSESSMENT_POSTFLIGHT = "assessment_postflight" -PHASE_REVIEW_POSTFLIGHT = "review_postflight" -PHASE_WORKFLOW_POSTFLIGHT = "workflow_postflight" -PHASE_TRIAGE_POSTFLIGHT = "triage_postflight" +PHASE_REVIEW_INITIAL = LIFECYCLE_PHASE_REVIEW_INITIAL +PHASE_EXECUTE = LIFECYCLE_PHASE_EXECUTE +PHASE_SCAN = LIFECYCLE_PHASE_SCAN +PHASE_ASSESSMENT_POSTFLIGHT = LIFECYCLE_PHASE_ASSESSMENT_POSTFLIGHT +PHASE_REVIEW_POSTFLIGHT = LIFECYCLE_PHASE_REVIEW_POSTFLIGHT +PHASE_WORKFLOW_POSTFLIGHT = LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT +PHASE_TRIAGE_POSTFLIGHT = LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT + +# Maps fine-grained phase → partition field that must be non-empty for it to be valid. +# Used by _phase_for_snapshot to trust the persisted phase. +_FINE_GRAINED_ITEM_MAP: dict[str, str | None] = { + PHASE_REVIEW_INITIAL: "initial_review_items", + PHASE_ASSESSMENT_POSTFLIGHT: "postflight_assessment_items", + PHASE_WORKFLOW_POSTFLIGHT: "postflight_workflow_items", + PHASE_TRIAGE_POSTFLIGHT: "triage_items", + PHASE_REVIEW_POSTFLIGHT: "postflight_review_items", + PHASE_SCAN: "scan_items", +} + +# Coarse phases that trigger postflight-sticky inference (legacy plans). +_COARSE_POSTFLIGHT_PHASES = { + LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_WORKFLOW, + LIFECYCLE_PHASE_TRIAGE, +} @dataclass(frozen=True) @@ -76,6 +108,10 @@ class QueueSnapshot: has_unplanned_objective_blockers: bool +# --------------------------------------------------------------------------- +# Internal helpers — option resolution, item classification +# --------------------------------------------------------------------------- + def _option_value(options: object | None, name: str, default: Any) -> Any: if options is None: return default @@ -135,6 +171,20 @@ def _active_cluster_issue_ids(plan: dict | None) -> set[str]: return active_ids +def _all_cluster_issue_ids(plan: dict | None) -> set[str]: + """Return issue IDs owned by any cluster (regardless of status).""" + if not isinstance(plan, dict): + return set() + all_ids: set[str] = set() + for cluster in plan.get("clusters", {}).values(): + if not isinstance(cluster, dict): + continue + for issue_id in cluster.get("issue_ids", []): + if isinstance(issue_id, str) and issue_id: + all_ids.add(issue_id) + return all_ids + + def _merge_execution_candidates( *, all_issue_items: list[WorkQueueItem], @@ -199,8 +249,9 @@ def _subjective_partitions( *, scoped_issues: dict[str, dict], threshold: float, + plan: dict | None, ) -> tuple[list[WorkQueueItem], list[WorkQueueItem]]: - candidates = build_subjective_items(state, scoped_issues, threshold=threshold) + candidates = build_subjective_items(state, scoped_issues, threshold=threshold, plan=plan) initial = [item for item in candidates if item.get("initial_review")] postflight = [item for item in candidates if not item.get("initial_review")] return initial, postflight @@ -234,7 +285,24 @@ def _workflow_partitions( return scan_items, postflight_workflow, triage_items +# --------------------------------------------------------------------------- +# Phase resolution — persisted fine-grained phase with legacy fallback +# --------------------------------------------------------------------------- + +def _raw_persisted_phase(plan: dict | None) -> str | None: + """Read the raw lifecycle_phase string from the plan, without validation.""" + if not isinstance(plan, dict): + return None + refresh_state = plan.get("refresh_state") + if isinstance(refresh_state, dict): + phase = refresh_state.get("lifecycle_phase") + if isinstance(phase, str): + return phase + return None + + def _phase_for_snapshot( + plan: dict | None, *, fresh_boundary: bool, initial_review_items: list[WorkQueueItem], @@ -242,30 +310,162 @@ def _phase_for_snapshot( explicit_queue_items: list[WorkQueueItem], scan_items: list[WorkQueueItem], review_backlog_present: bool, + undispositioned_review_backlog_present: bool, postflight_assessment_items: list[WorkQueueItem], postflight_review_items: list[WorkQueueItem], postflight_workflow_items: list[WorkQueueItem], triage_items: list[WorkQueueItem], ) -> str: + raw_phase = _raw_persisted_phase(plan) + + # ── Fine-grained persisted phase: trust it if items match ── + if raw_phase in _FINE_GRAINED_ITEM_MAP: + items_key = _FINE_GRAINED_ITEM_MAP[raw_phase] + items = locals().get(items_key) if items_key else None + if items_key is None or items: + return raw_phase + # Execute needs special check (two possible item lists). + if raw_phase == LIFECYCLE_PHASE_EXECUTE and (anchored_execution_items or explicit_queue_items): + return PHASE_EXECUTE + + # ── Legacy inference for coarse-phase or missing-phase plans ── + return _legacy_phase_inference( + plan, + fresh_boundary=fresh_boundary, + initial_review_items=initial_review_items, + anchored_execution_items=anchored_execution_items, + explicit_queue_items=explicit_queue_items, + scan_items=scan_items, + review_backlog_present=review_backlog_present, + undispositioned_review_backlog_present=undispositioned_review_backlog_present, + postflight_assessment_items=postflight_assessment_items, + postflight_review_items=postflight_review_items, + postflight_workflow_items=postflight_workflow_items, + triage_items=triage_items, + ) + + +def _legacy_phase_inference( + plan: dict | None, + *, + fresh_boundary: bool, + initial_review_items: list[WorkQueueItem], + anchored_execution_items: list[WorkQueueItem], + explicit_queue_items: list[WorkQueueItem], + scan_items: list[WorkQueueItem], + review_backlog_present: bool, + undispositioned_review_backlog_present: bool, + postflight_assessment_items: list[WorkQueueItem], + postflight_review_items: list[WorkQueueItem], + postflight_workflow_items: list[WorkQueueItem], + triage_items: list[WorkQueueItem], +) -> str: + """Infer the phase from item partitions for plans without fine-grained phases. + + This handles old plans that persisted coarse phases ("review", "workflow", + "triage") or have no persisted phase at all. As plans are migrated to + fine-grained phases by the reconcile pipeline, this code path is exercised + less frequently. + """ + persisted_phase = ( + current_lifecycle_phase(plan) if isinstance(plan, dict) else None + ) + + # Coarse "postflight sticky" — old plans that persisted a coarse phase + # need priority-ordered inference within that phase family. + postflight_sticky = ( + isinstance(plan, dict) + and persisted_phase in _COARSE_POSTFLIGHT_PHASES + and not postflight_scan_pending(plan) + ) + if fresh_boundary and initial_review_items: return PHASE_REVIEW_INITIAL + + if postflight_sticky: + result = _sticky_postflight_phase( + persisted_phase, + postflight_assessment_items=postflight_assessment_items, + postflight_review_items=postflight_review_items, + postflight_workflow_items=postflight_workflow_items, + triage_items=triage_items, + review_backlog_present=review_backlog_present, + ) + if result is not None: + return result + if anchored_execution_items: return PHASE_EXECUTE if scan_items: return PHASE_SCAN - if explicit_queue_items: + if explicit_queue_items and ( + not isinstance(plan, dict) or postflight_scan_pending(plan) + ): return PHASE_EXECUTE + + # Postflight sequence: assessment → workflow → triage → review → execute. + if postflight_assessment_items: + return PHASE_ASSESSMENT_POSTFLIGHT if postflight_workflow_items: return PHASE_WORKFLOW_POSTFLIGHT - if triage_items and (review_backlog_present or not postflight_assessment_items): + if triage_items and review_backlog_present: return PHASE_TRIAGE_POSTFLIGHT + if undispositioned_review_backlog_present and postflight_review_items: + return PHASE_REVIEW_POSTFLIGHT + if explicit_queue_items: + return PHASE_EXECUTE if postflight_review_items: return PHASE_REVIEW_POSTFLIGHT - if postflight_assessment_items: - return PHASE_ASSESSMENT_POSTFLIGHT + if triage_items: + return PHASE_TRIAGE_POSTFLIGHT return PHASE_SCAN +def _sticky_postflight_phase( + persisted_phase: str | None, + *, + postflight_assessment_items: list[WorkQueueItem], + postflight_review_items: list[WorkQueueItem], + postflight_workflow_items: list[WorkQueueItem], + triage_items: list[WorkQueueItem], + review_backlog_present: bool, +) -> str | None: + """Resolve phase within a coarse postflight-sticky context. + + Returns None if no items match, letting the caller fall through. + """ + if persisted_phase == LIFECYCLE_PHASE_WORKFLOW: + candidates = [ + (postflight_workflow_items, PHASE_WORKFLOW_POSTFLIGHT), + (triage_items, PHASE_TRIAGE_POSTFLIGHT), + (postflight_assessment_items, PHASE_ASSESSMENT_POSTFLIGHT), + (postflight_review_items, PHASE_REVIEW_POSTFLIGHT), + ] + elif persisted_phase == LIFECYCLE_PHASE_TRIAGE: + candidates = [ + (triage_items, PHASE_TRIAGE_POSTFLIGHT), + (postflight_workflow_items, PHASE_WORKFLOW_POSTFLIGHT), + (postflight_assessment_items, PHASE_ASSESSMENT_POSTFLIGHT), + (postflight_review_items, PHASE_REVIEW_POSTFLIGHT), + ] + else: + # Coarse "review" phase. + candidates = [ + (postflight_assessment_items, PHASE_ASSESSMENT_POSTFLIGHT), + (postflight_review_items, PHASE_REVIEW_POSTFLIGHT), + (postflight_workflow_items, PHASE_WORKFLOW_POSTFLIGHT), + (triage_items, PHASE_TRIAGE_POSTFLIGHT), + ] + for items, phase in candidates: + if items: + return phase + return None + + +# --------------------------------------------------------------------------- +# Execution item selection +# --------------------------------------------------------------------------- + def _execution_items_for_phase( phase: str, *, @@ -303,23 +503,41 @@ def _execution_items_for_phase( return [] -def build_queue_snapshot( +# --------------------------------------------------------------------------- +# Item partition building +# --------------------------------------------------------------------------- + +class _Partitions(NamedTuple): + """All item lists computed from state + plan, before phase resolution.""" + + objective_items: list[WorkQueueItem] + explicit_objective_items: list[WorkQueueItem] + review_issue_items: list[WorkQueueItem] + initial_review_items: list[WorkQueueItem] + subjective_postflight_items: list[WorkQueueItem] + postflight_assessment_items: list[WorkQueueItem] + postflight_review_items: list[WorkQueueItem] + scan_items: list[WorkQueueItem] + postflight_workflow_items: list[WorkQueueItem] + triage_items: list[WorkQueueItem] + explicit_queue_items: list[WorkQueueItem] + anchored_execution_items: list[WorkQueueItem] + + +def _build_item_partitions( state: StateModel, *, - options: object | None = None, - plan: dict | None = None, - target_strict: float = DEFAULT_TARGET_STRICT_SCORE, -) -> QueueSnapshot: - """Build the canonical queue snapshot for the current state.""" - context = _option_value(options, "context", None) - effective_plan = context.plan if context is not None else ( - plan if plan is not None else _option_value(options, "plan", None) - ) - scan_path = _resolved_scan_path(options, state) + effective_plan: dict | None, + scan_path: str | None, + scope: object | None, + chronic: bool, + target_strict: float, +) -> _Partitions: + """Build all item partitions from state and plan.""" skipped_ids = set((effective_plan or {}).get("skipped", {}).keys()) - scoped_issues = path_scoped_issues((state.get("work_items") or state.get("issues", {})), scan_path) - scope = _option_value(options, "scope", None) - chronic = bool(_option_value(options, "chronic", False)) + scoped_issues = path_scoped_issues( + (state.get("work_items") or state.get("issues", {})), scan_path, + ) all_issue_items = build_issue_items( state, @@ -327,6 +545,7 @@ def build_queue_snapshot( status_filter="open", scope=scope, chronic=chronic, + forced_ids=_live_planned_queue_ids(effective_plan), ) objective_items = [ item for item in all_issue_items @@ -336,19 +555,26 @@ def build_queue_snapshot( {item.get("id", "") for item in objective_items}, effective_plan, ) + all_clustered_ids = _all_cluster_issue_ids(effective_plan) + if ( + isinstance(effective_plan, dict) + and not _live_planned_queue_ids(effective_plan) + and all_clustered_ids & executable_objective_ids + ): + executable_objective_ids -= all_clustered_ids explicit_objective_items = [ item for item in objective_items if item.get("id", "") in executable_objective_ids ] + review_issue_items = _review_issue_items(all_issue_items) - assessment_request_items = _assessment_request_items(all_issue_items) + assessment_request_items_list = _assessment_request_items(all_issue_items) executable_review_items = _executable_review_issue_items( - effective_plan, - state, - review_issue_items, + effective_plan, state, review_issue_items, ) review_issue_ids = {item.get("id", "") for item in review_issue_items} - assessment_request_ids = {item.get("id", "") for item in assessment_request_items} + assessment_request_ids = {item.get("id", "") for item in assessment_request_items_list} + explicit_queue_items, anchored_execution_items = _merge_execution_candidates( all_issue_items=all_issue_items, explicit_objective_items=explicit_objective_items, @@ -356,80 +582,141 @@ def build_queue_snapshot( review_issue_ids=review_issue_ids, assessment_request_ids=assessment_request_ids, ) + initial_review_items, subjective_postflight_items = _subjective_partitions( - state, - scoped_issues=scoped_issues, - threshold=target_strict, + state, scoped_issues=scoped_issues, threshold=target_strict, plan=effective_plan, ) + # Suppress subjective dimension items when review issues already cover + # the same dimension — the review issues are more actionable. postflight_assessment_items = [ - *subjective_postflight_items, - *assessment_request_items, - ] - postflight_review_items = [ - *executable_review_items, - ] + item + for item in subjective_postflight_items + if not ( + item.get("kind") == "subjective_dimension" + and int((item.get("detail") or {}).get("open_review_issues", 0)) > 0 + ) + ] + list(assessment_request_items_list) + postflight_review_items = list(executable_review_items) + scan_items, postflight_workflow_items, triage_items = _workflow_partitions( - effective_plan, - state, + effective_plan, state, ) - fresh_boundary = _is_fresh_boundary(effective_plan) - phase = _phase_for_snapshot( - fresh_boundary=fresh_boundary, + return _Partitions( + objective_items=objective_items, + explicit_objective_items=explicit_objective_items, + review_issue_items=review_issue_items, initial_review_items=initial_review_items, - anchored_execution_items=anchored_execution_items, - explicit_queue_items=explicit_queue_items, - scan_items=scan_items, - review_backlog_present=bool(review_issue_items), + subjective_postflight_items=subjective_postflight_items, postflight_assessment_items=postflight_assessment_items, postflight_review_items=postflight_review_items, - postflight_workflow_items=postflight_workflow_items, - triage_items=triage_items, - ) - execution_items = _execution_items_for_phase( - phase, - explicit_queue_items=explicit_queue_items, - initial_review_items=initial_review_items, scan_items=scan_items, - postflight_assessment_items=postflight_assessment_items, - postflight_review_items=postflight_review_items, postflight_workflow_items=postflight_workflow_items, triage_items=triage_items, + explicit_queue_items=explicit_queue_items, + anchored_execution_items=anchored_execution_items, ) - execution_ids = {item.get("id", "") for item in execution_items} - backlog_items = [ + +def _build_backlog( + p: _Partitions, + execution_ids: set[str], +) -> list[WorkQueueItem]: + return [ item for item in ( [ - *objective_items, - *initial_review_items, - *postflight_assessment_items, - *review_issue_items, - *scan_items, - *postflight_workflow_items, - *triage_items, + *p.objective_items, + *p.initial_review_items, + *p.postflight_assessment_items, + *p.review_issue_items, + *p.scan_items, + *p.postflight_workflow_items, + *p.triage_items, ] ) if item.get("id", "") not in execution_ids ] + + +# --------------------------------------------------------------------------- +# Public API +# --------------------------------------------------------------------------- + +def build_queue_snapshot( + state: StateModel, + *, + options: object | None = None, + plan: dict | None = None, + target_strict: float = DEFAULT_TARGET_STRICT_SCORE, +) -> QueueSnapshot: + """Build the canonical queue snapshot for the current state.""" + context = _option_value(options, "context", None) + effective_plan = context.plan if context is not None else ( + plan if plan is not None else _option_value(options, "plan", None) + ) + + p = _build_item_partitions( + state, + effective_plan=effective_plan, + scan_path=_resolved_scan_path(options, state), + scope=_option_value(options, "scope", None), + chronic=bool(_option_value(options, "chronic", False)), + target_strict=target_strict, + ) + + triage_snapshot = ( + build_triage_snapshot(effective_plan, state) + if isinstance(effective_plan, dict) + else None + ) + fresh_boundary = _is_fresh_boundary(effective_plan) + + phase = _phase_for_snapshot( + effective_plan, + fresh_boundary=fresh_boundary, + initial_review_items=p.initial_review_items, + anchored_execution_items=p.anchored_execution_items, + explicit_queue_items=p.explicit_queue_items, + scan_items=p.scan_items, + review_backlog_present=bool(p.review_issue_items), + undispositioned_review_backlog_present=bool( + triage_snapshot is not None and triage_snapshot.undispositioned_ids + ), + postflight_assessment_items=p.postflight_assessment_items, + postflight_review_items=p.postflight_review_items, + postflight_workflow_items=p.postflight_workflow_items, + triage_items=p.triage_items, + ) + execution_items = _execution_items_for_phase( + phase, + explicit_queue_items=p.explicit_queue_items, + initial_review_items=p.initial_review_items, + scan_items=p.scan_items, + postflight_assessment_items=p.postflight_assessment_items, + postflight_review_items=p.postflight_review_items, + postflight_workflow_items=p.postflight_workflow_items, + triage_items=p.triage_items, + ) + + execution_ids = {item.get("id", "") for item in execution_items} + backlog_items = _build_backlog(p, execution_ids) objective_backlog_count = sum( - 1 for item in objective_items if item.get("id", "") not in execution_ids + 1 for item in p.objective_items if item.get("id", "") not in execution_ids ) - has_unplanned_objective_blockers = len(explicit_objective_items) < len(objective_items) return QueueSnapshot( phase=phase, - all_objective_items=tuple(objective_items), - all_initial_review_items=tuple(initial_review_items), - all_postflight_assessment_items=tuple(postflight_assessment_items), - all_postflight_review_items=tuple(postflight_review_items), - all_scan_items=tuple(scan_items), - all_postflight_workflow_items=tuple(postflight_workflow_items), - all_postflight_triage_items=tuple(triage_items), + all_objective_items=tuple(p.objective_items), + all_initial_review_items=tuple(p.initial_review_items), + all_postflight_assessment_items=tuple(p.postflight_assessment_items), + all_postflight_review_items=tuple(p.postflight_review_items), + all_scan_items=tuple(p.scan_items), + all_postflight_workflow_items=tuple(p.postflight_workflow_items), + all_postflight_triage_items=tuple(p.triage_items), execution_items=tuple(execution_items), backlog_items=tuple(backlog_items), - objective_in_scope_count=len(objective_items), - planned_objective_count=len(explicit_objective_items), + objective_in_scope_count=len(p.objective_items), + planned_objective_count=len(p.explicit_objective_items), objective_execution_count=sum( 1 for item in execution_items @@ -437,30 +724,15 @@ def build_queue_snapshot( and counts_toward_objective_backlog(item) ), objective_backlog_count=objective_backlog_count, - subjective_initial_count=len(initial_review_items), - assessment_postflight_count=len(postflight_assessment_items), - subjective_postflight_count=len(subjective_postflight_items), - workflow_postflight_count=len(postflight_workflow_items), - triage_pending_count=len(triage_items), - has_unplanned_objective_blockers=has_unplanned_objective_blockers, + subjective_initial_count=len(p.initial_review_items), + assessment_postflight_count=len(p.postflight_assessment_items), + subjective_postflight_count=len(p.subjective_postflight_items), + workflow_postflight_count=len(p.postflight_workflow_items), + triage_pending_count=len(p.triage_items), + has_unplanned_objective_blockers=len(p.explicit_objective_items) < len(p.objective_items), ) -def coarse_phase_name(phase: str) -> str: - """Map internal queue phases to the persisted coarse lifecycle value.""" - if phase in { - PHASE_REVIEW_INITIAL, - PHASE_ASSESSMENT_POSTFLIGHT, - PHASE_REVIEW_POSTFLIGHT, - }: - return "review" - if phase == PHASE_WORKFLOW_POSTFLIGHT: - return "workflow" - if phase == PHASE_TRIAGE_POSTFLIGHT: - return "triage" - return phase - - __all__ = [ "PHASE_ASSESSMENT_POSTFLIGHT", "PHASE_EXECUTE", @@ -471,5 +743,4 @@ def coarse_phase_name(phase: str) -> str: "PHASE_WORKFLOW_POSTFLIGHT", "QueueSnapshot", "build_queue_snapshot", - "coarse_phase_name", ] diff --git a/desloppify/engine/_work_queue/synthetic.py b/desloppify/engine/_work_queue/synthetic.py index e4e6368a..4e16e2f6 100644 --- a/desloppify/engine/_work_queue/synthetic.py +++ b/desloppify/engine/_work_queue/synthetic.py @@ -29,6 +29,13 @@ confirmed_triage_stage_names, recorded_unconfirmed_triage_stage_names, ) +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_TRIAGE, + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + LIFECYCLE_PHASE_WORKFLOW, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, + current_lifecycle_phase, +) from desloppify.engine.plan_triage import ( TRIAGE_IDS, TRIAGE_STAGE_DEPENDENCIES, @@ -178,7 +185,11 @@ def build_triage_stage_items(plan: dict, state: dict) -> list[WorkQueueItem]: def build_subjective_items( - state: dict, issues: dict, *, threshold: float = 100.0 + state: dict, + issues: dict, + *, + threshold: float = 100.0, + plan: dict | None = None, ) -> list[WorkQueueItem]: """Create synthetic subjective work items.""" dim_scores = state.get("dimension_scores", {}) or {} @@ -207,6 +218,37 @@ def build_subjective_items( review_open_by_dim[dim_key] = review_open_by_dim.get(dim_key, 0) + 1 items: list[WorkQueueItem] = [] + latest_trusted_audit_ts = "" + for raw_entry in reversed(state.get("assessment_import_audit", []) or []): + if not isinstance(raw_entry, dict): + continue + if raw_entry.get("mode") not in {"trusted_internal", "attested_external"}: + continue + latest_trusted_audit_ts = str(raw_entry.get("timestamp", "")).strip() + if latest_trusted_audit_ts: + break + current_phase = current_lifecycle_phase(plan) if isinstance(plan, dict) else None + + def _suppressed_same_cycle_refresh(dimension_key: str, *, stale: bool) -> bool: + if not stale or latest_trusted_audit_ts == "": + return False + if current_phase not in { + LIFECYCLE_PHASE_WORKFLOW, LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, + LIFECYCLE_PHASE_TRIAGE, LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + }: + return False + assessments = state.get("subjective_assessments", {}) or {} + payload = assessments.get(dimension_key) + if not isinstance(payload, dict): + return False + refresh_reason = str(payload.get("refresh_reason", "")).strip() + if not refresh_reason.startswith("review_issue_"): + return False + assessed_at = str(payload.get("assessed_at", "")).strip() + if assessed_at == "": + return False + return assessed_at >= latest_trusted_audit_ts + def _prepare_command( cli_keys: list[str], *, @@ -224,9 +266,6 @@ def _prepare_command( if not name: continue strict_val = float(entry.get("strict", entry.get("score", 100.0))) - if strict_val >= threshold: - continue - dim_key = _canonical_subjective_dimension_key(name) aliases = set(_subjective_dimension_aliases(name)) cli_keys = [ @@ -242,14 +281,26 @@ def _prepare_command( or (strict_val <= 0.0 and int(entry.get("failing", 0)) == 0) ) is_stale = bool(entry.get("stale")) + if not is_unassessed and not is_stale: + continue + if _suppressed_same_cycle_refresh(dim_key, stale=is_stale): + continue + if strict_val >= threshold: + continue + # Live subjective work is limited to never-reviewed or explicitly + # stale dimensions. Fresh under-target scores remain advisory data, + # not active queue items. # If review issues already exist for this dimension, triage/fix them # before suggesting another review refresh pass. if open_review > 0: primary_command = "desloppify show review --status open" else: primary_command = _prepare_command(cli_keys) - stale_tag = " [stale — re-review]" if is_stale else "" - summary = f"Subjective dimension below target: {name} ({strict_val:.1f}%){stale_tag}" + reason_tags = ["below target"] + if is_stale: + reason_tags.append("stale") + reasons = ", ".join(reason_tags) + summary = f"Subjective review needed: {name} ({strict_val:.1f}%) [{reasons}]" item: WorkQueueItem = { "id": f"subjective::{slugify(dim_key)}", "detector": "subjective_assessment", diff --git a/desloppify/engine/_work_queue/synthetic_workflow.py b/desloppify/engine/_work_queue/synthetic_workflow.py index 18149409..04a23bf1 100644 --- a/desloppify/engine/_work_queue/synthetic_workflow.py +++ b/desloppify/engine/_work_queue/synthetic_workflow.py @@ -59,7 +59,7 @@ def _confirm_attestation_hint(stage: str) -> str: if stage == "enrich": return "Steps are executor-ready..." if stage == "sense-check": - return "Content and structure verified..." + return "Content, structure and value verified..." return "..." diff --git a/desloppify/engine/plan_triage.py b/desloppify/engine/plan_triage.py index 9b9c2d63..4bff0cf8 100644 --- a/desloppify/engine/plan_triage.py +++ b/desloppify/engine/plan_triage.py @@ -118,8 +118,9 @@ def triage_phase_banner( ) progress = resolved_snapshot.progress if progress.completed_count: + total_stages = len(TRIAGE_STAGE_LABELS) return ( - f"TRIAGE MODE ({progress.completed_count}/6 stages recorded) — " + f"TRIAGE MODE ({progress.completed_count}/{total_stages} stages recorded) — " f"complete all stages to exit. {run_hint}" ) return ( diff --git a/desloppify/intelligence/review/context_holistic/_accessors.py b/desloppify/intelligence/review/context_holistic/_accessors.py deleted file mode 100644 index 43bf0ecf..00000000 --- a/desloppify/intelligence/review/context_holistic/_accessors.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Compatibility wrapper for cluster accessors helpers.""" - -from .clusters.accessors import _get_detail, _get_signals, _safe_num - -__all__ = ["_get_detail", "_get_signals", "_safe_num"] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_complexity.py b/desloppify/intelligence/review/context_holistic/_clusters_complexity.py deleted file mode 100644 index e2c328ed..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_complexity.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Compatibility wrapper for complexity evidence cluster helpers.""" - -from .clusters.complexity import _build_complexity_hotspots - -__all__ = ["_build_complexity_hotspots"] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_consistency.py b/desloppify/intelligence/review/context_holistic/_clusters_consistency.py deleted file mode 100644 index ab608008..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_consistency.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Compatibility wrapper for consistency evidence cluster helpers.""" - -from .clusters.consistency import _build_duplicate_clusters, _build_naming_drift - -__all__ = ["_build_duplicate_clusters", "_build_naming_drift"] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_dependency.py b/desloppify/intelligence/review/context_holistic/_clusters_dependency.py deleted file mode 100644 index 374f65a1..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_dependency.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Compatibility wrapper for dependency evidence cluster helpers.""" - -from .clusters.dependency import ( - _build_boundary_violations, - _build_dead_code, - _build_deferred_import_density, - _build_private_crossings, -) - -__all__ = [ - "_build_boundary_violations", - "_build_dead_code", - "_build_deferred_import_density", - "_build_private_crossings", -] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_error_state.py b/desloppify/intelligence/review/context_holistic/_clusters_error_state.py deleted file mode 100644 index 21dadd4d..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_error_state.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Compatibility wrapper for error-state evidence cluster helpers.""" - -from .clusters.error_state import _build_error_hotspots, _build_mutable_globals - -__all__ = ["_build_error_hotspots", "_build_mutable_globals"] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_organization.py b/desloppify/intelligence/review/context_holistic/_clusters_organization.py deleted file mode 100644 index c89a77a0..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_organization.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Compatibility wrapper for organization evidence cluster helpers.""" - -from .clusters.organization import _build_flat_dir_issues, _build_large_file_distribution - -__all__ = ["_build_flat_dir_issues", "_build_large_file_distribution"] diff --git a/desloppify/intelligence/review/context_holistic/_clusters_security.py b/desloppify/intelligence/review/context_holistic/_clusters_security.py deleted file mode 100644 index 3f50e4f3..00000000 --- a/desloppify/intelligence/review/context_holistic/_clusters_security.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Compatibility wrapper for security evidence cluster helpers.""" - -from .clusters.security import ( - _build_security_hotspots, - _build_signal_density, - _build_systemic_patterns, -) - -__all__ = [ - "_build_security_hotspots", - "_build_signal_density", - "_build_systemic_patterns", -] diff --git a/desloppify/languages/README.md b/desloppify/languages/README.md index 1a52647e..6faafc23 100644 --- a/desloppify/languages/README.md +++ b/desloppify/languages/README.md @@ -1,6 +1,6 @@ # Languages -Desloppify supports 28 languages through a plugin system with two tiers: **full plugins** (7) with hand-written detectors and subjective review, and **generic plugins** (21) that wrap external linters and optionally use tree-sitter for AST analysis. +Desloppify supports 29 languages through a plugin system with two tiers: **full plugins** (8) with hand-written detectors and subjective review, and **generic plugins** (21) that wrap external linters and optionally use tree-sitter for AST analysis. ## Full Plugins @@ -47,6 +47,7 @@ These are single-file plugins (~20-40 lines) that call `generic_lang()` with ext | Erlang | `erlang/` | dialyzer | functions, imports | | OCaml | `ocaml/` | ocaml compiler | functions, modules, imports | | F# | `fsharp/` | dotnet build | functions, imports | +| Julia | `julia/` | JuliaFormatter | functions, imports | Example: `ruby/__init__.py` — wraps rubocop and tree-sitter import/function support as a generic plugin. diff --git a/desloppify/languages/rust/_fixers.py b/desloppify/languages/rust/_fixers.py index d79ffb02..0f638439 100644 --- a/desloppify/languages/rust/_fixers.py +++ b/desloppify/languages/rust/_fixers.py @@ -6,13 +6,15 @@ from desloppify.base.discovery.file_paths import rel, resolve_path, safe_write_text from desloppify.languages._framework.base.types import FixResult, FixerConfig -from desloppify.languages.rust.detectors.custom import ( +from desloppify.languages.rust.detectors.api import ( + detect_import_hygiene, + replace_same_crate_imports, +) +from desloppify.languages.rust.detectors.cargo_policy import ( add_missing_features_to_manifest, detect_doctest_hygiene, detect_feature_hygiene, - detect_import_hygiene, ensure_readme_doctest_harness, - replace_same_crate_imports, ) diff --git a/desloppify/languages/rust/commands.py b/desloppify/languages/rust/commands.py index e360f888..bf5ee37c 100644 --- a/desloppify/languages/rust/commands.py +++ b/desloppify/languages/rust/commands.py @@ -51,7 +51,6 @@ CLIPPY_WARNING_CMD as RUST_CLIPPY_CMD, parse_cargo_errors, parse_clippy_messages, - parse_rustdoc_messages, run_rustdoc_result, ) diff --git a/desloppify/languages/rust/detectors/custom.py b/desloppify/languages/rust/detectors/custom.py deleted file mode 100644 index 27745a4c..00000000 --- a/desloppify/languages/rust/detectors/custom.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Compatibility exports for legacy Rust detector imports.""" - -from .api import ( - detect_error_boundaries, - detect_future_proofing, - detect_import_hygiene, - detect_public_api_conventions, - detect_thread_safety_contracts, - replace_same_crate_imports, -) -from .cargo_policy import ( - add_missing_features_to_manifest, - detect_doctest_hygiene, - detect_feature_hygiene, - ensure_readme_doctest_harness, - iter_missing_features, - missing_readme_doctest_harnesses, -) -from .safety import ( - detect_async_locking, - detect_drop_safety, - detect_unsafe_api_usage, -) - -__all__ = [ - "add_missing_features_to_manifest", - "detect_async_locking", - "detect_doctest_hygiene", - "detect_drop_safety", - "detect_error_boundaries", - "detect_feature_hygiene", - "detect_future_proofing", - "detect_import_hygiene", - "detect_public_api_conventions", - "detect_thread_safety_contracts", - "detect_unsafe_api_usage", - "ensure_readme_doctest_harness", - "iter_missing_features", - "missing_readme_doctest_harnesses", - "replace_same_crate_imports", -] diff --git a/desloppify/languages/rust/tests/test_custom.py b/desloppify/languages/rust/tests/test_custom.py index bf613bb9..972457b6 100644 --- a/desloppify/languages/rust/tests/test_custom.py +++ b/desloppify/languages/rust/tests/test_custom.py @@ -12,16 +12,20 @@ fix_readme_doctests, ) from desloppify.languages.rust.phases import phase_signature -from desloppify.languages.rust.detectors.custom import ( - detect_async_locking, - detect_doctest_hygiene, - detect_drop_safety, +from desloppify.languages.rust.detectors.api import ( detect_error_boundaries, - detect_feature_hygiene, detect_future_proofing, detect_import_hygiene, detect_public_api_conventions, detect_thread_safety_contracts, +) +from desloppify.languages.rust.detectors.cargo_policy import ( + detect_doctest_hygiene, + detect_feature_hygiene, +) +from desloppify.languages.rust.detectors.safety import ( + detect_async_locking, + detect_drop_safety, detect_unsafe_api_usage, ) diff --git a/desloppify/tests/commands/plan/test_triage_attestation.py b/desloppify/tests/commands/plan/test_triage_attestation.py index 3f419225..3afa5322 100644 --- a/desloppify/tests/commands/plan/test_triage_attestation.py +++ b/desloppify/tests/commands/plan/test_triage_attestation.py @@ -46,6 +46,9 @@ def _plan_with_stages(*stage_names: str, confirmed: bool = False) -> dict: "timestamp": "2025-06-01T00:00:00Z", "issue_count": 5, } + if name == "observe": + stages[name]["dimension_names"] = ["naming"] + stages[name]["dimension_counts"] = {"naming": 5} if confirmed: stages[name]["confirmed_at"] = "2025-06-01T00:01:00Z" stages[name]["confirmed_text"] = "I have thoroughly reviewed all the issues in this stage" diff --git a/desloppify/tests/commands/plan/test_triage_dependency_guard.py b/desloppify/tests/commands/plan/test_triage_dependency_guard.py index a69a1480..01ea5a74 100644 --- a/desloppify/tests/commands/plan/test_triage_dependency_guard.py +++ b/desloppify/tests/commands/plan/test_triage_dependency_guard.py @@ -65,7 +65,14 @@ def test_observe_confirmed_unblocks_reflect(self): assert blocked["triage::organize"] == ["triage::reflect"] def test_all_confirmed_returns_empty(self): - plan = _plan_with_triage_stages("observe", "reflect", "organize", "enrich", "sense-check", "commit") + plan = _plan_with_triage_stages( + "observe", + "reflect", + "organize", + "enrich", + "sense-check", + "commit", + ) assert _blocked_triage_stages(plan) == {} def test_no_triage_in_queue_returns_empty(self): diff --git a/desloppify/tests/commands/plan/test_triage_logging.py b/desloppify/tests/commands/plan/test_triage_logging.py index 0e6adadb..4a22b440 100644 --- a/desloppify/tests/commands/plan/test_triage_logging.py +++ b/desloppify/tests/commands/plan/test_triage_logging.py @@ -163,7 +163,14 @@ def test_reflect_stage_logs_entry(self, monkeypatch, capsys): class TestCompleteLogging: def test_complete_logs_entry(self, monkeypatch, capsys): - plan = _plan_with_stages("observe", "reflect", "organize", "enrich", "sense-check", confirmed=True) + plan = _plan_with_stages( + "observe", + "reflect", + "organize", + "enrich", + "sense-check", + confirmed=True, + ) plan["clusters"]["fix-names"] = { "name": "fix-names", "description": "Fix naming", diff --git a/desloppify/tests/commands/plan/test_triage_runner.py b/desloppify/tests/commands/plan/test_triage_runner.py index c8487e28..26f372cd 100644 --- a/desloppify/tests/commands/plan/test_triage_runner.py +++ b/desloppify/tests/commands/plan/test_triage_runner.py @@ -391,6 +391,101 @@ def test_validate_enrich_vague_detail(tmp_path: Path) -> None: assert "vague" in msg +def test_validate_enrich_ignores_out_of_scope_clusters_for_frozen_triage(tmp_path: Path) -> None: + """Runner enrich validation should only inspect clusters tied to the active triage session.""" + (tmp_path / "src").mkdir() + (tmp_path / "src" / "current.ts").write_text("export {}") + plan = _plan_with_stages(enrich={"report": "x" * 150}) + plan["epic_triage_meta"]["active_triage_issue_ids"] = ["review::current::issue"] + plan["clusters"] = { + "current": { + "issue_ids": ["review::current::issue"], + "description": "current batch", + "action_steps": [ + { + "title": "fix current", + "detail": "Update src/current.ts to simplify the active path and remove duplication. " + "x" * 30, + "effort": "small", + "issue_refs": ["review::current::issue"], + } + ], + }, + "legacy": { + "issue_ids": ["review::legacy::issue"], + "description": "old batch", + "action_steps": [ + { + "title": "old vague step", + "detail": "", + "effort": "small", + } + ], + }, + } + state = { + "issues": { + "review::current::issue": {"status": "open", "detector": "review"}, + "review::legacy::issue": {"status": "open", "detector": "review"}, + } + } + ok, msg = validate_stage("enrich", plan, state, tmp_path) + assert ok, msg + + +def test_validate_sense_check_ignores_out_of_scope_clusters_for_frozen_triage(tmp_path: Path) -> None: + """Decision-ledger coverage should only include live targets from the active triage session.""" + (tmp_path / "src").mkdir() + (tmp_path / "src" / "current.ts").write_text("export {}") + plan = _plan_with_stages( + **{ + "sense-check": { + "report": "\n".join( + [ + "Verified src/current.ts lines 1-10: the active cluster is concrete, safe, and removes duplication without adding indirection. " + "x" * 20, + "## Decision Ledger", + "- current -> keep", + ] + ) + } + } + ) + plan["epic_triage_meta"]["active_triage_issue_ids"] = ["review::current::issue"] + plan["clusters"] = { + "current": { + "issue_ids": ["review::current::issue"], + "description": "current batch", + "action_steps": [ + { + "title": "fix current", + "detail": "Update src/current.ts to simplify the active path and remove duplication. " + "x" * 30, + "effort": "small", + "issue_refs": ["review::current::issue"], + } + ], + }, + "legacy": { + "issue_ids": ["review::legacy::issue"], + "description": "old batch", + "action_steps": [ + { + "title": "old valid step", + "detail": "Update src/legacy.ts to simplify the old path and remove duplication. " + "x" * 30, + "effort": "small", + "issue_refs": ["review::legacy::issue"], + } + ], + }, + } + state = { + "issues": { + "review::current::issue": {"status": "open", "detector": "review"}, + "review::legacy::issue": {"status": "open", "detector": "review"}, + } + } + ok, msg = validate_stage("sense-check", plan, state, tmp_path) + assert ok, msg + + # ---------- Underspecified steps (AND→OR fix) ---------- @@ -553,6 +648,7 @@ def test_validate_completion_self_dependency(tmp_path: Path) -> None: organize={"report": "x" * 150, "confirmed_at": "t"}, enrich={"report": "x" * 150, "confirmed_at": "t"}, **{"sense-check": {"report": "x" * 150, "confirmed_at": "t"}}, + **{"value-check": {"report": "x" * 150, "confirmed_at": "t"}}, ) plan["clusters"] = { "self-dep": { @@ -574,6 +670,7 @@ def test_validate_completion_surfaces_all_trivial_cluster_advisory(tmp_path: Pat organize={"report": "x" * 150, "confirmed_at": "t"}, enrich={"report": "x" * 150, "confirmed_at": "t"}, **{"sense-check": {"report": "x" * 150, "confirmed_at": "t"}}, + **{"value-check": {"report": "x" * 150, "confirmed_at": "t"}}, ) plan["clusters"] = { "all-trivial": { @@ -606,12 +703,60 @@ def test_validate_completion_allows_zero_issue_noop(tmp_path: Path) -> None: organize={"report": "x" * 150, "confirmed_at": "t"}, enrich={"report": "x" * 150, "confirmed_at": "t"}, **{"sense-check": {"report": "x" * 150, "confirmed_at": "t"}}, + **{"value-check": {"report": "x" * 150, "confirmed_at": "t"}}, ) ok, msg = validate_completion(plan, {"issues": {}}, tmp_path) assert ok assert msg == "" +def test_validate_completion_ignores_out_of_scope_clusters_for_frozen_triage(tmp_path: Path) -> None: + """Completion should only validate clusters tied to the frozen triage issue set.""" + plan = _plan_with_stages( + observe={"report": "x" * 150, "confirmed_at": "t"}, + reflect={"report": "x" * 150, "confirmed_at": "t"}, + organize={"report": "x" * 150, "confirmed_at": "t"}, + enrich={"report": "x" * 150, "confirmed_at": "t"}, + **{"sense-check": {"report": "x" * 150, "confirmed_at": "t"}}, + **{"value-check": {"report": "x" * 150, "confirmed_at": "t"}}, + ) + plan["epic_triage_meta"]["active_triage_issue_ids"] = ["review::current::issue"] + plan["clusters"] = { + "current": { + "issue_ids": ["review::current::issue"], + "description": "current batch", + "action_steps": [ + { + "title": "fix current", + "detail": "Update src/current.ts to simplify the active path and remove duplication. " + "x" * 30, + "effort": "small", + "issue_refs": ["review::current::issue"], + } + ], + }, + "legacy-self-dep": { + "issue_ids": ["review::legacy::issue"], + "description": "old batch", + "action_steps": [ + { + "title": "old step", + "detail": "", + "effort": "small", + } + ], + "depends_on_clusters": ["legacy-self-dep"], + }, + } + state = { + "issues": { + "review::current::issue": {"status": "open", "detector": "review"}, + "review::legacy::issue": {"status": "open", "detector": "review"}, + } + } + ok, msg = validate_completion(plan, state, tmp_path) + assert ok, msg + + def test_validate_stage_organize_allows_zero_issue_noop(tmp_path: Path) -> None: plan = _plan_with_stages(organize={"report": "x" * 150}) ok, msg = validate_stage("organize", plan, {"issues": {}}, tmp_path, triage_input=_make_triage_input(0)) @@ -662,6 +807,8 @@ def test_sense_check_prompt_includes_cluster_data(tmp_path: Path) -> None: assert str(tmp_path) in prompt assert "LINE NUMBERS" in prompt assert "STALENESS" in prompt + assert "ONLY reference file paths that already exist on disk" in prompt + assert "do NOT invent a future filename" in prompt def test_sense_check_structure_prompt_includes_clusters(tmp_path: Path) -> None: @@ -691,6 +838,7 @@ def test_sense_check_structure_prompt_includes_clusters(tmp_path: Path) -> None: assert "depends_on: cluster-a" in prompt assert "SHARED FILES" in prompt assert "CIRCULAR DEPS" in prompt + assert "Do NOT add cascade steps that point at speculative future files" in prompt # ---------- Sense-check validation ---------- @@ -722,7 +870,18 @@ def test_sense_check_validation_ok(tmp_path: Path) -> None: """Sense-check passes when report is long enough and all enrich checks pass.""" (tmp_path / "src").mkdir() (tmp_path / "src" / "foo.ts").write_text("export {}") - plan = _plan_with_stages(**{"sense-check": {"report": "Verified test-cluster steps: src/foo.ts lines 10-20 match description. Effort tags accurate. " + "x" * 60}}) + plan = _plan_with_stages( + **{ + "sense-check": { + "report": ( + "## Decision Ledger\n" + "- test-cluster -> keep\n\n" + "Verified test-cluster steps: src/foo.ts lines 10-20 match description. " + "Effort tags accurate. " + "x" * 60 + ) + } + } + ) plan["clusters"] = { "test-cluster": { "issue_ids": ["review::a::b"], diff --git a/desloppify/tests/commands/plan/test_triage_split_modules_direct.py b/desloppify/tests/commands/plan/test_triage_split_modules_direct.py index 1f9bdc80..54c0550d 100644 --- a/desloppify/tests/commands/plan/test_triage_split_modules_direct.py +++ b/desloppify/tests/commands/plan/test_triage_split_modules_direct.py @@ -61,8 +61,13 @@ def _make_stage_context( def test_completion_policy_helpers_cover_success_and_fail_paths(monkeypatch, capsys) -> None: - monkeypatch.setattr(completion_policy_mod, "manual_clusters_with_issues", lambda _plan: ["c1"]) - monkeypatch.setattr(completion_policy_mod, "unenriched_clusters", lambda _plan: []) + monkeypatch.setattr( + completion_policy_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["c1"], + ) + monkeypatch.setattr(completion_policy_mod, "active_triage_issue_scope", lambda _plan, _state=None: None) + monkeypatch.setattr(completion_policy_mod, "unenriched_clusters", lambda _plan, _state=None: []) monkeypatch.setattr(completion_policy_mod, "unclustered_review_issues", lambda _plan, _state: []) assert completion_policy_mod._completion_clusters_valid({"clusters": {}}, state={}) is True @@ -306,6 +311,27 @@ def test_confirmation_pipeline_can_skip_stale_issue_ref_warnings(monkeypatch) -> assert report.warnings == [] +def test_confirmation_pipeline_threads_triage_issue_scope(monkeypatch) -> None: + captured: dict[str, object] = {} + + def _fake_evaluate(plan, repo_root, **kwargs): + del plan, repo_root + captured.update(kwargs) + return confirmations_enrich_mod._ConfirmationCheckReport(failures=[], warnings=[]) + + monkeypatch.setattr(confirmations_enrich_mod, "evaluate_enrich_quality", _fake_evaluate) + monkeypatch.setattr("desloppify.base.discovery.paths.get_project_root", lambda: Path(".")) + + report = confirmations_enrich_mod._collect_enrich_level_confirmation_checks( + {"clusters": {}}, + include_stale_issue_ref_warning=True, + triage_issue_ids={"review::current::issue"}, + ) + + assert report.failures == [] + assert captured["triage_issue_ids"] == {"review::current::issue"} + + def test_validate_attestation_rules() -> None: assert confirmations_basic_mod.validate_attestation("mentions naming", "observe", dimensions=["Naming"]) is None err = confirmations_basic_mod.validate_attestation( @@ -446,6 +472,50 @@ def test_lifecycle_ensure_triage_started_handles_active_blocked_and_started() -> ) +def test_lifecycle_ensure_triage_started_uses_plan_aware_backlog_for_workflow_only_queue() -> None: + saved: list[dict] = [] + services = SimpleNamespace( + save_plan=lambda plan: saved.append(dict(plan)), + append_log_entry=lambda *_a, **_k: None, + ) + + plan = { + "queue_order": ["workflow::create-plan"], + "plan_start_scores": {"strict": 86.0}, + "epic_triage_meta": {}, + } + state = { + "issues": { + "smells::src/a.py::x": { + "id": "smells::src/a.py::x", + "detector": "smells", + "status": "open", + "file": "src/a.py", + "tier": 3, + "confidence": "high", + "summary": "objective issue still in state", + "detail": {}, + } + }, + "dimension_scores": {}, + "subjective_assessments": {}, + } + + outcome = triage_lifecycle_mod.ensure_triage_started( + plan, + services=services, + state=state, + deps=triage_lifecycle_mod.TriageLifecycleDeps( + has_triage_in_queue=lambda _plan: False, + inject_triage_stages=lambda plan: plan.setdefault("queue_order", []).append("triage::observe"), + colorize=lambda text, _style: text, + ), + ) + + assert outcome.status == "started" + assert "triage::observe" in plan["queue_order"] + + def test_pipeline_context_helpers_load_prior_reports_directly() -> None: plan = { "epic_triage_meta": { @@ -629,7 +699,12 @@ def test_orchestrator_observe_helpers_and_dry_run(monkeypatch, tmp_path, capsys) def test_orchestrator_sense_dry_run(monkeypatch, tmp_path, capsys) -> None: - monkeypatch.setattr(orchestrator_sense_mod, "manual_clusters_with_issues", lambda _plan: ["cluster-a"]) + monkeypatch.setattr( + orchestrator_sense_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["cluster-a"], + ) + monkeypatch.setattr(orchestrator_sense_mod, "triage_scoped_plan", lambda plan, _state=None: plan) monkeypatch.setattr( orchestrator_sense_mod, "build_sense_check_content_prompt", @@ -658,7 +733,12 @@ def test_orchestrator_sense_dry_run(monkeypatch, tmp_path, capsys) -> None: def test_orchestrator_sense_non_dry_run_merges_outputs(monkeypatch, tmp_path, capsys) -> None: - monkeypatch.setattr(orchestrator_sense_mod, "manual_clusters_with_issues", lambda _plan: ["cluster-a"]) + monkeypatch.setattr( + orchestrator_sense_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["cluster-a"], + ) + monkeypatch.setattr(orchestrator_sense_mod, "triage_scoped_plan", lambda plan, _state=None: plan) monkeypatch.setattr( orchestrator_sense_mod, "build_sense_check_content_prompt", @@ -730,11 +810,16 @@ def fake_run_parallel_batches( assert "content:cluster-a" in result.merged_output assert "structure" in result.merged_output out = capsys.readouterr().out - assert "merged 2 batch outputs" in out + assert "merged 3 batch outputs" in out def test_orchestrator_sense_non_dry_run_reports_parallel_failures(monkeypatch, tmp_path, capsys) -> None: - monkeypatch.setattr(orchestrator_sense_mod, "manual_clusters_with_issues", lambda _plan: ["cluster-a"]) + monkeypatch.setattr( + orchestrator_sense_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["cluster-a"], + ) + monkeypatch.setattr(orchestrator_sense_mod, "triage_scoped_plan", lambda plan, _state=None: plan) monkeypatch.setattr( orchestrator_sense_mod, "build_sense_check_content_prompt", @@ -776,7 +861,12 @@ def test_orchestrator_sense_non_dry_run_reports_parallel_failures(monkeypatch, t def test_orchestrator_sense_apply_updates_sequences_and_reloads_plan(monkeypatch, tmp_path) -> None: - monkeypatch.setattr(orchestrator_sense_mod, "manual_clusters_with_issues", lambda _plan: ["cluster-a"]) + monkeypatch.setattr( + orchestrator_sense_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["cluster-a"], + ) + monkeypatch.setattr(orchestrator_sense_mod, "triage_scoped_plan", lambda plan, _state=None: plan) content_modes: list[str] = [] structure_modes: list[str] = [] @@ -834,6 +924,8 @@ def fake_run_parallel_batches( phase_order.append("content") if "structure" in labels: phase_order.append("structure") + if "value" in labels: + phase_order.append("value") for task in tasks.values(): assert task().ok return [] @@ -855,6 +947,11 @@ def fake_reload_plan(): "build_sense_check_structure_prompt", fake_structure_prompt, ) + monkeypatch.setattr( + orchestrator_sense_mod, + "build_sense_check_value_prompt", + lambda **_kwargs: "value prompt", + ) monkeypatch.setattr(orchestrator_sense_mod, "run_triage_stage", fake_run_triage_stage) monkeypatch.setattr(orchestrator_sense_mod, "run_parallel_batches", fake_run_parallel_batches) @@ -885,8 +982,94 @@ def fake_reload_plan(): assert content_modes == ["self_record"] assert structure_modes == ["self_record", "self_record"] assert structure_versions[-1] == "after-content" - assert reload_calls["count"] == 1 - assert phase_order == ["content", "structure"] + assert reload_calls["count"] == 2 + assert phase_order == ["content", "structure", "value"] + + +def test_orchestrator_sense_scopes_content_batches_to_active_triage(monkeypatch, tmp_path) -> None: + content_clusters: list[str] = [] + structure_versions: list[dict] = [] + + monkeypatch.setattr( + orchestrator_sense_mod, + "scoped_manual_clusters_with_issues", + lambda _plan, _state=None: ["current"], + ) + monkeypatch.setattr( + orchestrator_sense_mod, + "triage_scoped_plan", + lambda plan, _state=None: { + **plan, + "clusters": {"current": plan["clusters"]["current"]}, + }, + ) + + def fake_content_prompt(*, cluster_name, plan, **_kwargs): + content_clusters.append(cluster_name) + assert set(plan.get("clusters", {})) == {"current"} + return "content prompt" + + def fake_structure_prompt(*, plan, **_kwargs): + structure_versions.append(plan) + assert set(plan.get("clusters", {})) == {"current"} + return "structure prompt" + + monkeypatch.setattr(orchestrator_sense_mod, "build_sense_check_content_prompt", fake_content_prompt) + monkeypatch.setattr(orchestrator_sense_mod, "build_sense_check_structure_prompt", fake_structure_prompt) + monkeypatch.setattr(orchestrator_sense_mod, "build_sense_check_value_prompt", lambda **_kwargs: "value prompt") + + def fake_run_triage_stage( + *, + prompt, + repo_root, + output_file, + log_file, + timeout_seconds, + validate_output_fn, + ): + del prompt, repo_root, log_file, timeout_seconds + output_file.write_text("ok", encoding="utf-8") + assert validate_output_fn(output_file) + return codex_runner_mod.TriageStageRunResult(exit_code=0) + + monkeypatch.setattr(orchestrator_sense_mod, "run_triage_stage", fake_run_triage_stage) + monkeypatch.setattr( + orchestrator_sense_mod, + "run_parallel_batches", + lambda **kwargs: [task() for task in kwargs["tasks"].values()] and [], + ) + + prompts_dir = tmp_path / "prompts" + output_dir = tmp_path / "out" + logs_dir = tmp_path / "logs" + prompts_dir.mkdir() + output_dir.mkdir() + logs_dir.mkdir() + + result = orchestrator_sense_mod.run_sense_check( + plan={ + "clusters": { + "current": {"issue_ids": ["review::current::issue"], "action_steps": []}, + "legacy": {"issue_ids": ["review::legacy::issue"], "action_steps": []}, + } + }, + state={ + "issues": { + "review::current::issue": {"status": "open", "detector": "review"}, + "review::legacy::issue": {"status": "open", "detector": "review"}, + } + }, + repo_root=tmp_path, + prompts_dir=prompts_dir, + output_dir=output_dir, + logs_dir=logs_dir, + timeout_seconds=60, + dry_run=False, + ) + + assert result.ok + assert content_clusters == ["current"] + assert len(structure_versions) == 1 def test_default_sense_handler_enables_apply_update_mode(monkeypatch, tmp_path: Path) -> None: @@ -913,6 +1096,7 @@ def fake_run_sense_check(**kwargs): cli_command="/tmp/run_desloppify.sh", append_run_log=lambda _line: None, services=SimpleNamespace(load_plan=lambda: {"clusters": {}}), + state=None, ) handler = orchestrator_pipeline_execution_mod.DEFAULT_STAGE_HANDLERS["sense-check"] assert handler.run_parallel is not None diff --git a/desloppify/tests/commands/plan/test_triage_stage_policy_direct.py b/desloppify/tests/commands/plan/test_triage_stage_policy_direct.py index ddf1e0b0..7380b638 100644 --- a/desloppify/tests/commands/plan/test_triage_stage_policy_direct.py +++ b/desloppify/tests/commands/plan/test_triage_stage_policy_direct.py @@ -61,7 +61,7 @@ def test_compute_triage_progress_blocks_sense_check_until_enrich_confirmed() -> assert progress.current_stage is None assert progress.next_command == "desloppify plan triage --confirm enrich" assert progress.blocked_reason == ( - "Verify accuracy & cross-cluster deps blocked until Make steps executor-ready (detail, refs) is confirmed." + "Verify accuracy, structure & value blocked until Make steps executor-ready (detail, refs) is confirmed." ) diff --git a/desloppify/tests/commands/plan/test_triage_stage_rendering.py b/desloppify/tests/commands/plan/test_triage_stage_rendering.py index e29835f7..d2488df9 100644 --- a/desloppify/tests/commands/plan/test_triage_stage_rendering.py +++ b/desloppify/tests/commands/plan/test_triage_stage_rendering.py @@ -14,7 +14,8 @@ def test_print_observe_report_requirement_emits_guidance(monkeypatch, capsys) -> out = capsys.readouterr().out assert "--report is required for --stage observe" in out - assert "Do NOT just list issue IDs" in out + assert "Verify the queued issues one by one against the code" in out + assert "Cite the files you read" in out def test_print_complete_summary_emits_stage_details(monkeypatch, capsys) -> None: @@ -48,7 +49,7 @@ def test_print_complete_summary_emits_stage_details(monkeypatch, capsys) -> None assert "Triage summary" in out assert "Observe: 5 issues analysed" in out assert "cluster-alpha: 2 steps" in out - assert "Sense-check: content & structure verified" in out + assert "Sense-check: content, structure & value verified" in out def test_print_new_issues_since_last_lists_ids_and_summaries(monkeypatch, capsys) -> None: diff --git a/desloppify/tests/commands/review/test_review_importing_support_direct.py b/desloppify/tests/commands/review/test_review_importing_support_direct.py index 057b6dce..bee52d25 100644 --- a/desloppify/tests/commands/review/test_review_importing_support_direct.py +++ b/desloppify/tests/commands/review/test_review_importing_support_direct.py @@ -437,9 +437,8 @@ def test_sync_plan_after_import_preserves_scan_phase_for_temporary_skips( assert saved -def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> None: +def test_sync_plan_after_import_prunes_covered_subjective_ids(monkeypatch) -> None: plan: dict = {"queue_order": ["subjective::naming_quality", "review::existing"]} - purge_calls: list[list[str]] = [] _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) monkeypatch.setattr( @@ -450,6 +449,7 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No added_to_queue=["review::new"], triage_injected=False, stale_pruned_from_queue=[], + covered_subjective_pruned_from_queue=[], triage_injected_ids=[], triage_deferred=False, ), @@ -458,11 +458,53 @@ def test_sync_plan_after_import_does_not_purge_subjective_ids(monkeypatch) -> No plan_sync_mod.sync_plan_after_import( state={"issues": {"review::new": {"summary": "new review work item"}}}, diff={"new": 1, "reopened": 0}, - assessment_mode="issues_only", + assessment_mode="trusted_internal", + request=_sync_request( + import_payload={"assessments": {"Naming quality": 80}, "issues": []}, + ), ) - assert purge_calls == [] - assert "subjective::naming_quality" in plan["queue_order"] + assert "subjective::naming_quality" not in plan["queue_order"] + + +def test_sync_plan_after_import_uses_pre_import_boundary_for_reconcile(monkeypatch) -> None: + plan: dict = {"queue_order": []} + seen = {"reconcile_called": False} + + _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) + monkeypatch.setattr( + plan_sync_mod, + "sync_plan_after_review_import", + lambda _plan, _state, inject_triage=False: ( + _plan["queue_order"].append("review::new") + or SimpleNamespace( + new_ids={"review::new"}, + added_to_queue=["review::new"], + triage_injected=False, + stale_pruned_from_queue=[], + covered_subjective_pruned_from_queue=[], + triage_injected_ids=[], + triage_deferred=False, + ) + ), + ) + monkeypatch.setattr( + plan_sync_mod, + "reconcile_plan", + lambda *_a, **_k: seen.__setitem__("reconcile_called", True) + or plan_sync_mod.ReconcileResult(), + ) + + plan_sync_mod.sync_plan_after_import( + state={"issues": {"review::new": {"summary": "new review work item"}}}, + diff={"new": 1, "reopened": 0}, + assessment_mode="trusted_internal", + request=_sync_request( + import_payload={"assessments": {"Naming quality": 80}, "issues": []}, + ), + ) + + assert seen["reconcile_called"] is True def test_sync_plan_after_import_skips_mid_cycle_reconcile_for_assessment_only_import( @@ -572,7 +614,8 @@ def test_sync_plan_after_import_skips_mid_cycle_reconcile_for_assessment_only_im ) assert reconcile_calls == [] - assert "auto/initial-review" in plan["clusters"] + assert plan["queue_order"] == [] + assert plan["clusters"]["auto/initial-review"]["issue_ids"] == [] def test_refresh_scorecard_after_import_only_for_trusted_assessments(monkeypatch) -> None: @@ -739,11 +782,12 @@ def test_plan_sync_source_preserves_scoped_sync_pipeline_contract() -> None: assert 'trusted = assessment_mode in {"trusted_internal", "attested_external"}' in src assert "import_result = _sync_review_delta(plan, state, sync_inputs)" in src assert "import_scores_result = sync_import_scores_needed(" in src - assert 'plan.pop("previous_plan_start_scores", None)' in src + assert "clear_score_communicated_sentinel(plan)" in src assert "sync_inputs = _build_import_sync_inputs(diff, import_payload)" in src assert "result = ReconcileResult()" in src - assert "if live_planned_queue_empty(plan):" in src - assert "result = reconcile_plan(plan, state, target_strict=target_strict)" in src + assert "was_boundary_ready = live_planned_queue_empty(plan)" in src + assert "if was_boundary_ready and (" in src + assert "_prune_covered_subjective_ids_from_plan" in src assert "_append_review_import_sync_log(" in src assert "save_plan(plan, plan_path)" in src assert "_print_review_import_sync(" in src diff --git a/desloppify/tests/commands/test_lifecycle_transitions.py b/desloppify/tests/commands/test_lifecycle_transitions.py index 1587b059..f156a84f 100644 --- a/desloppify/tests/commands/test_lifecycle_transitions.py +++ b/desloppify/tests/commands/test_lifecycle_transitions.py @@ -1,7 +1,8 @@ """Integration tests for lifecycle transitions through reconcile → work queue. Exercises the full lifecycle by walking through each stage: - scan → initial reviews → communicate-score → create-plan → triage → objectives + scan → initial reviews → objectives → postflight scan → subjective review + → communicate-score/create-plan → triage Between scans, items are completed via ``purge_ids`` (what ``plan resolve`` does) and the queue is re-checked without reconciling. ``reconcile`` only @@ -114,15 +115,15 @@ def _queue_ids(state: dict, plan: dict) -> list[str]: return [item["id"] for item in result["items"]] -def _spoof_reviews_complete(state: dict) -> None: +def _spoof_reviews_complete(state: dict, *, score: float = 95.0) -> None: """Mutate state in place: replace all placeholder dims with scored ones.""" for key in DIM_KEYS: - display, dim_entry, assessment = _scored_dim_entries(key, 75.0) + display, dim_entry, assessment = _scored_dim_entries(key, score) state["dimension_scores"][display] = dim_entry state["subjective_assessments"][key] = assessment - state["strict_score"] = 75.0 - state["overall_score"] = 75.0 - state["objective_score"] = 80.0 + state["strict_score"] = score + state["overall_score"] = score + state["objective_score"] = score def _complete_endgame_subjective_reruns(state: dict) -> None: @@ -201,8 +202,9 @@ class TestScanAfterReviewsInjectsWorkflow: def test_workflow_items_injected_on_next_scan(self, monkeypatch): """Scan after completing reviews injects communicate-score and create-plan. - Workflow items are postflight — they only become visible after objectives - are drained. + Postflight is exclusive once the scan boundary is crossed: + score/workflow surfaces first, and only then does execute backlog + reappear. """ state = _build_state(OBJECTIVE_ISSUES, [_placeholder_dim_entries(k) for k in DIM_KEYS]) plan = _reconcile(state, empty_plan(), monkeypatch) @@ -215,34 +217,23 @@ def test_workflow_items_injected_on_next_scan(self, monkeypatch): # --- Next scan (reconcile) --- plan = _reconcile(state, plan, monkeypatch) - ids = _queue_ids(state, plan) - # Objective items visible while they exist - assert "obj-1" in ids - # Workflow items are postflight — gated behind objective items - assert WORKFLOW_COMMUNICATE_SCORE_ID not in ids - - # After completing objectives, postflight sequence begins. - # Workflow items surface before subjective follow-up. - state["work_items"]["obj-1"]["status"] = "fixed" - state["work_items"]["obj-2"]["status"] = "fixed" ids = _queue_ids(state, plan) assert WORKFLOW_COMMUNICATE_SCORE_ID in ids assert WORKFLOW_CREATE_PLAN_ID in ids assert ids.index(WORKFLOW_COMMUNICATE_SCORE_ID) < ids.index(WORKFLOW_CREATE_PLAN_ID) - # After completing workflow items, subjective follow-up becomes visible purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID, WORKFLOW_CREATE_PLAN_ID]) ids = _queue_ids(state, plan) - assert any(fid.startswith("subjective::") for fid in ids), f"Expected subjective: {ids}" + assert "obj-1" in ids and "obj-2" in ids # --------------------------------------------------------------------------- -# Phase-order contract: score -> triage -> review -> assessment (after objective drains) +# Phase-order contract: assessment -> score -> triage -> review (after objective drains) # --------------------------------------------------------------------------- class TestPhaseOrderInvariant: - def test_score_then_assessment_when_no_review_followup(self): + def test_assessment_then_score_when_no_review_followup(self): """Endgame queue order is fixed once objective backlog is drained.""" state = _build_state( [], @@ -261,21 +252,22 @@ def test_score_then_assessment_when_no_review_followup(self): # Mark postflight scan as done so it doesn't block plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 1} - # Workflow items surface before subjective follow-up. - ids = _queue_ids(state, plan) - assert ids == [WORKFLOW_COMMUNICATE_SCORE_ID] - - # After workflow completion, subjective follow-up appears. - purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID]) + # Subjective follow-up surfaces before workflow items. ids = _queue_ids(state, plan) assert ids == ["subjective::naming_quality"] - # After subjective follow-up completion, triage becomes visible. + # After subjective follow-up completion, workflow appears. + ids = _queue_ids(state, plan) state["subjective_assessments"]["naming_quality"]["needs_review_refresh"] = False state["subjective_assessments"]["naming_quality"]["score"] = 100.0 state["dimension_scores"][DIM_DISPLAY["naming_quality"]]["score"] = 100.0 state["dimension_scores"][DIM_DISPLAY["naming_quality"]]["strict"] = 100.0 ids = _queue_ids(state, plan) + assert ids == [WORKFLOW_COMMUNICATE_SCORE_ID] + + # After workflow completion, triage becomes visible. + purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID]) + ids = _queue_ids(state, plan) assert ids == ["triage::observe"] @@ -286,7 +278,7 @@ def test_score_then_assessment_when_no_review_followup(self): class TestTriageInjectedOnScan: def test_triage_after_review_issues_on_scan(self, monkeypatch): - """Scan with new review issues injects triage, but objectives stay unblocked.""" + """Review-driven triage waits behind score workflow after review import.""" state = _build_state(OBJECTIVE_ISSUES, [_placeholder_dim_entries(k) for k in DIM_KEYS]) plan = _reconcile(state, empty_plan(), monkeypatch) @@ -301,21 +293,14 @@ def test_triage_after_review_issues_on_scan(self, monkeypatch): ids = _queue_ids(state, plan) assert not any(fid.startswith("triage::") for fid in ids), ids - assert "obj-1" in ids and "obj-2" in ids + assert WORKFLOW_COMMUNICATE_SCORE_ID in ids + assert WORKFLOW_CREATE_PLAN_ID in ids # Triage stages are still injected in plan order. assert all(sid in plan["queue_order"] for sid in TRIAGE_STAGE_IDS) - # Once objective queue drains, lifecycle enters postflight. - # Workflow surfaces before triage/review/assessment. - state["work_items"]["obj-1"]["status"] = "fixed" - state["work_items"]["obj-2"]["status"] = "fixed" - ids = _queue_ids(state, plan) - workflow_ids = [fid for fid in ids if fid.startswith("workflow::")] - assert len(workflow_ids) > 0, f"Expected workflow items: {ids}" - - # After completing workflow items, triage becomes visible. - purge_ids(plan, workflow_ids) + # After completing workflow items, triage becomes visible before execute resumes. + purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID, WORKFLOW_CREATE_PLAN_ID]) ids = _queue_ids(state, plan) triage_ids = [fid for fid in ids if fid.startswith("triage::")] assert len(triage_ids) == len(TRIAGE_STAGE_IDS), ids @@ -356,34 +341,23 @@ def test_golden_path(self, monkeypatch): assert "obj-1" in ids, f"Post-reviews (no scan): {ids}" assert WORKFLOW_COMMUNICATE_SCORE_ID not in ids, f"Post-reviews (no scan): {ids}" - # ── Scan 2: workflow items injected but gated behind objectives ── + # ── Scan 2: score workflow surfaces before execute resumes ── plan = _reconcile(state, plan, monkeypatch) ids = _queue_ids(state, plan) - # Workflow items are postflight — only visible after objectives drain - assert "obj-1" in ids, f"Scan 2: {ids}" - assert WORKFLOW_COMMUNICATE_SCORE_ID not in ids, f"Scan 2: {ids}" - - # ── Between scans: complete objectives to unlock postflight ── - state["work_items"]["obj-1"]["status"] = "fixed" - state["work_items"]["obj-2"]["status"] = "fixed" - ids = _queue_ids(state, plan) - # Workflow comes first in postflight - assert WORKFLOW_COMMUNICATE_SCORE_ID in ids, f"Post-subjective: {ids}" - assert WORKFLOW_CREATE_PLAN_ID in ids, f"Post-subjective: {ids}" + assert WORKFLOW_COMMUNICATE_SCORE_ID in ids, f"Scan 2: {ids}" + assert WORKFLOW_CREATE_PLAN_ID in ids, f"Scan 2: {ids}" - # ── Complete workflow items ── + # ── Complete workflow items; clear cycle baseline so execute resumes ── purge_ids(plan, [WORKFLOW_COMMUNICATE_SCORE_ID, WORKFLOW_CREATE_PLAN_ID]) + plan["plan_start_scores"] = {} ids = _queue_ids(state, plan) - assert any(fid.startswith("subjective::") for fid in ids), f"Post-workflow: {ids}" - - # ── Complete subjective follow-up ── - _complete_endgame_subjective_reruns(state) - ids = _queue_ids(state, plan) - assert not any(fid.startswith("workflow::") for fid in ids), f"Post-subjective: {ids}" + assert "obj-1" in ids and "obj-2" in ids, f"Post-workflow: {ids}" # ── Scan 3: add review issues + reopen objectives for mid-cycle test ── state["work_items"]["obj-1"]["status"] = "open" state["work_items"]["obj-2"]["status"] = "open" + # Place objectives in queue_order so the plan is mid-cycle (non-empty). + plan["queue_order"] = ["obj-1", "obj-2"] _add_review_issues(state) plan = _reconcile(state, plan, monkeypatch) ids = _queue_ids(state, plan) @@ -392,7 +366,6 @@ def test_golden_path(self, monkeypatch): assert not any(sid in plan["queue_order"] for sid in TRIAGE_STAGE_IDS), ( f"Triage should be deferred mid-cycle: {plan['queue_order']}" ) - assert plan["epic_triage_meta"].get("triage_recommended"), "triage_recommended flag expected" assert "obj-1" in ids and "obj-2" in ids, f"Scan 3: {ids}" # ── Complete objective queue → rescan injects triage in plan, but diff --git a/desloppify/tests/commands/test_postflight_lifecycle_integration.py b/desloppify/tests/commands/test_postflight_lifecycle_integration.py new file mode 100644 index 00000000..54b8e7f4 --- /dev/null +++ b/desloppify/tests/commands/test_postflight_lifecycle_integration.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from desloppify.base.subjective_dimensions import DISPLAY_NAMES +from desloppify.engine._plan.operations.lifecycle import purge_ids +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_REVIEW_INITIAL, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, + current_lifecycle_phase, + mark_postflight_scan_completed, +) +from desloppify.engine._plan.schema import empty_plan +from desloppify.engine._plan.sync import reconcile_plan +from desloppify.engine._work_queue.snapshot import ( + PHASE_REVIEW_INITIAL, + PHASE_WORKFLOW_POSTFLIGHT, + build_queue_snapshot, +) + + +def _placeholder_state() -> dict: + display = DISPLAY_NAMES["naming_quality"] + return { + "issues": {}, + "work_items": {}, + "dimension_scores": { + display: { + "score": 0, + "strict": 0, + "failing": 0, + "checks": 0, + "detectors": { + "subjective_assessment": { + "placeholder": True, + "dimension_key": "naming_quality", + } + }, + } + }, + "subjective_assessments": { + "naming_quality": { + "score": 0, + "placeholder": True, + } + }, + "assessment_import_audit": [], + } + + +def _mark_review_complete(state: dict) -> None: + display = DISPLAY_NAMES["naming_quality"] + state["dimension_scores"][display] = { + "score": 88.0, + "strict": 88.0, + "failing": 0, + "checks": 1, + "detectors": { + "subjective_assessment": { + "placeholder": False, + "dimension_key": "naming_quality", + } + }, + } + state["subjective_assessments"]["naming_quality"] = { + "score": 88.0, + "placeholder": False, + "assessed_at": "2026-03-13T12:00:00+00:00", + } + state["issues"]["unused::src/app.ts::x"] = { + "id": "unused::src/app.ts::x", + "detector": "unused", + "status": "open", + "file": "src/app.ts", + "tier": 1, + "confidence": "high", + "summary": "unused import", + "detail": {}, + } + state["work_items"] = state["issues"] + + +def test_postflight_progresses_review_then_workflow() -> None: + state = _placeholder_state() + plan = empty_plan() + + reconcile_plan(plan, state, target_strict=95.0) + initial_snapshot = build_queue_snapshot(state, plan=plan) + + assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_REVIEW_INITIAL + assert initial_snapshot.phase == PHASE_REVIEW_INITIAL + assert [item["id"] for item in initial_snapshot.execution_items] == [ + "subjective::naming_quality" + ] + + _mark_review_complete(state) + purge_ids(plan, ["subjective::naming_quality"]) + mark_postflight_scan_completed(plan, scan_count=1) + reconcile_plan(plan, state, target_strict=95.0) + workflow_snapshot = build_queue_snapshot(state, plan=plan) + + assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT + assert workflow_snapshot.phase == PHASE_WORKFLOW_POSTFLIGHT + assert not any(fid.startswith("subjective::") for fid in plan["queue_order"]) + assert all(item["id"].startswith("workflow::") for item in workflow_snapshot.execution_items) diff --git a/desloppify/tests/commands/test_transitive_engine.py b/desloppify/tests/commands/test_transitive_engine.py index 47b01a47..50652577 100644 --- a/desloppify/tests/commands/test_transitive_engine.py +++ b/desloppify/tests/commands/test_transitive_engine.py @@ -134,9 +134,10 @@ def test_merge_new_issues(self, mock_recompute): assert "smells::foo.py::debug_tag" in state["work_items"] @patch.object(merge_mod, "_recompute_stats") - def test_merge_keeps_disappeared_open_issue_open(self, mock_recompute): - """Old open issues not in current scan stay open until manually resolved.""" + def test_merge_keeps_disappeared_open_issue_when_file_exists(self, mock_recompute, tmp_path): + """Open issues whose file still exists stay open even if absent from scan.""" mock_recompute.return_value = None + (tmp_path / "old.py").write_text("# still here") state = self._make_state() state["work_items"]["smells::old.py::leftover"] = { "id": "smells::old.py::leftover", @@ -155,11 +156,41 @@ def test_merge_keeps_disappeared_open_issue_open(self, mock_recompute): } state["stats"]["open"] = 1 diff = merge_scan( - state, [], MergeScanOptions(lang="python", force_resolve=True) + state, [], MergeScanOptions(lang="python", force_resolve=True, project_root=str(tmp_path)) ) assert diff["auto_resolved"] == 0 assert state["work_items"]["smells::old.py::leftover"]["status"] == "open" + @patch.object(merge_mod, "_recompute_stats") + def test_merge_auto_resolves_issue_when_file_deleted(self, mock_recompute, tmp_path): + """Open issues for files that no longer exist on disk are auto-resolved.""" + mock_recompute.return_value = None + # tmp_path exists but old.py does NOT — simulates a deleted file + state = self._make_state() + state["work_items"]["smells::old.py::leftover"] = { + "id": "smells::old.py::leftover", + "detector": "smells", + "file": "old.py", + "tier": 2, + "confidence": "high", + "summary": "Old issue", + "detail": {}, + "status": "open", + "note": None, + "first_seen": "2026-01-01T00:00:00+00:00", + "last_seen": "2026-01-01T00:00:00+00:00", + "resolved_at": None, + "reopen_count": 0, + } + state["stats"]["open"] = 1 + diff = merge_scan( + state, [], MergeScanOptions(lang="python", force_resolve=True, project_root=str(tmp_path)) + ) + assert diff["auto_resolved"] == 1 + item = state["work_items"]["smells::old.py::leftover"] + assert item["status"] == "auto_resolved" + assert "no longer exists" in item["note"] + @patch.object(merge_mod, "_recompute_stats") def test_merge_with_ignore_patterns(self, mock_recompute): """Issues matching ignore patterns are suppressed but still counted.""" @@ -519,9 +550,9 @@ def test_fix_parser_args(self): parser = argparse.ArgumentParser() sub = parser.add_subparsers(dest="command") with patch( - "desloppify.app.cli_support.parser_groups_admin.get_lang" - ) as mock_get_lang: - mock_get_lang.side_effect = ImportError() + "desloppify.app.cli_support.parser_groups_admin.load_lang_config" + ) as mock_load: + mock_load.side_effect = ImportError() parser_admin_mod._add_autofix_parser(sub, ["python"]) args = parser.parse_args( diff --git a/desloppify/tests/engine/test_sync_split_modules_direct.py b/desloppify/tests/engine/test_sync_split_modules_direct.py index a2cd9719..58f3a87a 100644 --- a/desloppify/tests/engine/test_sync_split_modules_direct.py +++ b/desloppify/tests/engine/test_sync_split_modules_direct.py @@ -18,6 +18,7 @@ import desloppify.engine._plan.triage.playbook as triage_playbook_mod import desloppify.engine._scoring.state_integration_subjective as scoring_subjective_mod import desloppify.engine._work_queue.snapshot as snapshot_mod +import desloppify.engine._work_queue.synthetic as synthetic_mod def test_sync_context_helpers_cover_policy_and_fallback_paths() -> None: @@ -867,7 +868,7 @@ def test_queue_snapshot_non_autofix_auto_cluster_does_not_execute_without_queuei assert "dict_keys::a" in {item["id"] for item in snapshot.backlog_items} -def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: +def test_queue_snapshot_orders_scan_assessment_workflow_and_triage_postflight() -> None: review_state = { "issues": { "review::src/a.py::naming": { @@ -961,14 +962,16 @@ def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: "epic_triage_meta": {"triaged_ids": ["review::src/a.py::naming"]}, }, ) - assert assessment_with_review_snapshot.phase == snapshot_mod.PHASE_REVIEW_POSTFLIGHT + assert assessment_with_review_snapshot.phase == snapshot_mod.PHASE_ASSESSMENT_POSTFLIGHT + # Subjective dimension item is suppressed when review issues cover the + # same dimension — the assessment request alone surfaces. assert [item["id"] for item in assessment_with_review_snapshot.execution_items] == [ - "review::src/a.py::naming" + "subjective_review::naming_quality", ] - assert "subjective::naming_quality" in { + assert "review::src/a.py::naming" in { item["id"] for item in assessment_with_review_snapshot.backlog_items } - assert "subjective_review::naming_quality" in { + assert "subjective::naming_quality" not in { item["id"] for item in assessment_with_review_snapshot.backlog_items } @@ -1013,7 +1016,25 @@ def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: assert [item["id"] for item in post_triage_snapshot.execution_items] == ["review::src/a.py::naming"] workflow_snapshot = snapshot_mod.build_queue_snapshot( - {"issues": {}}, + { + "dimension_scores": { + "Naming quality": { + "score": 100.0, + "strict": 100.0, + "failing": 0, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + } + }, + "subjective_assessments": { + "naming_quality": { + "score": 100.0, + "needs_review_refresh": False, + } + }, + "issues": {}, + }, plan={ "queue_order": ["workflow::communicate-score", "triage::observe"], "refresh_state": {"postflight_scan_completed_at_scan_count": 1}, @@ -1022,6 +1043,60 @@ def test_queue_snapshot_orders_scan_review_and_workflow_postflight() -> None: assert workflow_snapshot.phase == snapshot_mod.PHASE_WORKFLOW_POSTFLIGHT assert [item["id"] for item in workflow_snapshot.execution_items] == ["workflow::communicate-score"] + assessment_beats_workflow_snapshot = snapshot_mod.build_queue_snapshot( + assessment_state, + plan={ + "queue_order": ["workflow::communicate-score", "triage::observe"], + "refresh_state": { + "postflight_scan_completed_at_scan_count": 1, + "lifecycle_phase": "workflow", + }, + }, + ) + assert assessment_beats_workflow_snapshot.phase == snapshot_mod.PHASE_WORKFLOW_POSTFLIGHT + assert [item["id"] for item in assessment_beats_workflow_snapshot.execution_items] == [ + "workflow::communicate-score", + ] + + +def test_build_subjective_items_suppresses_same_cycle_review_refresh_during_workflow() -> None: + items = synthetic_mod.build_subjective_items( + { + "assessment_import_audit": [ + {"timestamp": "2026-03-13T04:19:00+00:00", "mode": "trusted_internal"} + ], + "dimension_scores": { + "Naming quality": { + "score": 70.0, + "strict": 70.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + } + }, + "subjective_assessments": { + "naming_quality": { + "score": 70.0, + "assessed_at": "2026-03-13T04:19:00+00:00", + "needs_review_refresh": True, + "refresh_reason": "review_issue_wontfix", + "stale_since": "2026-03-13T04:39:00+00:00", + } + }, + }, + {}, + threshold=95.0, + plan={ + "refresh_state": { + "lifecycle_phase": "workflow", + "postflight_scan_completed_at_scan_count": 1, + } + }, + ) + + assert items == [] + def test_queue_snapshot_prefers_deferred_disposition_over_run_scan() -> None: plan = { @@ -1048,12 +1123,14 @@ def test_queue_snapshot_prefers_deferred_disposition_over_run_scan() -> None: assert [item["id"] for item in snapshot.execution_items] == ["workflow::deferred-disposition"] -def test_coarse_phase_name_collapses_internal_review_workflow_and_triage() -> None: - assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_REVIEW_INITIAL) == "review" - assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_ASSESSMENT_POSTFLIGHT) == "review" - assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_REVIEW_POSTFLIGHT) == "review" - assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_WORKFLOW_POSTFLIGHT) == "workflow" - assert snapshot_mod.coarse_phase_name(snapshot_mod.PHASE_TRIAGE_POSTFLIGHT) == "triage" +def test_coarse_lifecycle_phase_collapses_internal_review_workflow_and_triage() -> None: + from desloppify.engine._plan.refresh_lifecycle import COARSE_PHASE_MAP + + assert COARSE_PHASE_MAP[snapshot_mod.PHASE_REVIEW_INITIAL] == "review" + assert COARSE_PHASE_MAP[snapshot_mod.PHASE_ASSESSMENT_POSTFLIGHT] == "review" + assert COARSE_PHASE_MAP[snapshot_mod.PHASE_REVIEW_POSTFLIGHT] == "review" + assert COARSE_PHASE_MAP[snapshot_mod.PHASE_WORKFLOW_POSTFLIGHT] == "workflow" + assert COARSE_PHASE_MAP[snapshot_mod.PHASE_TRIAGE_POSTFLIGHT] == "triage" def test_triage_playbook_commands_cover_runner_and_stage_validation() -> None: diff --git a/desloppify/tests/plan/test_epic_triage.py b/desloppify/tests/plan/test_epic_triage.py index 6750ab5c..daab2e66 100644 --- a/desloppify/tests/plan/test_epic_triage.py +++ b/desloppify/tests/plan/test_epic_triage.py @@ -530,14 +530,23 @@ def test_unconfirmed_recorded_stage_remains_pending(self): def test_missing_queue_id_for_unconfirmed_stage_is_still_rendered(self): plan = empty_plan() - plan["queue_order"] = ["triage::enrich", "triage::sense-check", "triage::commit"] + plan["queue_order"] = [ + "triage::enrich", + "triage::sense-check", + "triage::commit", + ] plan["epic_triage_meta"] = { "triage_stages": {"organize": {"report": "cluster plan"}}, } state = _state_with_review_issues("r1") items = build_triage_stage_items(plan, state) ids = [it["id"] for it in items] - assert ids == ["triage::organize", "triage::enrich", "triage::sense-check", "triage::commit"] + assert ids == [ + "triage::organize", + "triage::enrich", + "triage::sense-check", + "triage::commit", + ] enrich = next(it for it in items if it["id"] == "triage::enrich") assert enrich["blocked_by"] == ["triage::organize"] diff --git a/desloppify/tests/plan/test_phase_cleanup.py b/desloppify/tests/plan/test_phase_cleanup.py new file mode 100644 index 00000000..e163affb --- /dev/null +++ b/desloppify/tests/plan/test_phase_cleanup.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_EXECUTE, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT, + LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, +) +from desloppify.engine._plan.schema import empty_plan +from desloppify.engine._plan.sync.phase_cleanup import prune_synthetic_for_phase + + +def test_workflow_cleanup_prunes_only_subjective_items() -> None: + plan = empty_plan() + plan["queue_order"] = [ + "subjective::naming_quality", + "workflow::communicate-score", + "triage::observe", + "unused::src/a.ts::x", + ] + plan["overrides"] = { + "subjective::naming_quality": {"issue_id": "subjective::naming_quality"}, + "workflow::communicate-score": {"issue_id": "workflow::communicate-score"}, + } + plan["clusters"] = { + "mixed": { + "name": "mixed", + "issue_ids": [ + "subjective::naming_quality", + "workflow::communicate-score", + "unused::src/a.ts::x", + ], + } + } + + pruned = prune_synthetic_for_phase(plan, LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT) + + assert pruned == ["subjective::naming_quality"] + assert plan["queue_order"] == [ + "workflow::communicate-score", + "triage::observe", + "unused::src/a.ts::x", + ] + assert "subjective::naming_quality" not in plan["overrides"] + assert plan["clusters"]["mixed"]["issue_ids"] == [ + "workflow::communicate-score", + "unused::src/a.ts::x", + ] + + +def test_review_postflight_cleanup_prunes_subjective_and_workflow() -> None: + plan = empty_plan() + plan["queue_order"] = [ + "subjective::naming_quality", + "workflow::communicate-score", + "review::src/a.ts::naming", + ] + + pruned = prune_synthetic_for_phase(plan, LIFECYCLE_PHASE_REVIEW_POSTFLIGHT) + + assert pruned == [ + "subjective::naming_quality", + "workflow::communicate-score", + ] + assert plan["queue_order"] == ["review::src/a.ts::naming"] + + +def test_execute_cleanup_prunes_all_synthetic_prefixes() -> None: + plan = empty_plan() + plan["queue_order"] = [ + "subjective::naming_quality", + "workflow::communicate-score", + "triage::observe", + "unused::src/a.ts::x", + ] + + pruned = prune_synthetic_for_phase(plan, LIFECYCLE_PHASE_EXECUTE) + + assert pruned == [ + "subjective::naming_quality", + "workflow::communicate-score", + "triage::observe", + ] + assert plan["queue_order"] == ["unused::src/a.ts::x"] diff --git a/desloppify/tests/plan/test_reconcile.py b/desloppify/tests/plan/test_reconcile.py index 3e13eb1b..c2b0a695 100644 --- a/desloppify/tests/plan/test_reconcile.py +++ b/desloppify/tests/plan/test_reconcile.py @@ -144,3 +144,24 @@ def test_reconcile_no_log_when_no_changes(): log = plan.get("execution_log", []) reconcile_entries = [e for e in log if e["action"] == "reconcile"] assert len(reconcile_entries) == 0 + + +def test_reconcile_prunes_existing_superseded_references(): + """Already-superseded IDs should not linger in queue_order or clusters.""" + plan = _plan_with_queue("a", "b") + ensure_plan_defaults(plan) + plan["superseded"]["a"] = { + "original_id": "a", + "status": "superseded", + "superseded_at": "2026-01-01T00:00:00+00:00", + } + plan["promoted_ids"] = ["a"] + create_cluster(plan, "my-cluster") + add_to_cluster(plan, "my-cluster", ["a", "b"]) + + result = reconcile_plan_after_scan(plan, _state_with_issues("b")) + + assert result.changes > 0 + assert "a" not in plan["queue_order"] + assert "a" not in plan["promoted_ids"] + assert "a" not in plan["clusters"]["my-cluster"]["issue_ids"] diff --git a/desloppify/tests/plan/test_reconcile_pipeline.py b/desloppify/tests/plan/test_reconcile_pipeline.py index 33239ef1..ad2f2e9d 100644 --- a/desloppify/tests/plan/test_reconcile_pipeline.py +++ b/desloppify/tests/plan/test_reconcile_pipeline.py @@ -1,13 +1,31 @@ -"""Direct tests for the shared reconcile pipeline and queue ownership rules.""" +"""Direct tests for the shared reconcile pipeline and queue ownership rules. + +Covers the gate matrix from centralize-postflight-pipeline.md: +- Boundary detection (fresh, mid-cycle, queue-clear) +- Phase isolation (promoted vs unpromoted clusters) +- Phantom resurrection / stuck queue guards +- Second reconcile is no-op (idempotency) +- Sentinel helper encapsulation +- workflow_injected_ids aggregation +""" from __future__ import annotations from desloppify.engine._plan.auto_cluster import auto_cluster_issues +from desloppify.engine._plan.constants import ( + WORKFLOW_COMMUNICATE_SCORE_ID, + WORKFLOW_CREATE_PLAN_ID, +) from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.sync import live_planned_queue_empty, reconcile_plan +from desloppify.engine._plan.sync.workflow import clear_score_communicated_sentinel from desloppify.engine._work_queue.snapshot import ( + PHASE_ASSESSMENT_POSTFLIGHT, PHASE_EXECUTE, PHASE_REVIEW_POSTFLIGHT, + PHASE_TRIAGE_POSTFLIGHT, + PHASE_WORKFLOW_POSTFLIGHT, + PHASE_SCAN, build_queue_snapshot, ) @@ -25,7 +43,13 @@ def _issue(issue_id: str, detector: str = "unused") -> dict: } +# --------------------------------------------------------------------------- +# Boundary detection +# --------------------------------------------------------------------------- + + def test_live_planned_queue_empty_uses_queue_order_only() -> None: + """Overrides/clusters in plan do NOT expand the live queue.""" plan = empty_plan() plan["clusters"] = { "manual/review": { @@ -44,7 +68,34 @@ def test_live_planned_queue_empty_uses_queue_order_only() -> None: assert live_planned_queue_empty(plan) is True +def test_live_planned_queue_not_empty_with_substantive_item() -> None: + plan = empty_plan() + plan["queue_order"] = ["unused::a"] + + assert live_planned_queue_empty(plan) is False + + +def test_live_planned_queue_empty_ignores_synthetic_items() -> None: + plan = empty_plan() + plan["queue_order"] = [ + "workflow::communicate-score", + "subjective::naming", + "triage::stage-1", + ] + + assert live_planned_queue_empty(plan) is True + + +def test_live_planned_queue_empty_ignores_skipped_items() -> None: + plan = empty_plan() + plan["queue_order"] = ["unused::a"] + plan["skipped"] = {"unused::a": {"reason": "manual"}} + + assert live_planned_queue_empty(plan) is True + + def test_reconcile_plan_noops_when_live_queue_not_empty() -> None: + """Mid-cycle: pipeline is a no-op, no gates fire.""" state = {"issues": {"unused::a": _issue("unused::a")}} plan = empty_plan() plan["queue_order"] = ["unused::a"] @@ -57,6 +108,32 @@ def test_reconcile_plan_noops_when_live_queue_not_empty() -> None: assert plan["queue_order"] == ["unused::a"] +def test_reconcile_plan_second_call_is_noop() -> None: + """Idempotency: calling reconcile_plan twice at the same boundary + produces no additional mutations.""" + state = {"issues": {}} + plan = empty_plan() + + reconcile_plan(plan, state, target_strict=95.0) + queue_after_first = list(plan.get("queue_order", [])) + log_after_first = list(plan.get("log", [])) + + result2 = reconcile_plan(plan, state, target_strict=95.0) + + assert plan.get("queue_order", []) == queue_after_first + # Log may have lifecycle entries but should not grow on second call + assert len(plan.get("log", [])) == len(log_after_first) + # Second result should show no new dirty changes beyond lifecycle + # (lifecycle is always computed but should match, so not changed) + assert result2.auto_cluster_changes == 0 + assert result2.workflow_injected_ids == [] + + +# --------------------------------------------------------------------------- +# Mid-cycle auto-clustering guard +# --------------------------------------------------------------------------- + + def test_auto_cluster_issues_is_noop_mid_cycle() -> None: state = { "issues": { @@ -74,7 +151,13 @@ def test_auto_cluster_issues_is_noop_mid_cycle() -> None: assert plan["clusters"] == {} +# --------------------------------------------------------------------------- +# Phase isolation: promoted vs unpromoted clusters +# --------------------------------------------------------------------------- + + def test_queue_snapshot_executes_review_items_promoted_into_active_cluster() -> None: + """Active cluster with items in queue_order → EXECUTE phase.""" state = { "issues": { "review::a": _issue("review::a", detector="review"), @@ -102,6 +185,7 @@ def test_queue_snapshot_executes_review_items_promoted_into_active_cluster() -> def test_queue_snapshot_keeps_unpromoted_review_cluster_in_postflight() -> None: + """Review cluster (execution_status: review) → postflight, not execute.""" state = { "issues": { "review::a": _issue("review::a", detector="review"), @@ -126,3 +210,322 @@ def test_queue_snapshot_keeps_unpromoted_review_cluster_in_postflight() -> None: assert live_planned_queue_empty(plan) is True assert snapshot.phase == PHASE_REVIEW_POSTFLIGHT assert [item["id"] for item in snapshot.execution_items] == ["review::a"] + + +def test_phase_isolation_mixed_objective_and_unpromoted_review() -> None: + """Objective work in queue + unpromoted review findings → only objective + items in execution, review stays postflight.""" + state = { + "issues": { + "unused::obj": _issue("unused::obj"), + "review::rev": _issue("review::rev", detector="review"), + } + } + plan = empty_plan() + plan["queue_order"] = ["unused::obj"] + plan["plan_start_scores"] = {"strict": 80.0} + plan["epic_triage_meta"] = { + "triaged_ids": ["review::rev"], + "issue_snapshot_hash": "stable", + } + plan["clusters"] = { + "manual/review": { + "name": "manual/review", + "issue_ids": ["review::rev"], + "execution_status": "review", + } + } + + snapshot = build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == PHASE_EXECUTE + execution_ids = [item["id"] for item in snapshot.execution_items] + assert "unused::obj" in execution_ids + assert "review::rev" not in execution_ids + + +def test_postflight_phase_stays_exclusive_when_new_execute_items_exist() -> None: + """Fresh execute work discovered during postflight stays backlog-only until postflight ends.""" + state = { + "issues": { + "unused::obj": _issue("unused::obj"), + }, + "dimension_scores": { + "Naming quality": { + "score": 70.0, + "strict": 70.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + }, + }, + "subjective_assessments": { + "naming_quality": {"score": 70.0, "needs_review_refresh": True}, + }, + } + plan = empty_plan() + plan["queue_order"] = [ + "unused::obj", + "workflow::communicate-score", + "triage::observe", + ] + plan["refresh_state"] = { + "postflight_scan_completed_at_scan_count": 5, + "lifecycle_phase": "review", + } + plan["plan_start_scores"] = {"strict": 70.0, "overall": 70.0} + + snapshot = build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == PHASE_ASSESSMENT_POSTFLIGHT + assert [item["id"] for item in snapshot.execution_items] == ["subjective::naming_quality"] + assert "unused::obj" in [item["id"] for item in snapshot.backlog_items] + + +def test_postflight_execute_items_reappear_after_postflight_drains() -> None: + """Once postflight items are done, queued execute work becomes live again.""" + state = { + "issues": { + "unused::obj": _issue("unused::obj"), + }, + } + plan = empty_plan() + plan["queue_order"] = ["unused::obj"] + plan["refresh_state"] = { + "postflight_scan_completed_at_scan_count": 5, + "lifecycle_phase": "workflow", + } + + snapshot = build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == PHASE_EXECUTE + assert [item["id"] for item in snapshot.execution_items] == ["unused::obj"] + + +def test_sticky_postflight_advances_through_remaining_subphases() -> None: + """Sticky postflight respects the fixed ordered sequence while active.""" + state = {"issues": {}} + + workflow_plan = empty_plan() + workflow_plan["queue_order"] = ["workflow::communicate-score", "triage::observe"] + workflow_plan["refresh_state"] = { + "postflight_scan_completed_at_scan_count": 5, + "lifecycle_phase": "workflow", + } + workflow_snapshot = build_queue_snapshot(state, plan=workflow_plan) + assert workflow_snapshot.phase == PHASE_WORKFLOW_POSTFLIGHT + + triage_plan = empty_plan() + triage_plan["queue_order"] = ["triage::observe"] + triage_plan["refresh_state"] = { + "postflight_scan_completed_at_scan_count": 5, + "lifecycle_phase": "triage", + } + triage_snapshot = build_queue_snapshot(state, plan=triage_plan) + assert triage_snapshot.phase == PHASE_TRIAGE_POSTFLIGHT + + +# --------------------------------------------------------------------------- +# Phantom resurrection guard +# --------------------------------------------------------------------------- + + +def test_phantom_resurrection_guard_overrides_not_in_queue() -> None: + """Items in overrides/clusters but NOT in queue_order must NOT be treated + as live queue work.""" + plan = empty_plan() + plan["queue_order"] = [] # explicitly empty + plan["overrides"] = { + "unused::ghost": { + "issue_id": "unused::ghost", + "cluster": "manual/ghost", + } + } + plan["clusters"] = { + "manual/ghost": { + "name": "manual/ghost", + "issue_ids": ["unused::ghost"], + "execution_status": "active", + } + } + + assert live_planned_queue_empty(plan) is True + + state = {"issues": {"unused::ghost": _issue("unused::ghost")}} + snapshot = build_queue_snapshot(state, plan=plan) + + # Phase should NOT be EXECUTE — queue is empty + assert snapshot.phase != PHASE_EXECUTE or not any( + item["id"] == "unused::ghost" for item in snapshot.execution_items + if not item.get("kind") == "cluster" + ) + + +# --------------------------------------------------------------------------- +# Stuck queue guard +# --------------------------------------------------------------------------- + + +def test_stuck_queue_guard_removed_item_stays_gone() -> None: + """Item removed from queue_order but still in overrides/clusters is NOT + resurrected into the live queue.""" + plan = empty_plan() + plan["queue_order"] = ["unused::kept"] + plan["overrides"] = { + "unused::removed": { + "issue_id": "unused::removed", + "cluster": "manual/old", + } + } + plan["clusters"] = { + "manual/old": { + "name": "manual/old", + "issue_ids": ["unused::removed"], + "execution_status": "active", + } + } + + assert live_planned_queue_empty(plan) is False + + state = { + "issues": { + "unused::kept": _issue("unused::kept"), + "unused::removed": _issue("unused::removed"), + } + } + snapshot = build_queue_snapshot(state, plan=plan) + + execution_ids = {item["id"] for item in snapshot.execution_items} + assert "unused::kept" in execution_ids + # The removed item should not reappear in execution + assert "unused::removed" not in execution_ids + + +# --------------------------------------------------------------------------- +# Sentinel helper +# --------------------------------------------------------------------------- + + +def test_clear_score_communicated_sentinel() -> None: + """Helper removes the sentinel key; missing key is a no-op.""" + plan = empty_plan() + plan["previous_plan_start_scores"] = {"strict": 80.0} + + clear_score_communicated_sentinel(plan) + assert "previous_plan_start_scores" not in plan + + # Second call is a no-op (no KeyError) + clear_score_communicated_sentinel(plan) + assert "previous_plan_start_scores" not in plan + + +def test_sentinel_blocks_communicate_score_reinjection() -> None: + """When the sentinel is set, communicate-score does not re-inject.""" + from desloppify.engine._plan.sync.workflow import sync_communicate_score_needed + + plan = empty_plan() + plan["previous_plan_start_scores"] = {"strict": 80.0} + state: dict = {"issues": {}} + + result = sync_communicate_score_needed(plan, state) + assert not result.changes + + # After clearing sentinel, gate may fire + clear_score_communicated_sentinel(plan) + assert "previous_plan_start_scores" not in plan + + +# --------------------------------------------------------------------------- +# workflow_injected_ids aggregation +# --------------------------------------------------------------------------- + + +def test_workflow_injected_ids_aggregates_both_gates() -> None: + from desloppify.engine._plan.constants import QueueSyncResult + from desloppify.engine._plan.sync.pipeline import ReconcileResult + + result = ReconcileResult( + communicate_score=QueueSyncResult( + injected=[WORKFLOW_COMMUNICATE_SCORE_ID], + ), + create_plan=QueueSyncResult( + injected=[WORKFLOW_CREATE_PLAN_ID], + ), + ) + + ids = result.workflow_injected_ids + assert WORKFLOW_COMMUNICATE_SCORE_ID in ids + assert WORKFLOW_CREATE_PLAN_ID in ids + assert len(ids) == 2 + + +def test_workflow_injected_ids_empty_when_no_gates_fire() -> None: + from desloppify.engine._plan.sync.pipeline import ReconcileResult + + result = ReconcileResult() + assert result.workflow_injected_ids == [] + + +# --------------------------------------------------------------------------- +# Lifecycle does not persist when phase unchanged +# --------------------------------------------------------------------------- + + +def test_lifecycle_does_not_persist_when_unchanged() -> None: + """If the resolved phase matches the current lifecycle_phase value, + lifecycle_phase_changed should be False.""" + state = {"issues": {}} + plan = empty_plan() + + # First call sets lifecycle + result1 = reconcile_plan(plan, state, target_strict=95.0) + assert result1.lifecycle_phase_changed is True + + # Second call at same boundary — phase unchanged + result2 = reconcile_plan(plan, state, target_strict=95.0) + assert result2.lifecycle_phase == result1.lifecycle_phase + assert result2.lifecycle_phase_changed is False + + +# --------------------------------------------------------------------------- +# Pipeline does not touch scan-specific state +# --------------------------------------------------------------------------- + + +def test_pipeline_does_not_seed_plan_start_scores() -> None: + """reconcile_plan never writes plan_start_scores — that's scan-specific.""" + state = {"issues": {}} + plan = empty_plan() + assert not plan.get("plan_start_scores") + + reconcile_plan(plan, state, target_strict=95.0) + + # Should still be empty/falsy — pipeline doesn't seed it + assert not plan.get("plan_start_scores") + + +def test_pipeline_does_not_mark_postflight_scan_complete() -> None: + """reconcile_plan never sets postflight_scan_completed_at_scan_count.""" + state = {"issues": {}} + plan = empty_plan() + + reconcile_plan(plan, state, target_strict=95.0) + + refresh = plan.get("refresh_state", {}) + assert "postflight_scan_completed_at_scan_count" not in refresh + + +# --------------------------------------------------------------------------- +# Fresh boundary behavior +# --------------------------------------------------------------------------- + + +def test_fresh_boundary_empty_state_resolves_scan_phase() -> None: + """Empty state + no plan_start_scores → fresh boundary → scan phase.""" + state = {"issues": {}} + plan = empty_plan() + + snapshot = build_queue_snapshot(state, plan=plan) + + assert snapshot.phase == PHASE_SCAN diff --git a/desloppify/tests/plan/test_refresh_lifecycle.py b/desloppify/tests/plan/test_refresh_lifecycle.py index a2a3575c..3be8d289 100644 --- a/desloppify/tests/plan/test_refresh_lifecycle.py +++ b/desloppify/tests/plan/test_refresh_lifecycle.py @@ -1,16 +1,15 @@ from __future__ import annotations from desloppify.engine._plan.refresh_lifecycle import ( + coarse_lifecycle_phase, clear_postflight_scan_completion, current_lifecycle_phase, LIFECYCLE_PHASE_EXECUTE, LIFECYCLE_PHASE_REVIEW, + LIFECYCLE_PHASE_REVIEW_POSTFLIGHT, LIFECYCLE_PHASE_SCAN, - LIFECYCLE_PHASE_TRIAGE, - LIFECYCLE_PHASE_WORKFLOW, mark_postflight_scan_completed, postflight_scan_pending, - sync_lifecycle_phase, ) from desloppify.engine._plan.schema import empty_plan @@ -104,68 +103,8 @@ def test_current_lifecycle_phase_falls_back_for_legacy_plans() -> None: assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_EXECUTE -def test_sync_lifecycle_phase_persists_explicit_phase_order() -> None: +def test_coarse_lifecycle_phase_maps_fine_phases() -> None: plan = empty_plan() + plan["refresh_state"] = {"lifecycle_phase": LIFECYCLE_PHASE_REVIEW_POSTFLIGHT} - phase, changed = sync_lifecycle_phase( - plan, - has_initial_reviews=True, - has_objective_backlog=False, - has_postflight_review=False, - has_postflight_workflow=False, - has_triage=False, - has_deferred=False, - ) - assert changed is True - assert phase == LIFECYCLE_PHASE_REVIEW - assert current_lifecycle_phase(plan) == LIFECYCLE_PHASE_REVIEW - - mark_postflight_scan_completed(plan, scan_count=5) - phase, changed = sync_lifecycle_phase( - plan, - has_initial_reviews=False, - has_objective_backlog=False, - has_postflight_review=False, - has_postflight_workflow=True, - has_triage=False, - has_deferred=False, - ) - assert changed is True - assert phase == LIFECYCLE_PHASE_WORKFLOW - - phase, changed = sync_lifecycle_phase( - plan, - has_initial_reviews=False, - has_objective_backlog=False, - has_postflight_review=False, - has_postflight_workflow=False, - has_triage=True, - has_deferred=False, - ) - assert changed is True - assert phase == LIFECYCLE_PHASE_TRIAGE - - phase, changed = sync_lifecycle_phase( - plan, - has_initial_reviews=False, - has_objective_backlog=True, - has_postflight_review=False, - has_postflight_workflow=False, - has_triage=False, - has_deferred=False, - ) - assert changed is True - assert phase == LIFECYCLE_PHASE_EXECUTE - - plan["refresh_state"].pop("postflight_scan_completed_at_scan_count", None) - phase, changed = sync_lifecycle_phase( - plan, - has_initial_reviews=False, - has_objective_backlog=False, - has_postflight_review=False, - has_postflight_workflow=False, - has_triage=False, - has_deferred=False, - ) - assert changed is True - assert phase == LIFECYCLE_PHASE_SCAN + assert coarse_lifecycle_phase(plan) == LIFECYCLE_PHASE_REVIEW diff --git a/desloppify/tests/review/context/test_context_holistic_accessors_direct.py b/desloppify/tests/review/context/test_context_holistic_accessors_direct.py index 2fd731f3..774de20f 100644 --- a/desloppify/tests/review/context/test_context_holistic_accessors_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_accessors_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._accessors import ( +from desloppify.intelligence.review.context_holistic.clusters.accessors import ( _get_detail, _get_signals, _safe_num, @@ -30,4 +30,3 @@ def test_safe_num_accepts_numeric_but_rejects_bool_and_other_types() -> None: assert _safe_num(2.5) == 2.5 assert _safe_num(True, default=9.0) == 9.0 assert _safe_num("3", default=1.5) == 1.5 - diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_complexity_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_complexity_direct.py index ee663af2..d509b8e3 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_complexity_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_complexity_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._clusters_complexity import ( +from desloppify.intelligence.review.context_holistic.clusters.complexity import ( _build_complexity_hotspots, ) @@ -62,4 +62,3 @@ def test_build_complexity_hotspots_limits_to_top_twenty() -> None: assert len(hotspots) == 20 assert hotspots[0]["file"] == "src/f29.py" assert hotspots[-1]["file"] == "src/f10.py" - diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_consistency_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_consistency_direct.py index f519c429..140c3f77 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_consistency_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_consistency_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._clusters_consistency import ( +from desloppify.intelligence.review.context_holistic.clusters.consistency import ( _build_duplicate_clusters, _build_naming_drift, ) @@ -46,4 +46,3 @@ def test_build_naming_drift_groups_by_directory_and_counts_outliers() -> None: assert drift[0]["minority_count"] == 2 assert "src/app/FooBar.py" in drift[0]["outliers"] assert drift[1]["directory"] == "src/lib/" - diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_dependency_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_dependency_direct.py index cb322d2a..567728ff 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_dependency_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_dependency_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._clusters_dependency import ( +from desloppify.intelligence.review.context_holistic.clusters.dependency import ( _build_boundary_violations, _build_dead_code, _build_deferred_import_density, diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_error_state_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_error_state_direct.py index c82b5e34..c0704253 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_error_state_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_error_state_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._clusters_error_state import ( +from desloppify.intelligence.review.context_holistic.clusters.error_state import ( _build_error_hotspots, _build_mutable_globals, ) diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_organization_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_organization_direct.py index b079512b..5f759f4c 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_organization_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_organization_direct.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.intelligence.review.context_holistic._clusters_organization import ( +from desloppify.intelligence.review.context_holistic.clusters.organization import ( _build_flat_dir_issues, _build_large_file_distribution, ) diff --git a/desloppify/tests/review/context/test_context_holistic_clusters_security_direct.py b/desloppify/tests/review/context/test_context_holistic_clusters_security_direct.py index e65bb100..de57443a 100644 --- a/desloppify/tests/review/context/test_context_holistic_clusters_security_direct.py +++ b/desloppify/tests/review/context/test_context_holistic_clusters_security_direct.py @@ -4,7 +4,7 @@ from collections import Counter -from desloppify.intelligence.review.context_holistic._clusters_security import ( +from desloppify.intelligence.review.context_holistic.clusters.security import ( _build_security_hotspots, _build_signal_density, _build_systemic_patterns, diff --git a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py index e80739c0..e8c65c9f 100644 --- a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py +++ b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py @@ -257,6 +257,75 @@ def test_legacy_force_visible_triage_stage_is_ignored_during_execute(): assert ids == ["smells::src/a.py::x"] +def test_postflight_synthetic_queue_keeps_objective_backlog_suppressed(): + """Synthetic-only postflight work must not reactivate implicit execute mode.""" + from desloppify.engine._plan.schema import empty_plan + + state = _state( + [ + _issue("smells::src/a.py::x", detector="smells", tier=3), + _issue("smells::src/b.py::x", detector="smells", tier=3), + ], + dimension_scores={ + "Naming quality": { + "score": 82.0, + "strict": 82.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + }, + "Design coherence": { + "score": 73.0, + "strict": 73.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "design_coherence"}, + }, + }, + }, + ) + state["subjective_assessments"] = { + "naming_quality": {"score": 82.0}, + "design_coherence": { + "score": 73.0, + "needs_review_refresh": True, + "stale_since": "2026-01-01T00:00:00+00:00", + }, + } + + plan = empty_plan() + plan["queue_order"] = ["workflow::communicate-score", "workflow::create-plan"] + plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 15} + + queue = build_work_queue( + state, count=None, include_subjective=True, plan=plan, + ) + ids = [item["id"] for item in queue["items"]] + assert all(fid.startswith("subjective::") for fid in ids) + + +def test_explicit_planned_issue_bypasses_standalone_threshold_filter(): + """Explicit queue_order items must still surface even when naturally filtered.""" + from desloppify.engine._plan.schema import empty_plan + + state = _state([ + _issue( + "facade::src/a.py", + detector="facade", + file="src/a.py", + tier=2, + confidence="medium", + ), + ]) + plan = empty_plan() + plan["queue_order"] = ["facade::src/a.py"] + + queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) + + assert [item["id"] for item in queue["items"]] == ["facade::src/a.py"] + + def test_triaged_review_findings_stay_postflight_while_objective_work_remains(): """Completed triage should not mix review findings into execute.""" from desloppify.engine._plan.schema import empty_plan @@ -294,8 +363,8 @@ def test_triaged_review_findings_stay_postflight_while_objective_work_remains(): assert ids == ["smells::src/a.py::x"] -def test_postflight_review_findings_stay_ahead_of_assessment_followup(): - """Concrete review findings should stay ahead of subjective follow-up work.""" +def test_postflight_assessment_precedes_review_findings(): + """Postflight subjective reruns gate later review execution work.""" from desloppify.engine._plan.schema import empty_plan state = _state( @@ -350,7 +419,9 @@ def test_postflight_review_findings_stay_ahead_of_assessment_followup(): ), ) ids = [item["id"] for item in queue["items"]] - assert ids == ["review::src/a.py::naming"] + # Subjective dimension item is suppressed when review issues cover the + # same dimension — the assessment request alone surfaces. + assert ids == ["subjective_review::naming_quality"] def test_execution_queue_excludes_unplanned_objective_items(): @@ -626,7 +697,7 @@ def test_triage_stages_hidden_during_initial_reviews(): def test_subjective_phase_precedes_score_and_triage_when_objective_drained(): - """Workflow items stay ahead of subjective reruns once postflight begins.""" + """Subjective reruns stay ahead of workflow and triage once postflight begins.""" state = _state( [], dimension_scores={ @@ -662,7 +733,7 @@ def test_subjective_phase_precedes_score_and_triage_when_objective_drained(): } queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) ids = [item["id"] for item in queue["items"]] - assert ids == ["workflow::communicate-score"] + assert ids == ["subjective::naming_quality"] def test_triage_stages_sort_after_workflow_in_natural_ranking(): diff --git a/desloppify/tests/review/work_queue_cases.py b/desloppify/tests/review/work_queue_cases.py index 41782cfd..af65a8e5 100644 --- a/desloppify/tests/review/work_queue_cases.py +++ b/desloppify/tests/review/work_queue_cases.py @@ -602,6 +602,48 @@ def test_stale_subjective_appear_when_no_objective_backlog(): assert "subjective::naming_quality" in ids +def test_under_target_subjective_appear_when_no_objective_backlog(): + """Current below-target dimensions surface alongside stale review work.""" + state = _state( + [], + dimension_scores={ + "Naming quality": { + "score": 70.0, + "strict": 70.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + }, + "Design coherence": { + "score": 68.0, + "strict": 68.0, + "failing": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "design_coherence"}, + }, + "stale": True, + }, + }, + ) + state["subjective_assessments"] = { + "naming_quality": { + "score": 70.0, + "needs_review_refresh": False, + }, + "design_coherence": { + "score": 68.0, + "needs_review_refresh": True, + "stale_since": "2026-01-01T00:00:00+00:00", + }, + } + + queue = build_work_queue(state, count=None, include_subjective=True) + ids = {item["id"] for item in queue["items"]} + + assert all(fid.startswith("subjective::") for fid in ids) + + def test_unassessed_subjective_visible_with_objective_backlog(): """When initial reviews exist, only they are shown — objective items hidden. diff --git a/desloppify/tests/state/test_state.py b/desloppify/tests/state/test_state.py index a6e322de..ad519e81 100644 --- a/desloppify/tests/state/test_state.py +++ b/desloppify/tests/state/test_state.py @@ -622,19 +622,31 @@ def test_mechanical_auto_resolved_still_reopened(self): class TestMissingIssuesResolved: """Issues present in state but absent from scan stay user-controlled.""" - def test_missing_issue_stays_open(self): - """An open issue that disappears from scan remains open until resolved.""" + def test_missing_issue_stays_open_when_file_exists(self, tmp_path): + """An open issue whose file still exists stays open until resolved.""" + (tmp_path / "a.py").write_text("# exists") st = empty_state() old = _make_raw_issue("det::a.py::fn", detector="det", file="a.py") old["lang"] = "python" st["issues"]["det::a.py::fn"] = old - # Merge an empty scan — the old issue stays open. - diff = merge_scan(st, [], MergeScanOptions(lang="python", force_resolve=True)) + diff = merge_scan(st, [], MergeScanOptions(lang="python", force_resolve=True, project_root=str(tmp_path))) assert diff["auto_resolved"] == 0 assert st["issues"]["det::a.py::fn"]["status"] == "open" assert st["issues"]["det::a.py::fn"]["resolved_at"] is None + def test_missing_issue_auto_resolved_when_file_deleted(self, tmp_path): + """An open issue for a deleted file is auto-resolved on rescan.""" + st = empty_state() + old = _make_raw_issue("det::a.py::fn", detector="det", file="a.py") + old["lang"] = "python" + st["issues"]["det::a.py::fn"] = old + + diff = merge_scan(st, [], MergeScanOptions(lang="python", force_resolve=True, project_root=str(tmp_path))) + assert diff["auto_resolved"] == 1 + assert st["issues"]["det::a.py::fn"]["status"] == "auto_resolved" + assert "no longer exists" in st["issues"]["det::a.py::fn"]["note"] + def test_missing_fixed_issue_gets_scan_verified(self): """A manually fixed issue stays fixed and gains scan corroboration.""" st = empty_state() diff --git a/docs/DEVELOPMENT_PHILOSOPHY.md b/docs/DEVELOPMENT_PHILOSOPHY.md index 6f466506..b4dca4f1 100644 --- a/docs/DEVELOPMENT_PHILOSOPHY.md +++ b/docs/DEVELOPMENT_PHILOSOPHY.md @@ -32,7 +32,7 @@ This is the thing we care about most. If an agent can game the score to 100 with ## Language-agnostic -The scoring model and the core engine don't know about any specific language. Language-specific stuff lives in plugins. The principles and scoring intent stay the same whether you're scanning TypeScript, Python, or Rust. Currently 28 languages, and the plugin framework makes adding more straightforward. +The scoring model and the core engine don't know about any specific language. Language-specific stuff lives in plugins. The principles and scoring intent stay the same whether you're scanning TypeScript, Python, or Rust. Currently 29 languages, and the plugin framework makes adding more straightforward. ## Architectural boundaries diff --git a/docs/SKILL.md b/docs/SKILL.md index 1d07dd1d..704fe88f 100644 --- a/docs/SKILL.md +++ b/docs/SKILL.md @@ -5,7 +5,7 @@ description: > about code quality, technical debt, dead code, large files, god classes, duplicate functions, code smells, naming issues, import cycles, or coupling problems. Also use when asked for a health score, what to fix next, or to - create a cleanup plan. Supports 28 languages. + create a cleanup plan. Supports 29 languages. allowed-tools: Bash(desloppify *) --- diff --git a/website/index.html b/website/index.html index f9602a3a..3be29121 100644 --- a/website/index.html +++ b/website/index.html @@ -33,7 +33,7 @@ <h1>desloppify</h1> <p class="subtitle"> Give your AI coding agent a north star. Desloppify scans, scores, and systematically improves code quality — mechanical issues and subjective ones — - across 28 languages. The score resists gaming. The only way up is to actually + across 29 languages. The score resists gaming. The only way up is to actually make the code better. </p> <div class="hero-actions"> @@ -43,7 +43,7 @@ <h1>desloppify</h1> <div class="hero-badges"> <img src="https://img.shields.io/pypi/v/desloppify" alt="PyPI version"> <img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+"> - <img src="https://img.shields.io/badge/languages-28-green" alt="28 languages"> + <img src="https://img.shields.io/badge/languages-29-green" alt="29 languages"> </div> </div> <canvas id="hero-canvas" aria-hidden="true"></canvas> From a9cf466b02e717b226c16a46f79258c41a868fd6 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 16:41:43 +0100 Subject: [PATCH 07/15] feat: accept substantive work-product descriptions in triage attestations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attestation validation for organize/enrich/sense-check stages no longer requires literal cluster name references — detailed descriptions of the verified work are now accepted as an alternative. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- .../plan/triage/confirmations/basic.py | 35 ++++++++++++++++++- .../stage_prompts_instruction_blocks.py | 4 +-- .../triage/runner/stage_prompts_validation.py | 2 +- .../commands/plan/test_triage_attestation.py | 27 ++++++++++++++ .../plan/test_triage_confirmations_direct.py | 13 +++++++ 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/desloppify/app/commands/plan/triage/confirmations/basic.py b/desloppify/app/commands/plan/triage/confirmations/basic.py index 43733358..9c8fe77b 100644 --- a/desloppify/app/commands/plan/triage/confirmations/basic.py +++ b/desloppify/app/commands/plan/triage/confirmations/basic.py @@ -31,6 +31,14 @@ def _find_referenced_names(text: str, names: list[str] | None) -> list[str]: ] +def _contains_any(text: str, phrases: tuple[str, ...]) -> bool: + return any(phrase in text for phrase in phrases) + + +def _count_phrase_hits(text: str, phrases: tuple[str, ...]) -> int: + return sum(1 for phrase in phrases if phrase in text) + + def _validate_observe_attestation(text: str, dimensions: list[str] | None) -> str | None: found = _find_referenced_names(text, dimensions) if found or not dimensions: @@ -60,12 +68,34 @@ def _validate_cluster_attestation( *, cluster_names: list[str] | None, action: str, + stage: str, ) -> str | None: found = _find_referenced_names(text, cluster_names) if found or not cluster_names: return None + if stage == "organize": + if _contains_any(text, ("cluster", "clusters")) and _count_phrase_hits( + text, + ("priority", "priorities", "action step", "action steps", "description", "descriptions", "depends-on", "dependency", "dependencies", "issue", "issues", "consolidat"), + ) >= 2: + return None + elif stage == "enrich": + if _contains_any(text, ("step", "steps", "cluster", "clusters")) and _count_phrase_hits( + text, + ("executor-ready", "detail", "details", "file path", "file paths", "issue ref", "issue refs", "effort"), + ) >= 2: + return None + elif stage == "sense-check": + if _count_phrase_hits( + text, + ("content", "structure", "value", "cross-cluster", "dependency", "dependencies", "decision ledger", "enrich-level", "factually accurate"), + ) >= 2 and _contains_any(text, ("verified", "safe", "pass", "passes", "recorded", "checked")): + return None names = ", ".join(cluster_names[:6]) - return f"Attestation must reference at least one cluster you {action}. Mention one of: {names}" + return ( + f"Attestation must reference at least one cluster you {action}, or clearly describe the " + f"verified {stage} work product. Mention one of: {names}" + ) def validate_attestation( @@ -88,16 +118,19 @@ def validate_attestation( text, cluster_names=cluster_names, action="organized", + stage="organize", ), "enrich": lambda: _validate_cluster_attestation( text, cluster_names=cluster_names, action="enriched", + stage="enrich", ), "sense-check": lambda: _validate_cluster_attestation( text, cluster_names=cluster_names, action="sense-checked", + stage="sense-check", ), } validator = validators.get(stage) diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py index f37d90b6..0abc9479 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_instruction_blocks.py @@ -226,7 +226,7 @@ def _organize_instructions(mode: PromptMode = "self_record") -> str: tail = """\ When done, run: ``` -desloppify plan triage --stage organize --report "<summary of priorities and organization>" --attestation "<80+ chars mentioning cluster names>" +desloppify plan triage --stage organize --report "<summary of priorities and organization>" --attestation "<80+ chars mentioning cluster names or the organized work>" ``` """ if mode == "output_only": @@ -300,7 +300,7 @@ def _enrich_instructions(mode: PromptMode = "self_record") -> str: tail = """\ When done, run: ``` -desloppify plan triage --stage enrich --report "<enrichment summary>" --attestation "<80+ chars mentioning cluster names>" +desloppify plan triage --stage enrich --report "<enrichment summary>" --attestation "<80+ chars mentioning cluster names or the executor-ready work>" ``` """ if mode == "output_only": diff --git a/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py b/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py index 194d8af9..cf6f40f9 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py +++ b/desloppify/app/commands/plan/triage/runner/stage_prompts_validation.py @@ -53,7 +53,7 @@ def _validation_requirements(stage: str) -> str: "- Report must include a `## Decision Ledger` with one line per live queue target\n" "- Every live queue target must appear exactly once as keep, tighten, or skip\n" "- Report must cite real file paths to prove the code was re-read\n" - "- Stage must be confirmed with an 80+ char attestation mentioning cluster names\n" + "- Stage must be confirmed with an 80+ char attestation mentioning cluster names or clearly describing the verified sense-check work\n" ) return "" diff --git a/desloppify/tests/commands/plan/test_triage_attestation.py b/desloppify/tests/commands/plan/test_triage_attestation.py index 3afa5322..2fa2f99f 100644 --- a/desloppify/tests/commands/plan/test_triage_attestation.py +++ b/desloppify/tests/commands/plan/test_triage_attestation.py @@ -191,6 +191,33 @@ def test_validate_organize_accepts_cluster(self): ) assert err is None + def test_validate_organize_accepts_substantive_work_product_without_cluster_name(self): + """Organize can pass without an exact cluster name when the attestation describes the organized work.""" + err = validate_attestation( + "I organized all review issues into clusters with clear priority ordering, action steps, and dependency decisions grounded in the code.", + "organize", + cluster_names=["fix-naming", "reduce-coupling"], + ) + assert err is None + + def test_validate_enrich_accepts_substantive_work_product_without_cluster_name(self): + """Enrich can pass without an exact cluster name when executor-ready details are described.""" + err = validate_attestation( + "The planned steps are executor-ready with concrete file paths, issue refs, detailed instructions, and effort tags verified against the codebase.", + "enrich", + cluster_names=["fix-naming", "reduce-coupling"], + ) + assert err is None + + def test_validate_sense_check_accepts_substantive_work_product_without_cluster_name(self): + """Sense-check can pass without an exact cluster name when the verification work is explicit.""" + err = validate_attestation( + "I verified content and structure, checked cross-cluster dependencies, and confirmed value decisions are safe and accurately recorded.", + "sense-check", + cluster_names=["fix-naming", "reduce-coupling"], + ) + assert err is None + def test_validate_no_data_passes(self): """When no dimensions/clusters provided, validation passes (nothing to check).""" err = validate_attestation( diff --git a/desloppify/tests/commands/plan/test_triage_confirmations_direct.py b/desloppify/tests/commands/plan/test_triage_confirmations_direct.py index c5acc778..5ce2f101 100644 --- a/desloppify/tests/commands/plan/test_triage_confirmations_direct.py +++ b/desloppify/tests/commands/plan/test_triage_confirmations_direct.py @@ -27,3 +27,16 @@ def test_validate_attestation_reflect_accepts_dimension_or_cluster_reference() - cluster_names=["cluster-core"], ) assert error is None + + +def test_validate_attestation_enrich_accepts_executor_ready_work_product() -> None: + error = confirmations_mod.validate_attestation( + ( + "The planned steps are executor-ready with concrete file paths, " + "issue refs, detailed instructions, and effort tags verified " + "against the codebase." + ), + "enrich", + cluster_names=["cluster-core"], + ) + assert error is None From 9dd5a4308854aaae70dac642154135bfbb0914df Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 18:11:58 +0100 Subject: [PATCH 08/15] feat: reorganize cluster/override into subpackages, triage validation improvements, review batch enhancements Move cluster_ops/update modules into cluster/ subpackage and override modules into override/ subpackage. Enhance triage completion policy, stage validation, and review batch execution phases. Add dynamic loaders, scan preflight checks, and expanded test coverage. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- .github/workflows/scripts/tweet_release.py | 202 +++++++----- assets/scorecard.png | Bin 92046 -> 90863 bytes .../app/commands/helpers/dynamic_loaders.py | 52 +++ .../app/commands/helpers/queue_progress.py | 6 +- .../app/commands/helpers/state_persistence.py | 4 +- desloppify/app/commands/move/language.py | 34 +- .../app/commands/plan/cluster/dispatch.py | 18 +- .../ops_display.py} | 2 +- .../ops_manage.py} | 0 .../ops_reorder.py} | 0 .../{cluster_steps.py => cluster/steps.py} | 0 .../{cluster_update.py => cluster/update.py} | 2 +- .../update_flow.py} | 2 +- .../app/commands/plan/override/__init__.py | 6 +- .../plan/{override_io.py => override/io.py} | 0 .../{override_misc.py => override/misc.py} | 2 +- .../resolve_cmd.py} | 4 +- .../resolve_helpers.py} | 0 .../resolve_workflow.py} | 38 ++- .../{override_skip.py => override/skip.py} | 2 +- .../plan/shared/cluster_membership.py | 34 +- .../commands/plan/triage/plan_state_access.py | 28 +- .../runner/orchestrator_codex_pipeline.py | 8 + .../orchestrator_codex_pipeline_execution.py | 1 + .../plan/triage/runner/stage_validation.py | 97 ++---- .../commands/plan/triage/stages/completion.py | 12 +- .../commands/plan/triage/stages/records.py | 6 + .../plan/triage/stages/sense_check.py | 8 + .../triage/validation/completion_policy.py | 111 ++++++- .../app/commands/resolve/living_plan.py | 11 + .../app/commands/review/batch/execution.py | 53 ++- .../commands/review/batch/execution_phases.py | 301 +++++++++--------- .../review/batch/execution_results.py | 17 +- .../app/commands/review/batch/orchestrator.py | 38 ++- .../app/commands/review/importing/cmd.py | 5 +- .../app/commands/review/importing/output.py | 3 +- .../commands/review/importing/plan_sync.py | 155 ++++++--- .../review/runner_parallel/__init__.py | 11 +- .../app/commands/review/state_payloads.py | 17 +- desloppify/app/commands/scan/artifacts.py | 9 +- desloppify/app/commands/scan/preflight.py | 24 ++ desloppify/app/commands/scan/workflow.py | 2 +- desloppify/engine/_plan/cluster_membership.py | 37 +++ desloppify/engine/_plan/operations/cluster.py | 16 + desloppify/engine/_plan/refresh_lifecycle.py | 36 +++ desloppify/engine/_plan/schema/__init__.py | 2 + desloppify/engine/_plan/sync/pipeline.py | 9 +- desloppify/engine/_plan/sync/workflow.py | 39 ++- desloppify/engine/_plan/triage/prompt.py | 3 + desloppify/engine/_plan/triage/snapshot.py | 34 +- desloppify/engine/_scoring/subjective/core.py | 16 +- desloppify/engine/_state/merge.py | 50 ++- desloppify/engine/_work_queue/plan_order.py | 18 +- desloppify/engine/_work_queue/snapshot.py | 35 +- desloppify/engine/_work_queue/synthetic.py | 45 ++- desloppify/engine/_work_queue/types.py | 6 +- desloppify/engine/hook_registry.py | 51 +-- desloppify/engine/plan_state.py | 2 + desloppify/intelligence/review/context.py | 31 +- .../intelligence/review/context_builder.py | 75 +++-- .../review/context_signals/auth.py | 48 ++- .../intelligence/review/importing/payload.py | 10 +- .../prepare_batches_collectors_structure.py | 7 + .../_framework/generic_support/core.py | 2 +- .../languages/_framework/registry/__init__.py | 2 + .../_framework/registry/registration.py | 4 +- .../languages/_framework/registry/state.py | 11 + desloppify/languages/csharp/__init__.py | 2 +- desloppify/languages/cxx/__init__.py | 2 +- desloppify/languages/dart/__init__.py | 2 +- desloppify/languages/gdscript/__init__.py | 2 +- desloppify/languages/go/__init__.py | 2 +- desloppify/languages/python/__init__.py | 2 +- desloppify/languages/rust/__init__.py | 2 +- desloppify/languages/rust/phases.py | 4 +- desloppify/languages/rust/phases_smells.py | 2 +- desloppify/languages/typescript/__init__.py | 2 +- .../detectors/smells/helpers_blocks.py | 100 ------ .../detectors/smells/helpers_line_state.py | 108 ------- .../tests/commands/plan/test_cluster_guard.py | 2 +- .../commands/plan/test_cluster_ops_direct.py | 12 +- .../tests/commands/plan/test_cluster_ux.py | 2 +- .../plan/test_plan_override_transactions.py | 4 +- .../plan/test_plan_overrides_direct.py | 83 ++++- .../commands/plan/test_triage_auto_start.py | 54 ++++ .../plan/test_triage_dependency_guard.py | 9 +- .../test_triage_plan_state_access_direct.py | 16 + .../tests/commands/plan/test_triage_runner.py | 41 +++ .../plan/test_triage_split_modules_direct.py | 33 ++ .../test_triage_stage_prompts_flow_direct.py | 2 +- .../plan/test_triage_tooling_fixes.py | 2 +- .../commands/plan/test_workflow_gates.py | 6 +- .../commands/resolve/test_cmd_resolve.py | 14 +- .../resolve/test_living_plan_direct.py | 80 +++++ ...t_review_batch_execution_helpers_direct.py | 13 +- ...st_review_batch_execution_phases_direct.py | 6 +- .../test_review_importing_support_direct.py | 66 +++- .../test_review_runner_helpers_direct.py | 21 +- .../commands/scan/test_scan_preflight.py | 34 ++ desloppify/tests/commands/test_cmd_move.py | 4 +- .../commands/test_direct_coverage_modules.py | 15 +- .../commands/test_lifecycle_transitions.py | 16 +- desloppify/tests/core/test_hook_registry.py | 6 +- .../test_planning_public_contract_direct.py | 2 +- ...test_review_import_prepare_split_direct.py | 25 ++ desloppify/tests/plan/test_auto_cluster.py | 20 ++ .../tests/plan/test_reconcile_pipeline.py | 47 +++ .../review/batch/test_split_modules_direct.py | 12 +- .../context/test_context_builder_direct.py | 67 ++-- .../context/test_mechanical_evidence.py | 30 ++ .../test_review_context_signals_direct.py | 11 + .../review/review_commands_runner_cases.py | 118 ++++++- .../test_work_queue_plan_order_and_triage.py | 79 +++++ .../workflows/test_tweet_release_script.py | 217 +++++++++++++ 114 files changed, 2309 insertions(+), 1004 deletions(-) create mode 100644 desloppify/app/commands/helpers/dynamic_loaders.py rename desloppify/app/commands/plan/{cluster_ops_display.py => cluster/ops_display.py} (99%) rename desloppify/app/commands/plan/{cluster_ops_manage.py => cluster/ops_manage.py} (100%) rename desloppify/app/commands/plan/{cluster_ops_reorder.py => cluster/ops_reorder.py} (100%) rename desloppify/app/commands/plan/{cluster_steps.py => cluster/steps.py} (100%) rename desloppify/app/commands/plan/{cluster_update.py => cluster/update.py} (97%) rename desloppify/app/commands/plan/{cluster_update_flow.py => cluster/update_flow.py} (99%) rename desloppify/app/commands/plan/{override_io.py => override/io.py} (100%) rename desloppify/app/commands/plan/{override_misc.py => override/misc.py} (99%) rename desloppify/app/commands/plan/{override_resolve_cmd.py => override/resolve_cmd.py} (97%) rename desloppify/app/commands/plan/{override_resolve_helpers.py => override/resolve_helpers.py} (100%) rename desloppify/app/commands/plan/{override_resolve_workflow.py => override/resolve_workflow.py} (89%) rename desloppify/app/commands/plan/{override_skip.py => override/skip.py} (99%) create mode 100644 desloppify/engine/_plan/cluster_membership.py delete mode 100644 desloppify/languages/typescript/detectors/smells/helpers_blocks.py delete mode 100644 desloppify/languages/typescript/detectors/smells/helpers_line_state.py create mode 100644 desloppify/tests/workflows/test_tweet_release_script.py diff --git a/.github/workflows/scripts/tweet_release.py b/.github/workflows/scripts/tweet_release.py index 98a4187d..73d097a0 100644 --- a/.github/workflows/scripts/tweet_release.py +++ b/.github/workflows/scripts/tweet_release.py @@ -21,6 +21,12 @@ import requests import tweepy +REQUEST_TIMEOUT_SECONDS = 30 + + +class ReleaseTweetError(RuntimeError): + """Stage-specific failure surfaced by the release tweet workflow.""" + # ── Extract section headers from release markdown ──────────────────────────── @@ -37,17 +43,16 @@ def extract_headers(body: str) -> list[str]: def generate_tweet_and_prompt(tag: str, headers: list[str], url: str) -> dict: """Ask Claude to produce a tweet and an image-gen prompt.""" - client = anthropic.Anthropic() - headers_text = "\n".join(f"- {h}" for h in headers) - - msg = client.messages.create( - model="claude-sonnet-4-20250514", - max_tokens=1024, - messages=[ - { - "role": "user", - "content": f"""You're writing a tweet and an image prompt for a software release announcement. + try: + client = anthropic.Anthropic() + msg = client.messages.create( + model="claude-sonnet-4-20250514", + max_tokens=1024, + messages=[ + { + "role": "user", + "content": f"""You're writing a tweet and an image prompt for a software release announcement. Project: desloppify — a CLI tool that tracks codebase health and technical debt. Release: {tag} @@ -74,15 +79,26 @@ def generate_tweet_and_prompt(tag: str, headers: list[str], url: str) -> dict: The overall vibe should be "someone explaining the release on a whiteboard with too much enthusiasm". Return ONLY valid JSON, no markdown fences.""", - } - ], - ) - - text = msg.content[0].text + } + ], + ) + except Exception as exc: + raise ReleaseTweetError(f"Anthropic request failed: {exc}") from exc + + try: + text = msg.content[0].text + except (AttributeError, IndexError, KeyError, TypeError) as exc: + raise ReleaseTweetError("Anthropic response did not include text content") from exc # Strip markdown fences if Claude adds them anyway text = re.sub(r"^```json\s*", "", text.strip()) text = re.sub(r"\s*```$", "", text.strip()) - return json.loads(text) + try: + result = json.loads(text) + except (TypeError, ValueError) as exc: + raise ReleaseTweetError("Anthropic returned invalid JSON payload") from exc + if not isinstance(result, dict): + raise ReleaseTweetError("Anthropic returned a non-object JSON payload") + return result # ── Generate image via fal.ai Nano Banana 2 ────────────────────────────────── @@ -92,37 +108,56 @@ def generate_tweet_and_prompt(tag: str, headers: list[str], url: str) -> dict: def generate_image(prompt: str, api_key: str) -> str: """Call fal.ai and return the image URL.""" - resp = requests.post( - FAL_ENDPOINT, - headers={ - "Authorization": f"Key {api_key}", - "Content-Type": "application/json", - }, - json={ - "prompt": prompt, - "num_images": 1, - "aspect_ratio": "1:1", - "resolution": "1K", - "output_format": "png", - }, - ) + try: + resp = requests.post( + FAL_ENDPOINT, + headers={ + "Authorization": f"Key {api_key}", + "Content-Type": "application/json", + }, + json={ + "prompt": prompt, + "num_images": 1, + "aspect_ratio": "1:1", + "resolution": "1K", + "output_format": "png", + }, + timeout=REQUEST_TIMEOUT_SECONDS, + ) + except requests.RequestException as exc: + raise ReleaseTweetError(f"fal.ai request failed: {exc}") from exc if not resp.ok: - raise RuntimeError(f"fal.ai error {resp.status_code}: {resp.text}") + raise ReleaseTweetError(f"fal.ai error {resp.status_code}: {resp.text}") - images = resp.json().get("images", []) + try: + images = resp.json().get("images", []) + except (ValueError, AttributeError) as exc: + raise ReleaseTweetError("fal.ai returned invalid JSON payload") from exc if not images: - raise RuntimeError("fal.ai returned no images") - return images[0]["url"] + raise ReleaseTweetError("fal.ai returned no images") + image_url = images[0].get("url") if isinstance(images[0], dict) else None + if not isinstance(image_url, str) or not image_url: + raise ReleaseTweetError("fal.ai returned an image without a URL") + return image_url def download_image(url: str) -> str: """Download image to a temp file and return the path.""" - resp = requests.get(url, stream=True) - resp.raise_for_status() + try: + resp = requests.get(url, stream=True, timeout=REQUEST_TIMEOUT_SECONDS) + resp.raise_for_status() + except requests.RequestException as exc: + raise ReleaseTweetError(f"image download failed: {exc}") from exc tmp = tempfile.NamedTemporaryFile(suffix=".png", delete=False) - for chunk in resp.iter_content(8192): - tmp.write(chunk) - tmp.close() + try: + for chunk in resp.iter_content(8192): + if chunk: + tmp.write(chunk) + except requests.RequestException as exc: + os.unlink(tmp.name) + raise ReleaseTweetError(f"image download failed while streaming: {exc}") from exc + finally: + tmp.close() return tmp.name @@ -140,7 +175,10 @@ def post_tweet_with_reply(tweet_text: str, image_path: str, reply_text: str): api_v1 = tweepy.API(auth) # Upload image - media = api_v1.media_upload(image_path) + try: + media = api_v1.media_upload(image_path) + except Exception as exc: + raise ReleaseTweetError(f"Twitter media upload failed: {exc}") from exc print(f"Uploaded media: {media.media_id}") # v2 client for tweeting @@ -159,12 +197,14 @@ def post_tweet_with_reply(tweet_text: str, image_path: str, reply_text: str): media_ids=[media.media_id], ) break - except tweepy.errors.TwitterServerError: + except tweepy.errors.TwitterServerError as exc: if attempt < 2: print(f" Twitter 5xx error, retrying in {5 * (attempt + 1)}s...") time.sleep(5 * (attempt + 1)) else: - raise + raise ReleaseTweetError("Twitter create_tweet failed after retries") from exc + except Exception as exc: + raise ReleaseTweetError(f"Twitter create_tweet failed: {exc}") from exc tweet_id = response.data["id"] print(f"Posted tweet: https://twitter.com/i/web/status/{tweet_id}") @@ -177,12 +217,14 @@ def post_tweet_with_reply(tweet_text: str, image_path: str, reply_text: str): in_reply_to_tweet_id=tweet_id, ) break - except tweepy.errors.TwitterServerError: + except tweepy.errors.TwitterServerError as exc: if attempt < 2: print(f" Twitter 5xx error, retrying in {5 * (attempt + 1)}s...") time.sleep(5 * (attempt + 1)) else: - raise + raise ReleaseTweetError("Twitter reply failed after retries") from exc + except Exception as exc: + raise ReleaseTweetError(f"Twitter reply failed: {exc}") from exc reply_id = reply.data["id"] print(f"Posted reply: https://twitter.com/i/web/status/{reply_id}") @@ -203,40 +245,46 @@ def main(): print(f"Release: {tag}") print(f"Headers: {headers}") - # Step 1: Generate tweet text + image prompt via Claude - print("\nGenerating tweet and image prompt...") - result = generate_tweet_and_prompt(tag, headers, url) - tweet_text = result["tweet"] - image_prompt = result["image_prompt"] - - print(f"\nTweet: {tweet_text}") - print(f"\nImage prompt: {image_prompt[:200]}...") - - # Step 2: Generate image via fal.ai - print("\nGenerating image...") - fal_key = os.environ["FAL_KEY"] - image_url = generate_image(image_prompt, fal_key) - print(f"Image URL: {image_url}") - - image_path = download_image(image_url) - print(f"Downloaded to: {image_path}") - - # Step 3: Post main tweet with image, reply with release link - if len(tweet_text) > 280: - lines = tweet_text.strip().splitlines() - while len(chr(10).join(lines)) > 280 and len(lines) > 1: - lines.pop() - tweet_text = chr(10).join(lines) - - reply_text = f"Release notes: {url}" - - print(f"\nPosting tweet ({len(tweet_text)} chars):") - print(tweet_text) - print(f"\nReply: {reply_text}") - post_tweet_with_reply(tweet_text, image_path, reply_text) + image_path: str | None = None + try: + # Step 1: Generate tweet text + image prompt via Claude + print("\nGenerating tweet and image prompt...") + result = generate_tweet_and_prompt(tag, headers, url) + tweet_text = result["tweet"] + image_prompt = result["image_prompt"] + + print(f"\nTweet: {tweet_text}") + print(f"\nImage prompt: {image_prompt[:200]}...") + + # Step 2: Generate image via fal.ai + print("\nGenerating image...") + fal_key = os.environ["FAL_KEY"] + image_url = generate_image(image_prompt, fal_key) + print(f"Image URL: {image_url}") + + image_path = download_image(image_url) + print(f"Downloaded to: {image_path}") + + # Step 3: Post main tweet with image, reply with release link + if len(tweet_text) > 280: + lines = tweet_text.strip().splitlines() + while len(chr(10).join(lines)) > 280 and len(lines) > 1: + lines.pop() + tweet_text = chr(10).join(lines) + + reply_text = f"Release notes: {url}" + + print(f"\nPosting tweet ({len(tweet_text)} chars):") + print(tweet_text) + print(f"\nReply: {reply_text}") + post_tweet_with_reply(tweet_text, image_path, reply_text) + except ReleaseTweetError as exc: + print(f"Release tweet failed: {exc}", file=sys.stderr) + sys.exit(1) + finally: + if image_path and os.path.exists(image_path): + os.unlink(image_path) - # Cleanup - os.unlink(image_path) print("\nDone!") diff --git a/assets/scorecard.png b/assets/scorecard.png index 1b303b9255b1bbbd873e665c88aad61addce73bc..326ecf0a795c36b72b71e664ff9485caf09d228b 100644 GIT binary patch literal 90863 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 ZlW9U$q7%c=#{V2rLPQo^BJ}y&{{z76SUUg! literal 92046 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 diff --git a/desloppify/app/commands/helpers/dynamic_loaders.py b/desloppify/app/commands/helpers/dynamic_loaders.py new file mode 100644 index 00000000..ed9001f2 --- /dev/null +++ b/desloppify/app/commands/helpers/dynamic_loaders.py @@ -0,0 +1,52 @@ +"""Approved dynamic loader seams for app-layer command modules.""" + +from __future__ import annotations + +import importlib +import logging +from types import ModuleType + +from desloppify.base.exception_sets import CommandError + +logger = logging.getLogger(__name__) + + +def load_score_update_module() -> ModuleType: + """Load the queue/score update helper on demand.""" + return importlib.import_module("desloppify.app.commands.helpers.score_update") + + +def load_optional_scorecard_module() -> ModuleType | None: + """Load the optional scorecard module when PIL-backed output is available.""" + try: + return importlib.import_module("desloppify.app.output.scorecard") + except ImportError: + return None + + +def load_language_move_module(lang_name: str) -> ModuleType: + """Load a language move module, falling back to the shared scaffold.""" + module_name = f"desloppify.languages.{lang_name}.move" + try: + return importlib.import_module(module_name) + except ImportError as exc: + if exc.name != module_name: + raise CommandError( + f"Failed to import language move module {module_name}: {exc}" + ) from exc + logger.debug("Language-specific move module missing: %s", module_name) + + scaffold_module = "desloppify.languages._framework.scaffold_move" + try: + return importlib.import_module(scaffold_module) + except ImportError as exc: + raise CommandError( + f"Move not yet supported for language: {lang_name} ({exc})" + ) from exc + + +__all__ = [ + "load_language_move_module", + "load_optional_scorecard_module", + "load_score_update_module", +] diff --git a/desloppify/app/commands/helpers/queue_progress.py b/desloppify/app/commands/helpers/queue_progress.py index ebcd478b..cfed4511 100644 --- a/desloppify/app/commands/helpers/queue_progress.py +++ b/desloppify/app/commands/helpers/queue_progress.py @@ -3,12 +3,12 @@ from __future__ import annotations import enum -import importlib import logging from dataclasses import dataclass from typing import TYPE_CHECKING from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS +from desloppify.app.commands.helpers.dynamic_loaders import load_score_update_module from desloppify.base.output.terminal import colorize from desloppify.engine._plan.refresh_lifecycle import ( COARSE_PHASE_MAP, @@ -344,9 +344,7 @@ def print_execution_or_reveal( return # LIVE or PHASE_TRANSITION: show current scores - score_update_mod = importlib.import_module( - "desloppify.app.commands.helpers.score_update" - ) + score_update_mod = load_score_update_module() score_update_mod.print_score_update(state, prev) if mode is ScoreDisplayMode.PHASE_TRANSITION: diff --git a/desloppify/app/commands/helpers/state_persistence.py b/desloppify/app/commands/helpers/state_persistence.py index 59588e8f..2b9bd270 100644 --- a/desloppify/app/commands/helpers/state_persistence.py +++ b/desloppify/app/commands/helpers/state_persistence.py @@ -4,15 +4,15 @@ from pathlib import Path -from desloppify import state_compat as state_compat from desloppify.base import config as config_mod from desloppify.base.exception_sets import CommandError +from desloppify.engine._state.persistence import save_state def save_state_or_exit(state: dict, state_file: Path | None) -> None: """Persist state with a consistent CLI error boundary.""" try: - state_compat.save_state(state, state_file) + save_state(state, state_file) except OSError as exc: raise CommandError(f"could not save state: {exc}") from exc diff --git a/desloppify/app/commands/move/language.py b/desloppify/app/commands/move/language.py index 64624dfc..2f4fe44a 100644 --- a/desloppify/app/commands/move/language.py +++ b/desloppify/app/commands/move/language.py @@ -2,20 +2,15 @@ from __future__ import annotations -import importlib -import logging from functools import lru_cache from pathlib import Path from types import ModuleType -from desloppify.languages import framework as lang_mod -from desloppify.app.commands.helpers.lang import ( - load_lang_config_metadata, - resolve_lang, +from desloppify.app.commands.helpers.dynamic_loaders import ( + load_language_move_module as load_dynamic_language_move_module, ) -from desloppify.base.exception_sets import CommandError - -logger = logging.getLogger(__name__) +from desloppify.languages import framework as lang_mod +from desloppify.app.commands.helpers.lang import load_lang_config_metadata, resolve_lang def _build_ext_to_lang_map() -> dict[str, str]: @@ -84,26 +79,7 @@ def load_lang_move_module(lang_name: str) -> ModuleType: Falls back to the shared scaffold move module when a language does not provide its own ``move.py``. """ - module_name = f"desloppify.languages.{lang_name}.move" - try: - return importlib.import_module(module_name) - except ImportError as exc: - if exc.name != module_name: - raise CommandError( - f"Failed to import language move module {module_name}: {exc}" - ) from exc - logger.debug( - "Language-specific move module missing: %s", - module_name, - ) - # Fall back to the scaffold move module that provides default stubs. - scaffold_module = "desloppify.languages._framework.scaffold_move" - try: - return importlib.import_module(scaffold_module) - except ImportError as exc: - raise CommandError( - f"Move not yet supported for language: {lang_name} ({exc})" - ) from exc + return load_dynamic_language_move_module(lang_name) def resolve_move_verify_hint(move_mod: ModuleType) -> str: diff --git a/desloppify/app/commands/plan/cluster/dispatch.py b/desloppify/app/commands/plan/cluster/dispatch.py index 4b0a1c95..21018642 100644 --- a/desloppify/app/commands/plan/cluster/dispatch.py +++ b/desloppify/app/commands/plan/cluster/dispatch.py @@ -20,15 +20,15 @@ from desloppify.app.commands.plan.shared.patterns import resolve_ids_from_patterns from desloppify.base.output.terminal import colorize -from ..cluster_ops_display import _cmd_cluster_list -from ..cluster_ops_display import _cmd_cluster_show -from ..cluster_ops_manage import _cmd_cluster_create -from ..cluster_ops_manage import _cmd_cluster_delete -from ..cluster_ops_manage import _cmd_cluster_export -from ..cluster_ops_manage import _cmd_cluster_import -from ..cluster_ops_manage import _cmd_cluster_merge -from ..cluster_ops_reorder import _cmd_cluster_reorder -from ..cluster_update import cmd_cluster_update as _cmd_cluster_update_impl +from .ops_display import _cmd_cluster_list +from .ops_display import _cmd_cluster_show +from .ops_manage import _cmd_cluster_create +from .ops_manage import _cmd_cluster_delete +from .ops_manage import _cmd_cluster_export +from .ops_manage import _cmd_cluster_import +from .ops_manage import _cmd_cluster_merge +from .ops_reorder import _cmd_cluster_reorder +from .update import cmd_cluster_update as _cmd_cluster_update_impl _HEX8_RE = re.compile(r"^[0-9a-f]{8}$") _HINT_TONE = "dim" diff --git a/desloppify/app/commands/plan/cluster_ops_display.py b/desloppify/app/commands/plan/cluster/ops_display.py similarity index 99% rename from desloppify/app/commands/plan/cluster_ops_display.py rename to desloppify/app/commands/plan/cluster/ops_display.py index 485eb3a6..7e08573a 100644 --- a/desloppify/app/commands/plan/cluster_ops_display.py +++ b/desloppify/app/commands/plan/cluster/ops_display.py @@ -9,7 +9,7 @@ from desloppify.base.output.terminal import colorize from desloppify.engine.plan_state import load_plan -from .cluster_steps import print_step +from .steps import print_step def _print_cluster_member(idx: int, fid: str, issue: dict | None) -> None: diff --git a/desloppify/app/commands/plan/cluster_ops_manage.py b/desloppify/app/commands/plan/cluster/ops_manage.py similarity index 100% rename from desloppify/app/commands/plan/cluster_ops_manage.py rename to desloppify/app/commands/plan/cluster/ops_manage.py diff --git a/desloppify/app/commands/plan/cluster_ops_reorder.py b/desloppify/app/commands/plan/cluster/ops_reorder.py similarity index 100% rename from desloppify/app/commands/plan/cluster_ops_reorder.py rename to desloppify/app/commands/plan/cluster/ops_reorder.py diff --git a/desloppify/app/commands/plan/cluster_steps.py b/desloppify/app/commands/plan/cluster/steps.py similarity index 100% rename from desloppify/app/commands/plan/cluster_steps.py rename to desloppify/app/commands/plan/cluster/steps.py diff --git a/desloppify/app/commands/plan/cluster_update.py b/desloppify/app/commands/plan/cluster/update.py similarity index 97% rename from desloppify/app/commands/plan/cluster_update.py rename to desloppify/app/commands/plan/cluster/update.py index 848ac085..15ad3749 100644 --- a/desloppify/app/commands/plan/cluster_update.py +++ b/desloppify/app/commands/plan/cluster/update.py @@ -18,7 +18,7 @@ ) from desloppify.state_io import utc_now -from .cluster_update_flow import ( +from .update_flow import ( ClusterUpdateServices, build_request, print_no_update_warning, diff --git a/desloppify/app/commands/plan/cluster_update_flow.py b/desloppify/app/commands/plan/cluster/update_flow.py similarity index 99% rename from desloppify/app/commands/plan/cluster_update_flow.py rename to desloppify/app/commands/plan/cluster/update_flow.py index b652585a..09be99e6 100644 --- a/desloppify/app/commands/plan/cluster_update_flow.py +++ b/desloppify/app/commands/plan/cluster/update_flow.py @@ -14,7 +14,7 @@ PlanModel, ) -from .cluster_steps import print_step +from .steps import print_step StepLike = str | ActionStep diff --git a/desloppify/app/commands/plan/override/__init__.py b/desloppify/app/commands/plan/override/__init__.py index 339310ce..42464819 100644 --- a/desloppify/app/commands/plan/override/__init__.py +++ b/desloppify/app/commands/plan/override/__init__.py @@ -2,15 +2,15 @@ from __future__ import annotations -from desloppify.app.commands.plan.override_misc import ( +from .misc import ( cmd_plan_describe, cmd_plan_focus, cmd_plan_note, cmd_plan_reopen, cmd_plan_scan_gate, ) -from desloppify.app.commands.plan.override_resolve_cmd import cmd_plan_resolve -from desloppify.app.commands.plan.override_skip import ( +from .resolve_cmd import cmd_plan_resolve +from .skip import ( cmd_plan_backlog, cmd_plan_skip, cmd_plan_unskip, diff --git a/desloppify/app/commands/plan/override_io.py b/desloppify/app/commands/plan/override/io.py similarity index 100% rename from desloppify/app/commands/plan/override_io.py rename to desloppify/app/commands/plan/override/io.py diff --git a/desloppify/app/commands/plan/override_misc.py b/desloppify/app/commands/plan/override/misc.py similarity index 99% rename from desloppify/app/commands/plan/override_misc.py rename to desloppify/app/commands/plan/override/misc.py index 73416f57..b5025566 100644 --- a/desloppify/app/commands/plan/override_misc.py +++ b/desloppify/app/commands/plan/override/misc.py @@ -8,7 +8,7 @@ from desloppify.app.commands.helpers.command_runtime import command_runtime from desloppify.app.commands.helpers.state import require_issue_inventory, state_path from desloppify.app.commands.plan.shared.patterns import resolve_ids_from_patterns -from desloppify.app.commands.plan.override_io import ( +from .io import ( _plan_file_for_state, save_plan_state_transactional, ) diff --git a/desloppify/app/commands/plan/override_resolve_cmd.py b/desloppify/app/commands/plan/override/resolve_cmd.py similarity index 97% rename from desloppify/app/commands/plan/override_resolve_cmd.py rename to desloppify/app/commands/plan/override/resolve_cmd.py index eb1cfb59..6dddeac4 100644 --- a/desloppify/app/commands/plan/override_resolve_cmd.py +++ b/desloppify/app/commands/plan/override/resolve_cmd.py @@ -23,11 +23,11 @@ ) from desloppify.engine.plan_ops import append_log_entry -from .override_resolve_helpers import ( +from .resolve_helpers import ( check_cluster_guard, split_synthetic_patterns, ) -from .override_resolve_workflow import resolve_workflow_patterns +from .resolve_workflow import resolve_workflow_patterns logger = logging.getLogger(__name__) diff --git a/desloppify/app/commands/plan/override_resolve_helpers.py b/desloppify/app/commands/plan/override/resolve_helpers.py similarity index 100% rename from desloppify/app/commands/plan/override_resolve_helpers.py rename to desloppify/app/commands/plan/override/resolve_helpers.py diff --git a/desloppify/app/commands/plan/override_resolve_workflow.py b/desloppify/app/commands/plan/override/resolve_workflow.py similarity index 89% rename from desloppify/app/commands/plan/override_resolve_workflow.py rename to desloppify/app/commands/plan/override/resolve_workflow.py index cf6d4c05..5363ee59 100644 --- a/desloppify/app/commands/plan/override_resolve_workflow.py +++ b/desloppify/app/commands/plan/override/resolve_workflow.py @@ -8,7 +8,12 @@ from desloppify import state as state_mod from desloppify.app.commands.helpers.state import state_path -from desloppify.app.commands.plan.override_resolve_helpers import blocked_triage_stages +from desloppify.app.commands.plan.triage.review_coverage import ( + ensure_active_triage_issue_ids, + has_open_review_issues, +) +from desloppify.base.config import target_strict_score_from_config +from .resolve_helpers import blocked_triage_stages from desloppify.app.commands.plan.triage.stage_queue import ( has_triage_in_queue, inject_triage_stages, @@ -28,6 +33,11 @@ WORKFLOW_SCORE_CHECKPOINT_ID, confirmed_triage_stage_names, ) +from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, + set_lifecycle_phase, +) +from desloppify.engine._plan.sync import live_planned_queue_empty, reconcile_plan from desloppify.engine.plan_triage import ( triage_manual_stage_command, triage_runner_commands, @@ -326,6 +336,31 @@ def _finalize_workflow_resolution( print(colorize(f" Resolved: {synthetic_id}", "green")) +def _reconcile_if_queue_drained( + args: argparse.Namespace, + plan: dict, + *, + synthetic_ids: list[str], +) -> None: + """Advance postflight when resolving a workflow item drains the live queue.""" + if not live_planned_queue_empty(plan): + return + resolved_state_path = state_path(args) + state_data = state_mod.load_state(resolved_state_path) + if WORKFLOW_CREATE_PLAN_ID in synthetic_ids and has_open_review_issues(state_data): + ensure_active_triage_issue_ids(plan, state_data) + inject_triage_stages(plan) + set_lifecycle_phase(plan, LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT) + save_plan(plan) + return + reconcile_plan( + plan, + state_data, + target_strict=target_strict_score_from_config(state_data.get("config")), + ) + save_plan(plan) + + def resolve_workflow_patterns( args: argparse.Namespace, *, @@ -385,6 +420,7 @@ def resolve_workflow_patterns( synthetic_ids=synthetic_ids, note=note, ) + _reconcile_if_queue_drained(args, plan, synthetic_ids=synthetic_ids) if not real_patterns: return WorkflowResolveOutcome(status="handled", remaining_patterns=[]) diff --git a/desloppify/app/commands/plan/override_skip.py b/desloppify/app/commands/plan/override/skip.py similarity index 99% rename from desloppify/app/commands/plan/override_skip.py rename to desloppify/app/commands/plan/override/skip.py index 3b3be764..51f294f8 100644 --- a/desloppify/app/commands/plan/override_skip.py +++ b/desloppify/app/commands/plan/override/skip.py @@ -14,7 +14,7 @@ ) from desloppify.app.commands.helpers.command_runtime import command_runtime from desloppify.app.commands.helpers.state import require_issue_inventory -from desloppify.app.commands.plan.override_io import ( +from .io import ( _plan_file_for_state, save_plan_state_transactional, ) diff --git a/desloppify/app/commands/plan/shared/cluster_membership.py b/desloppify/app/commands/plan/shared/cluster_membership.py index e34b8e87..b61fd5f3 100644 --- a/desloppify/app/commands/plan/shared/cluster_membership.py +++ b/desloppify/app/commands/plan/shared/cluster_membership.py @@ -1,37 +1,7 @@ -"""Shared cluster membership accessors for plan command readers.""" +"""Compatibility re-export for canonical plan cluster membership helpers.""" from __future__ import annotations -from desloppify.engine.plan_state import Cluster - - -def cluster_issue_ids(cluster: Cluster | dict[str, object]) -> list[str]: - """Return the effective issue IDs for a cluster.""" - ordered: list[str] = [] - seen: set[str] = set() - - def _append(raw_ids: object) -> None: - if not isinstance(raw_ids, list): - return - for raw_id in raw_ids: - if not isinstance(raw_id, str): - continue - issue_id = raw_id.strip() - if not issue_id or issue_id in seen: - continue - seen.add(issue_id) - ordered.append(issue_id) - - _append(cluster.get("issue_ids")) - - steps = cluster.get("action_steps") - if isinstance(steps, list): - for step in steps: - if not isinstance(step, dict): - continue - _append(step.get("issue_refs")) - - return ordered - +from desloppify.engine._plan.cluster_membership import cluster_issue_ids __all__ = ["cluster_issue_ids"] diff --git a/desloppify/app/commands/plan/triage/plan_state_access.py b/desloppify/app/commands/plan/triage/plan_state_access.py index 00519d05..427a68ea 100644 --- a/desloppify/app/commands/plan/triage/plan_state_access.py +++ b/desloppify/app/commands/plan/triage/plan_state_access.py @@ -2,9 +2,15 @@ from __future__ import annotations -from typing import Any, cast +from typing import cast -from desloppify.engine.plan_state import Cluster, PlanModel +from desloppify.engine.plan_state import ( + Cluster, + EpicTriageMeta, + ExecutionLogEntry, + PlanModel, + SkipEntry, +) def ensure_queue_order(plan: PlanModel) -> list[str]: @@ -17,12 +23,12 @@ def ensure_queue_order(plan: PlanModel) -> list[str]: return normalized -def ensure_skipped_map(plan: PlanModel) -> dict[str, Any]: +def ensure_skipped_map(plan: PlanModel) -> dict[str, SkipEntry]: """Return skipped metadata, creating the stored map when missing.""" skipped = plan.get("skipped") if isinstance(skipped, dict): - return cast(dict[str, Any], skipped) - normalized: dict[str, Any] = {} + return cast(dict[str, SkipEntry], skipped) + normalized: dict[str, SkipEntry] = {} plan["skipped"] = normalized return normalized @@ -37,25 +43,25 @@ def ensure_cluster_map(plan: PlanModel) -> dict[str, Cluster]: return normalized -def ensure_triage_meta(plan: PlanModel) -> dict[str, Any]: +def ensure_triage_meta(plan: PlanModel) -> EpicTriageMeta: """Return triage metadata, creating the stored map when missing.""" meta = plan.get("epic_triage_meta") if isinstance(meta, dict): - return cast(dict[str, Any], meta) - normalized: dict[str, Any] = {} + return cast(EpicTriageMeta, meta) + normalized: EpicTriageMeta = {} plan["epic_triage_meta"] = normalized return normalized -def ensure_execution_log(plan: PlanModel) -> list[dict[str, Any]]: +def ensure_execution_log(plan: PlanModel) -> list[ExecutionLogEntry]: """Return execution log, creating the stored list when missing.""" log = plan.get("execution_log") if isinstance(log, list): normalized = [entry for entry in log if isinstance(entry, dict)] if normalized is not log: plan["execution_log"] = normalized - return normalized - normalized: list[dict[str, Any]] = [] + return cast(list[ExecutionLogEntry], normalized) + normalized: list[ExecutionLogEntry] = [] plan["execution_log"] = normalized return normalized diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline.py index c75b2c9b..ebdae47e 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline.py @@ -49,6 +49,7 @@ ) from .orchestrator_common import STAGES, run_stamp from .stage_prompts import build_stage_prompt +from ..stages.helpers import value_check_targets _STAGE_HANDLERS: dict[str, StageHandler] = DEFAULT_STAGE_HANDLERS _analyze_reflect_issue_accounting = analyze_reflect_issue_accounting _validate_reflect_issue_accounting = validate_reflect_accounting @@ -160,6 +161,13 @@ def _run_stage_sequence( pipeline_context.append_run_log(f"stage-start stage={stage}") si = pipeline_context.services.collect_triage_input(plan, pipeline_context.state) + if stage == "sense-check": + si.value_check_targets = value_check_targets(plan, pipeline_context.state) + setattr( + pipeline_context.args, + "sense_check_value_targets", + list(si.value_check_targets), + ) last_triage_input = si execution_result = execute_stage_impl( StageRunContext( diff --git a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py index 5200c24a..255b0fba 100644 --- a/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py +++ b/desloppify/app/commands/plan/triage/runner/orchestrator_codex_pipeline_execution.py @@ -85,6 +85,7 @@ def _record_sense_check_report( stage="sense-check", report=report, state=getattr(args, "state", None), + value_targets=getattr(args, "sense_check_value_targets", None), ) cmd_stage_sense_check(record_args, services=services) diff --git a/desloppify/app/commands/plan/triage/runner/stage_validation.py b/desloppify/app/commands/plan/triage/runner/stage_validation.py index c8a0b0cb..d73d9309 100644 --- a/desloppify/app/commands/plan/triage/runner/stage_validation.py +++ b/desloppify/app/commands/plan/triage/runner/stage_validation.py @@ -15,6 +15,7 @@ validate_report_references_clusters, ) from ..validation.enrich_quality import evaluate_enrich_quality +from ..validation.completion_policy import evaluate_completion_readiness from ..validation.enrich_checks import ( _cluster_file_overlaps, _clusters_with_directory_scatter, @@ -233,6 +234,8 @@ def _validate_sense_check_stage( state: dict, repo_root: Path, stages: dict, + *, + triage_input: TriageInput | None = None, ) -> tuple[bool, str]: """Validate recorded sense-check-stage content (includes value decisions).""" if "sense-check" not in stages: @@ -263,7 +266,16 @@ def _validate_sense_check_stage( if blocking_cf: return False, blocking_cf[0].message # Decision Ledger validation (value subagent output) - targets = value_check_targets(plan, state) + frozen_targets = None + if isinstance(stages.get("sense-check"), dict): + recorded_targets = stages["sense-check"].get("value_targets") + if isinstance(recorded_targets, list): + frozen_targets = [target for target in recorded_targets if isinstance(target, str)] + if frozen_targets is None and triage_input is not None: + triage_targets = getattr(triage_input, "value_check_targets", None) + if isinstance(triage_targets, list): + frozen_targets = [target for target in triage_targets if isinstance(target, str)] + targets = frozen_targets if frozen_targets is not None else value_check_targets(plan, state) if targets: parsed = parse_value_check_decision_ledger(report) if not parsed.entries: @@ -298,7 +310,13 @@ def validate_stage( "reflect": lambda: _validate_reflect_stage(stages), "organize": lambda: _validate_organize_stage(plan, state, stages), "enrich": lambda: _validate_enrich_stage(plan, state, repo_root, stages), - "sense-check": lambda: _validate_sense_check_stage(plan, state, repo_root, stages), + "sense-check": lambda: _validate_sense_check_stage( + plan, + state, + repo_root, + stages, + triage_input=triage_input, + ), } validator = validators.get(stage) if validator is None: @@ -306,80 +324,19 @@ def validate_stage( return validator() -def _validate_required_stages(stages: dict) -> tuple[bool, str]: - """Validate that all required triage stages are present and confirmed.""" - for required in ("observe", "reflect", "organize", "enrich", "sense-check"): - if required not in stages: - return False, f"Stage {required} not recorded." - if not stages[required].get("confirmed_at"): - return False, f"Stage {required} not confirmed." - return True, "" - - -def _validate_cluster_dependency_cycles(clusters: dict) -> tuple[bool, str]: - """Reject self-referential cluster dependencies.""" - for name, cluster in clusters.items(): - deps = cluster.get("depends_on_clusters", []) - if name in deps: - return False, f"Cluster {name} depends on itself." - return True, "" - - -def _find_all_trivial_clusters(clusters: dict) -> list[str]: - """Return manual clusters whose action steps are all marked trivial.""" - trivial_clusters: list[str] = [] - for name, cluster in clusters.items(): - if cluster.get("auto") or not cluster_issue_ids(cluster): - continue - steps = cluster.get("action_steps") or [] - if steps and all( - isinstance(step, dict) and step.get("effort") == "trivial" - for step in steps - ): - trivial_clusters.append(name) - return trivial_clusters - - def validate_completion( plan: dict, state: dict, repo_root: Path, ) -> tuple[bool, str]: """Validate plan is ready for triage completion. Returns (ok, error_msg).""" - meta = plan.get("epic_triage_meta", {}) - stages = meta.get("triage_stages", {}) - - ok, message = _validate_required_stages(stages) - if not ok: - return ok, message - - triage_scope = active_triage_issue_scope(plan, state) - open_review_ids = open_review_ids_from_state(state) if triage_scope is None else triage_scope - manual = scoped_manual_clusters_with_issues(plan, state) - if not open_review_ids and not manual: - return True, "" - if not manual: - return False, "No manual clusters with issues." - - gaps = unenriched_clusters(plan, state) - if gaps: - return False, f"{len(gaps)} cluster(s) still need enrichment." - - unclustered = unclustered_review_issues(plan, state) - if unclustered: - return False, f"{len(unclustered)} review issue(s) not in any cluster." - - clusters = triage_scoped_plan(plan, state).get("clusters", {}) - ok, message = _validate_cluster_dependency_cycles(clusters) - if not ok: - return ok, message - - all_trivial_clusters = _find_all_trivial_clusters(clusters) - if all_trivial_clusters: - names = ", ".join(sorted(all_trivial_clusters)) - return True, f"Advisory: all action steps are marked trivial in cluster(s): {names}" - - return True, "" + _ = repo_root + readiness = evaluate_completion_readiness( + plan, + state, + require_confirmed_stages=True, + ) + return readiness.ok, readiness.message def build_auto_attestation( diff --git a/desloppify/app/commands/plan/triage/stages/completion.py b/desloppify/app/commands/plan/triage/stages/completion.py index 3972280e..a2e8c6f0 100644 --- a/desloppify/app/commands/plan/triage/stages/completion.py +++ b/desloppify/app/commands/plan/triage/stages/completion.py @@ -10,7 +10,6 @@ from .records import record_confirm_existing_completion from .rendering import _print_complete_summary from ..validation.completion_policy import ( - _completion_clusters_valid, _completion_strategy_valid, _confirm_existing_stages_valid, _confirm_note_valid, @@ -20,6 +19,7 @@ _require_prior_strategy_for_confirm, _resolve_completion_strategy, _resolve_confirm_existing_strategy, + evaluate_completion_readiness, ) from ..validation.completion_stages import ( _auto_confirm_enrich_for_complete, @@ -203,7 +203,12 @@ def _cmd_triage_complete( ): return - if not _completion_clusters_valid(plan, state): + readiness = evaluate_completion_readiness( + plan, + state, + require_confirmed_stages=False, + ) + if not readiness.ok: _record_incomplete_recovery( plan=plan, state=state, @@ -212,7 +217,8 @@ def _cmd_triage_complete( ) return - organized, total, _clusters = triage_coverage(plan, open_review_ids=review_ids) + organized = readiness.organized + total = readiness.total if total > 0 and organized == 0: _print_completion_coverage_warning(organized=organized, total=total) return diff --git a/desloppify/app/commands/plan/triage/stages/records.py b/desloppify/app/commands/plan/triage/stages/records.py index 3ece1f45..e77ac1f4 100644 --- a/desloppify/app/commands/plan/triage/stages/records.py +++ b/desloppify/app/commands/plan/triage/stages/records.py @@ -74,6 +74,7 @@ class SenseCheckRecord(TypedDict, total=False): confirmed_at: str confirmed_text: str value_decisions: dict[str, str] + value_targets: list[str] TriageStages = dict[ @@ -178,12 +179,17 @@ def record_sense_check_stage( report: str, existing_stage: SenseCheckRecord | None, is_reuse: bool, + value_targets: list[str] | None = None, ) -> list[str]: sense_check: SenseCheckRecord = { "stage": "sense-check", "report": report, "timestamp": utc_now(), } + if value_targets: + sense_check["value_targets"] = list(value_targets) + elif existing_stage and existing_stage.get("value_targets"): + sense_check["value_targets"] = list(existing_stage["value_targets"]) if is_reuse and existing_stage and existing_stage.get("confirmed_at"): sense_check["confirmed_at"] = existing_stage["confirmed_at"] sense_check["confirmed_text"] = existing_stage.get("confirmed_text", "") diff --git a/desloppify/app/commands/plan/triage/stages/sense_check.py b/desloppify/app/commands/plan/triage/stages/sense_check.py index 79e4d09a..7a4c4085 100644 --- a/desloppify/app/commands/plan/triage/stages/sense_check.py +++ b/desloppify/app/commands/plan/triage/stages/sense_check.py @@ -10,6 +10,7 @@ from desloppify.base.output.terminal import colorize from .records import record_sense_check_stage, resolve_reusable_report +from .helpers import value_check_targets from ..validation.enrich_quality import evaluate_enrich_quality from ..validation.enrich_checks import ( _steps_missing_issue_refs, @@ -205,11 +206,18 @@ def run_stage_sense_check( ) stages = meta.setdefault("triage_stages", {}) + frozen_value_targets = getattr(args, "value_targets", None) + if not isinstance(frozen_value_targets, list): + if existing_stage and isinstance(existing_stage.get("value_targets"), list): + frozen_value_targets = list(existing_stage["value_targets"]) + else: + frozen_value_targets = value_check_targets(plan, state) cleared = resolved_deps.record_sense_check_stage( stages, report=report, existing_stage=existing_stage, is_reuse=is_reuse, + value_targets=frozen_value_targets, ) resolved_services.save_plan(plan) diff --git a/desloppify/app/commands/plan/triage/validation/completion_policy.py b/desloppify/app/commands/plan/triage/validation/completion_policy.py index cfa3dcbd..4e48a8da 100644 --- a/desloppify/app/commands/plan/triage/validation/completion_policy.py +++ b/desloppify/app/commands/plan/triage/validation/completion_policy.py @@ -2,6 +2,8 @@ from __future__ import annotations +from dataclasses import dataclass + from desloppify.engine.plan_triage import TRIAGE_CMD_ORGANIZE from desloppify.base.output.terminal import colorize from desloppify.engine.plan_triage import extract_issue_citations @@ -10,10 +12,12 @@ from ..review_coverage import ( cluster_issue_ids, open_review_ids_from_state, + triage_coverage, ) from ..stages.helpers import ( active_triage_issue_scope, scoped_manual_clusters_with_issues, + triage_scoped_plan, unclustered_review_issues, unenriched_clusters, ) @@ -25,6 +29,18 @@ ) +@dataclass(frozen=True) +class CompletionReadiness: + """Single completion-boundary verdict shared by command and runner paths.""" + + ok: bool + message: str = "" + open_review_ids: frozenset[str] = frozenset() + manual_clusters: tuple[str, ...] = () + organized: int = 0 + total: int = 0 + + def _resolve_strategy_input( strategy: str | None, *, @@ -69,12 +85,67 @@ def _strategy_valid_or_error( def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: + return evaluate_completion_readiness( + plan, + state, + require_confirmed_stages=False, + ).ok + + +def _required_completion_stages_valid(stages: dict) -> tuple[bool, str]: + """Validate that the triage completion stages are present and confirmed.""" + for required in ("observe", "reflect", "organize", "enrich", "sense-check"): + if required not in stages: + return False, f"Stage {required} not recorded." + if not stages[required].get("confirmed_at"): + return False, f"Stage {required} not confirmed." + return True, "" + + +def _validate_cluster_dependency_cycles(clusters: dict) -> tuple[bool, str]: + """Reject self-referential cluster dependencies.""" + for name, cluster in clusters.items(): + deps = cluster.get("depends_on_clusters", []) + if name in deps: + return False, f"Cluster {name} depends on itself." + return True, "" + + +def _find_all_trivial_clusters(clusters: dict) -> list[str]: + """Return manual clusters whose action steps are all marked trivial.""" + trivial_clusters: list[str] = [] + for name, cluster in clusters.items(): + if cluster.get("auto") or not cluster_issue_ids(cluster): + continue + steps = cluster.get("action_steps") or [] + if steps and all( + isinstance(step, dict) and step.get("effort") == "trivial" + for step in steps + ): + trivial_clusters.append(name) + return trivial_clusters + + +def evaluate_completion_readiness( + plan: dict, + state: dict | None, + *, + require_confirmed_stages: bool = False, +) -> CompletionReadiness: + """Evaluate whether triage completion is ready from one owned boundary.""" + meta = plan.get("epic_triage_meta", {}) + stages = meta.get("triage_stages", {}) + if require_confirmed_stages: + ok, message = _required_completion_stages_valid(stages) + if not ok: + return CompletionReadiness(ok=False, message=message) + triage_scope = active_triage_issue_scope(plan, state) in_scope_open_ids = ( open_review_ids_from_state(state) if state is not None and triage_scope is None else (triage_scope or set()) ) if state is not None and not in_scope_open_ids: - return True + return CompletionReadiness(ok=True) manual_clusters = scoped_manual_clusters_with_issues(plan, state) if not manual_clusters: @@ -85,7 +156,7 @@ def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: if not any_clusters: print(colorize(" Cannot complete: no clusters with issues exist.", "red")) print(colorize(' Create clusters: desloppify plan cluster create <name> --description "..."', "dim")) - return False + return CompletionReadiness(ok=False, message="No clusters with issues exist.") gaps = unenriched_clusters(plan, state) if gaps: @@ -94,7 +165,7 @@ def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: print(colorize(f" {name}: missing {', '.join(missing)}", "yellow")) print(colorize(" Small clusters (<5 issues) need at least 1 action step per issue.", "dim")) print(colorize(' Fix: desloppify plan cluster update <name> --description "..." --steps "step1" "step2"', "dim")) - return False + return CompletionReadiness(ok=False, message=f"{len(gaps)} cluster(s) still need enrichment.") unclustered = unclustered_review_issues(plan, state) if unclustered: @@ -105,9 +176,36 @@ def _completion_clusters_valid(plan: dict, state: dict | None = None) -> bool: if len(unclustered) > 5: print(colorize(f" ... and {len(unclustered) - 5} more", "yellow")) print(colorize(" Add to a cluster or wontfix each unclustered issue.", "dim")) - return False + return CompletionReadiness( + ok=False, + message=f"{len(unclustered)} review issue(s) not in any cluster.", + ) - return True + scoped_clusters = triage_scoped_plan(plan, state).get("clusters", {}) + ok, message = _validate_cluster_dependency_cycles(scoped_clusters) + if not ok: + return CompletionReadiness(ok=False, message=message) + + organized, total, _ = triage_coverage(plan, open_review_ids=in_scope_open_ids) + trivial_clusters = _find_all_trivial_clusters(scoped_clusters) + if trivial_clusters: + names = ", ".join(sorted(trivial_clusters)) + return CompletionReadiness( + ok=True, + message=f"Advisory: all action steps are marked trivial in cluster(s): {names}", + open_review_ids=frozenset(in_scope_open_ids), + manual_clusters=tuple(manual_clusters), + organized=organized, + total=total, + ) + + return CompletionReadiness( + ok=True, + open_review_ids=frozenset(in_scope_open_ids), + manual_clusters=tuple(manual_clusters), + organized=organized, + total=total, + ) def _resolve_completion_strategy(strategy: str | None, *, meta: dict) -> str | None: @@ -208,6 +306,7 @@ def _note_cites_new_issues_or_error(note: str, si) -> bool: __all__ = [ "_auto_confirm_enrich_for_complete", + "CompletionReadiness", "_completion_clusters_valid", "_completion_strategy_valid", "_confirm_existing_stages_valid", @@ -219,6 +318,8 @@ def _note_cites_new_issues_or_error(note: str, si) -> bool: "_require_organize_stage_for_complete", "_require_prior_strategy_for_confirm", "_require_sense_check_stage_for_complete", + "_required_completion_stages_valid", "_resolve_completion_strategy", "_resolve_confirm_existing_strategy", + "evaluate_completion_readiness", ] diff --git a/desloppify/app/commands/resolve/living_plan.py b/desloppify/app/commands/resolve/living_plan.py index 05b87698..17044eee 100644 --- a/desloppify/app/commands/resolve/living_plan.py +++ b/desloppify/app/commands/resolve/living_plan.py @@ -7,9 +7,11 @@ from pathlib import Path from typing import NamedTuple +from desloppify.base.config import target_strict_score_from_config from desloppify.base.exception_sets import PLAN_LOAD_EXCEPTIONS from desloppify.base.output.terminal import colorize from desloppify.app.commands.resolve.plan_load import warn_plan_load_degraded_once +from desloppify.engine._plan.sync import live_planned_queue_empty, reconcile_plan from desloppify.engine.plan_ops import ( append_log_entry, auto_complete_steps, @@ -34,6 +36,14 @@ class ClusterContext(NamedTuple): cluster_remaining: int +def _reconcile_if_queue_drained(plan: dict, state: dict | None) -> None: + """Advance the living plan when a resolve drains the explicit live queue.""" + if state is None or not live_planned_queue_empty(plan): + return + target_strict = target_strict_score_from_config(state.get("config")) + reconcile_plan(plan, state, target_strict=target_strict) + + def capture_cluster_context(plan: dict, resolved_ids: list[str]) -> ClusterContext: """Determine cluster membership for resolved issues before purge.""" clusters = plan.get("clusters") or {} @@ -97,6 +107,7 @@ def update_living_plan_after_resolve( elif args.status == "open": purge_uncommitted_ids(plan, all_resolved) clear_postflight_scan_completion(plan, issue_ids=all_resolved, state=state) + _reconcile_if_queue_drained(plan, state) save_plan(plan, plan_path) if purged: print(colorize(f" Plan updated: {purged} item(s) removed from queue.", "dim")) diff --git a/desloppify/app/commands/review/batch/execution.py b/desloppify/app/commands/review/batch/execution.py index 44e84a8e..f0d528ca 100644 --- a/desloppify/app/commands/review/batch/execution.py +++ b/desloppify/app/commands/review/batch/execution.py @@ -7,17 +7,57 @@ from typing import Any, Callable +@dataclass(frozen=True) +class LoadOrPreparePacketRequest: + """Stable inputs for resolving a reusable or fresh review packet.""" + + args: Any + state: dict[str, Any] + lang: Any + config: dict[str, Any] + stamp: str + + +@dataclass(frozen=True) +class PrepareRunArtifactsRequest: + """Stable inputs for creating a review batch run directory.""" + + stamp: str + selected_indexes: list[int] + batches: list[dict[str, Any]] + packet_path: Path + run_root: Path + repo_root: Path + + +@dataclass(frozen=True) +class CollectBatchResultsRequest: + """Stable inputs for parsing and normalizing batch result payloads.""" + + selected_indexes: list[int] + failures: list[int] + output_files: dict[int, Path] + allowed_dims: set[str] + + @dataclass(frozen=True) class BatchRunDeps: """Explicit callable surface for batch-run orchestration.""" run_stamp_fn: Callable[[], str] - load_or_prepare_packet_fn: Callable[..., tuple[dict[str, Any], Path, Path]] + load_or_prepare_packet_fn: Callable[ + [LoadOrPreparePacketRequest], tuple[dict[str, Any], Path, Path] + ] selected_batch_indexes_fn: Callable[..., list[int]] - prepare_run_artifacts_fn: Callable[..., tuple[Path, Path, dict[int, Path], dict[int, Path], dict[int, Path]]] + prepare_run_artifacts_fn: Callable[ + [PrepareRunArtifactsRequest], + tuple[Path, Path, dict[int, Path], dict[int, Path], dict[int, Path]], + ] run_codex_batch_fn: Callable[..., int] execute_batches_fn: Callable[..., list[int]] - collect_batch_results_fn: Callable[..., tuple[list[dict[str, Any]], list[int]]] + collect_batch_results_fn: Callable[ + [CollectBatchResultsRequest], tuple[list[dict[str, Any]], list[int]] + ] print_failures_fn: Callable[..., None] print_failures_and_raise_fn: Callable[..., None] merge_batch_results_fn: Callable[[list[dict[str, Any]]], dict[str, object]] @@ -27,4 +67,9 @@ class BatchRunDeps: safe_write_text_fn: Callable[[Path, str], None] colorize_fn: Callable[[str, str | None], str] -__all__ = ["BatchRunDeps"] +__all__ = [ + "BatchRunDeps", + "CollectBatchResultsRequest", + "LoadOrPreparePacketRequest", + "PrepareRunArtifactsRequest", +] diff --git a/desloppify/app/commands/review/batch/execution_phases.py b/desloppify/app/commands/review/batch/execution_phases.py index abf0065a..b38fe6ff 100644 --- a/desloppify/app/commands/review/batch/execution_phases.py +++ b/desloppify/app/commands/review/batch/execution_phases.py @@ -33,6 +33,11 @@ merge_and_write_results, ) from .execution_summary import build_run_summary_writer +from .execution import ( + CollectBatchResultsRequest, + LoadOrPreparePacketRequest, + PrepareRunArtifactsRequest, +) from .scope import ( normalize_dimension_list, print_preflight_dimension_scope_notice, @@ -42,6 +47,7 @@ ) if TYPE_CHECKING: + from ..runtime.policy import BatchRunPolicy from .execution import BatchRunDeps @@ -96,18 +102,40 @@ class ExecutedBatchRunContext: failure_set: set[int] -def _resolve_runtime_policy(args) -> tuple[bool, int, float, float, int, float, float, float]: - policy = resolve_batch_run_policy(args) - return ( - policy.run_parallel, - policy.max_parallel_batches, - policy.heartbeat_seconds, - policy.batch_timeout_seconds, - policy.batch_max_retries, - policy.batch_retry_backoff_seconds, - policy.stall_warning_seconds, - policy.stall_kill_seconds, - ) +@dataclass(frozen=True) +class PreparedPacketScope: + """Packet and selection state shared from prepare into execution.""" + + packet: dict[str, Any] + immutable_packet_path: Path + prompt_packet_path: Path + scan_path: str + packet_dimensions: list[str] + scored_dimensions: list[str] + batches: list[dict[str, Any]] + selected_indexes: list[int] + + +@dataclass(frozen=True) +class PreparedRunArtifacts: + """Runtime artifacts and callbacks created for one batch run.""" + + run_dir: Path + logs_dir: Path + prompt_files: dict[int, Path] + output_files: dict[int, Path] + log_files: dict[int, Path] + run_log_path: Path + append_run_log: Any + batch_positions: dict[int, int] + batch_status: dict[str, dict[str, object]] + report_progress: Any + record_issue: Any + write_run_summary: Any + + +def _resolve_runtime_policy(args) -> BatchRunPolicy: + return resolve_batch_run_policy(args) def _prepare_packet_scope( @@ -118,13 +146,15 @@ def _prepare_packet_scope( config: dict[str, Any], deps: BatchRunDeps, stamp: str, -) -> tuple[dict[str, Any], Path, Path, str, list[str], list[str], list[dict[str, Any]], list[int]]: +) -> PreparedPacketScope: packet, immutable_packet_path, prompt_packet_path = deps.load_or_prepare_packet_fn( - args, - state=state, - lang=lang, - config=config, - stamp=stamp, + LoadOrPreparePacketRequest( + args=args, + state=state, + lang=lang, + config=config, + stamp=stamp, + ) ) scan_path = str(getattr(args, "path", ".") or ".") packet_dimensions = normalize_dimension_list(packet.get("dimensions", [])) @@ -147,15 +177,15 @@ def _prepare_packet_scope( dimension_prompts=raw_dim_prompts if isinstance(raw_dim_prompts, dict) else None, ) selected_indexes = deps.selected_batch_indexes_fn(args, batch_count=len(batches)) - return ( - packet, - immutable_packet_path, - prompt_packet_path, - scan_path, - packet_dimensions, - scored_dimensions, - batches, - selected_indexes, + return PreparedPacketScope( + packet=packet, + immutable_packet_path=immutable_packet_path, + prompt_packet_path=prompt_packet_path, + scan_path=scan_path, + packet_dimensions=packet_dimensions, + scored_dimensions=scored_dimensions, + batches=batches, + selected_indexes=selected_indexes, ) @@ -202,27 +232,16 @@ def _prepare_run_runtime( batch_retry_backoff_seconds: float, stall_warning_seconds: float, stall_kill_seconds: float, -) -> tuple[ - Path, - Path, - dict[int, Path], - dict[int, Path], - dict[int, Path], - Path, - Any, - dict[int, int], - dict[str, dict[str, object]], - Any, - Any, - Any, -]: +) -> PreparedRunArtifacts: run_dir, logs_dir, prompt_files, output_files, log_files = deps.prepare_run_artifacts_fn( - stamp=stamp, - selected_indexes=selected_indexes, - batches=batches, - packet_path=prompt_packet_path, - run_root=subagent_runs_dir, - repo_root=project_root, + PrepareRunArtifactsRequest( + stamp=stamp, + selected_indexes=selected_indexes, + batches=batches, + packet_path=prompt_packet_path, + run_root=subagent_runs_dir, + repo_root=project_root, + ) ) run_log_path = resolve_run_log_path( getattr(args, "run_log_file", None), @@ -302,19 +321,19 @@ def _prepare_run_runtime( colorize_fn=deps.colorize_fn, append_run_log=append_run_log, ) - return ( - run_dir, - logs_dir, - prompt_files, - output_files, - log_files, - run_log_path, - append_run_log, - batch_positions, - batch_status, - report_progress, - record_issue, - write_run_summary, + return PreparedRunArtifacts( + run_dir=run_dir, + logs_dir=logs_dir, + prompt_files=prompt_files, + output_files=output_files, + log_files=log_files, + run_log_path=run_log_path, + append_run_log=append_run_log, + batch_positions=batch_positions, + batch_status=batch_status, + report_progress=report_progress, + record_issue=record_issue, + write_run_summary=write_run_summary, ) @@ -333,28 +352,10 @@ def prepare_batch_run( validate_runner(runner, colorize_fn=deps.colorize_fn) allow_partial = bool(getattr(args, "allow_partial", False)) - ( - run_parallel, - max_parallel_batches, - heartbeat_seconds, - batch_timeout_seconds, - batch_max_retries, - batch_retry_backoff_seconds, - stall_warning_seconds, - stall_kill_seconds, - ) = _resolve_runtime_policy(args) + policy = _resolve_runtime_policy(args) stamp = deps.run_stamp_fn() - ( - packet, - immutable_packet_path, - prompt_packet_path, - scan_path, - packet_dimensions, - scored_dimensions, - batches, - selected_indexes, - ) = _prepare_packet_scope( + packet_scope = _prepare_packet_scope( args=args, state=state, lang=lang, @@ -362,70 +363,57 @@ def prepare_batch_run( deps=deps, stamp=stamp, ) - total_batches = len(selected_indexes) + total_batches = len(packet_scope.selected_indexes) _print_runtime_expectation( deps=deps, total_batches=total_batches, - run_parallel=run_parallel, - max_parallel_batches=max_parallel_batches, - batch_timeout_seconds=batch_timeout_seconds, + run_parallel=policy.run_parallel, + max_parallel_batches=policy.max_parallel_batches, + batch_timeout_seconds=policy.batch_timeout_seconds, ) - ( - run_dir, - logs_dir, - prompt_files, - output_files, - log_files, - run_log_path, - append_run_log, - batch_positions, - batch_status, - report_progress, - record_issue, - write_run_summary, - ) = _prepare_run_runtime( + runtime_artifacts = _prepare_run_runtime( args=args, deps=deps, stamp=stamp, - selected_indexes=selected_indexes, - batches=batches, - prompt_packet_path=prompt_packet_path, - immutable_packet_path=immutable_packet_path, + selected_indexes=packet_scope.selected_indexes, + batches=packet_scope.batches, + prompt_packet_path=packet_scope.prompt_packet_path, + immutable_packet_path=packet_scope.immutable_packet_path, project_root=project_root, subagent_runs_dir=subagent_runs_dir, runner=runner, allow_partial=allow_partial, - run_parallel=run_parallel, - max_parallel_batches=max_parallel_batches, - heartbeat_seconds=heartbeat_seconds, - batch_timeout_seconds=batch_timeout_seconds, - batch_max_retries=batch_max_retries, - batch_retry_backoff_seconds=batch_retry_backoff_seconds, - stall_warning_seconds=stall_warning_seconds, - stall_kill_seconds=stall_kill_seconds, + run_parallel=policy.run_parallel, + max_parallel_batches=policy.max_parallel_batches, + heartbeat_seconds=policy.heartbeat_seconds, + batch_timeout_seconds=policy.batch_timeout_seconds, + batch_max_retries=policy.batch_max_retries, + batch_retry_backoff_seconds=policy.batch_retry_backoff_seconds, + stall_warning_seconds=policy.stall_warning_seconds, + stall_kill_seconds=policy.stall_kill_seconds, ) if maybe_handle_dry_run( args=args, stamp=stamp, - selected_indexes=selected_indexes, - run_dir=run_dir, - logs_dir=logs_dir, - immutable_packet_path=immutable_packet_path, - prompt_packet_path=prompt_packet_path, - prompt_files=prompt_files, - output_files=output_files, + selected_indexes=packet_scope.selected_indexes, + run_dir=runtime_artifacts.run_dir, + logs_dir=runtime_artifacts.logs_dir, + immutable_packet_path=packet_scope.immutable_packet_path, + prompt_packet_path=packet_scope.prompt_packet_path, + prompt_files=runtime_artifacts.prompt_files, + output_files=runtime_artifacts.output_files, safe_write_text_fn=deps.safe_write_text_fn, colorize_fn=deps.colorize_fn, - append_run_log=append_run_log, + append_run_log=runtime_artifacts.append_run_log, ): return None - if run_parallel: + if policy.run_parallel: print( deps.colorize_fn( " Parallel runner config: " - f"max-workers={min(total_batches, max_parallel_batches)}, " - f"heartbeat={heartbeat_seconds:.1f}s", + f"max-workers={min(total_batches, policy.max_parallel_batches)}, " + f"heartbeat={policy.heartbeat_seconds:.1f}s", "dim", ) ) @@ -436,37 +424,37 @@ def prepare_batch_run( config=config, runner=runner, allow_partial=allow_partial, - run_parallel=run_parallel, - max_parallel_batches=max_parallel_batches, - heartbeat_seconds=heartbeat_seconds, - batch_timeout_seconds=batch_timeout_seconds, - batch_max_retries=batch_max_retries, - batch_retry_backoff_seconds=batch_retry_backoff_seconds, - stall_warning_seconds=stall_warning_seconds, - stall_kill_seconds=stall_kill_seconds, + run_parallel=policy.run_parallel, + max_parallel_batches=policy.max_parallel_batches, + heartbeat_seconds=policy.heartbeat_seconds, + batch_timeout_seconds=policy.batch_timeout_seconds, + batch_max_retries=policy.batch_max_retries, + batch_retry_backoff_seconds=policy.batch_retry_backoff_seconds, + stall_warning_seconds=policy.stall_warning_seconds, + stall_kill_seconds=policy.stall_kill_seconds, state=state, lang=lang, - packet=packet, - immutable_packet_path=immutable_packet_path, - prompt_packet_path=prompt_packet_path, - scan_path=scan_path, - packet_dimensions=packet_dimensions, - scored_dimensions=scored_dimensions, - batches=batches, - selected_indexes=selected_indexes, + packet=packet_scope.packet, + immutable_packet_path=packet_scope.immutable_packet_path, + prompt_packet_path=packet_scope.prompt_packet_path, + scan_path=packet_scope.scan_path, + packet_dimensions=packet_scope.packet_dimensions, + scored_dimensions=packet_scope.scored_dimensions, + batches=packet_scope.batches, + selected_indexes=packet_scope.selected_indexes, project_root=project_root, - run_dir=run_dir, - logs_dir=logs_dir, - prompt_files=prompt_files, - output_files=output_files, - log_files=log_files, - run_log_path=run_log_path, - append_run_log=append_run_log, - batch_positions=batch_positions, - batch_status=batch_status, - report_progress=report_progress, - record_issue=record_issue, - write_run_summary=write_run_summary, + run_dir=runtime_artifacts.run_dir, + logs_dir=runtime_artifacts.logs_dir, + prompt_files=runtime_artifacts.prompt_files, + output_files=runtime_artifacts.output_files, + log_files=runtime_artifacts.log_files, + run_log_path=runtime_artifacts.run_log_path, + append_run_log=runtime_artifacts.append_run_log, + batch_positions=runtime_artifacts.batch_positions, + batch_status=runtime_artifacts.batch_status, + report_progress=runtime_artifacts.report_progress, + record_issue=runtime_artifacts.record_issue, + write_run_summary=runtime_artifacts.write_run_summary, ) @@ -509,10 +497,17 @@ def execute_batch_run(*, prepared: PreparedBatchRunContext, deps: BatchRunDeps) batch_results, successful_indexes, failures, failure_set = collect_and_reconcile_results( collect_batch_results_fn=deps.collect_batch_results_fn, - selected_indexes=selected_indexes, + request=CollectBatchResultsRequest( + selected_indexes=selected_indexes, + failures=execution_failures, + output_files=prepared.output_files, + allowed_dims={ + str(dim) + for dim in prepared.packet.get("dimensions", []) + if isinstance(dim, str) + }, + ), execution_failures=execution_failures, - output_files=prepared.output_files, - packet=prepared.packet, batch_positions=prepared.batch_positions, batch_status=prepared.batch_status, colorize_fn=deps.colorize_fn, @@ -608,7 +603,9 @@ def merge_and_import_batch_run( __all__ = [ "ExecutedBatchRunContext", + "PreparedPacketScope", "PreparedBatchRunContext", + "PreparedRunArtifacts", "_prepare_packet_scope", "_prepare_run_runtime", "_print_runtime_expectation", diff --git a/desloppify/app/commands/review/batch/execution_results.py b/desloppify/app/commands/review/batch/execution_results.py index b35b3823..8f8bd869 100644 --- a/desloppify/app/commands/review/batch/execution_results.py +++ b/desloppify/app/commands/review/batch/execution_results.py @@ -8,6 +8,7 @@ from desloppify.base.exception_sets import CommandError from ..importing.flags import ReviewImportConfig +from .execution import CollectBatchResultsRequest from .scope import ( collect_reviewed_files_from_batches, @@ -21,24 +22,16 @@ def collect_and_reconcile_results( *, collect_batch_results_fn, - selected_indexes: list[int], + request: CollectBatchResultsRequest, execution_failures: list[int], - output_files: dict, - packet: dict, batch_positions: dict[int, int], batch_status: dict[str, dict[str, object]], colorize_fn=None, ) -> tuple[list[dict], list[int], list[int], set[int]]: """Collect batch results and reconcile per-batch status entries.""" - allowed_dims = { - str(dim) for dim in packet.get("dimensions", []) if isinstance(dim, str) - } - batch_results, failures = collect_batch_results_fn( - selected_indexes=selected_indexes, - failures=execution_failures, - output_files=output_files, - allowed_dims=allowed_dims, - ) + selected_indexes = request.selected_indexes + output_files = request.output_files + batch_results, failures = collect_batch_results_fn(request) execution_failure_set = set(execution_failures) failure_set = set(failures) diff --git a/desloppify/app/commands/review/batch/orchestrator.py b/desloppify/app/commands/review/batch/orchestrator.py index ec56b3bc..0d6ea09c 100644 --- a/desloppify/app/commands/review/batch/orchestrator.py +++ b/desloppify/app/commands/review/batch/orchestrator.py @@ -149,8 +149,13 @@ def _build_batch_run_deps(*, policy, project_root: Path) -> review_batches_mod.B parse_fn=parse_batch_selection, colorize_fn=colorize, ), - prepare_run_artifacts_fn=partial( - prepare_run_artifacts, + prepare_run_artifacts_fn=lambda request: prepare_run_artifacts( + stamp=request.stamp, + selected_indexes=request.selected_indexes, + batches=request.batches, + packet_path=request.packet_path, + run_root=request.run_root, + repo_root=request.repo_root, build_prompt_fn=partial(render_batch_prompt, policy_block=policy_block), safe_write_text_fn=safe_write_text, colorize_fn=colorize, @@ -169,11 +174,8 @@ def _build_batch_run_deps(*, policy, project_root: Path) -> review_batches_mod.B progress_fn=kwargs.get("progress_fn"), error_log_fn=kwargs.get("error_log_fn"), ), - collect_batch_results_fn=lambda **kwargs: collect_batch_results( - selected_indexes=kwargs["selected_indexes"], - failures=kwargs["failures"], - output_files=kwargs["output_files"], - allowed_dims=kwargs["allowed_dims"], + collect_batch_results_fn=lambda request: collect_batch_results( + request=request, extract_payload_fn=lambda raw: extract_json_payload(raw, log_fn=log), normalize_result_fn=lambda payload, dims: normalize_batch_result( payload, @@ -272,14 +274,14 @@ def _merge_batch_results(batch_results: list[object]) -> dict[str, object]: def _load_or_prepare_packet( - args, - *, - state: dict, - lang, - config: dict, - stamp: str, + request: review_batches_mod.LoadOrPreparePacketRequest, ) -> tuple[dict, Path, Path]: """Load packet override or prepare a fresh packet snapshot.""" + args = request.args + state = request.state + lang = request.lang + config = request.config + stamp = request.stamp packet_override = getattr(args, "packet", None) if packet_override: packet_path = Path(packet_override) @@ -498,10 +500,12 @@ def do_import_run( raise CommandError(hint, exit_code=1) batch_results, failures = collect_batch_results( - selected_indexes=selected_indexes, - failures=[], - output_files=output_files, - allowed_dims=allowed_dims, + request=review_batches_mod.CollectBatchResultsRequest( + selected_indexes=selected_indexes, + failures=[], + output_files=output_files, + allowed_dims=allowed_dims, + ), extract_payload_fn=lambda raw: extract_json_payload(raw, log_fn=log), normalize_result_fn=lambda payload, dims: normalize_batch_result( payload, diff --git a/desloppify/app/commands/review/importing/cmd.py b/desloppify/app/commands/review/importing/cmd.py index fd38396c..903a7e4c 100644 --- a/desloppify/app/commands/review/importing/cmd.py +++ b/desloppify/app/commands/review/importing/cmd.py @@ -47,6 +47,7 @@ print_assessment_policy_notice, print_import_load_errors, ) +from ..state_payloads import append_assessment_import_audit from .policy import assessment_policy_model_from_payload from .parse import ( ImportPayloadLoadError, @@ -154,8 +155,8 @@ def _append_assessment_import_audit( return provenance = import_payload.get("provenance") provenance_dict = provenance if isinstance(provenance, dict) else {} - audit = working_state.setdefault("assessment_import_audit", []) - audit.append( + append_assessment_import_audit( + working_state, { "timestamp": utc_now(), "mode": assessment_policy.mode, diff --git a/desloppify/app/commands/review/importing/output.py b/desloppify/app/commands/review/importing/output.py index 28001461..cd82146f 100644 --- a/desloppify/app/commands/review/importing/output.py +++ b/desloppify/app/commands/review/importing/output.py @@ -308,8 +308,7 @@ def print_open_review_summary(state: StateModel, *, colorize_fn) -> str: return "desloppify scan" print( colorize_fn( - f"\n {len(open_review)} review work item{'s' if len(open_review) != 1 else ''} open total " - f"({len(open_review)} review work item{'s' if len(open_review) != 1 else ''} open total)", + f"\n {len(open_review)} review work item{'s' if len(open_review) != 1 else ''} open total", "bold", ) ) diff --git a/desloppify/app/commands/review/importing/plan_sync.py b/desloppify/app/commands/review/importing/plan_sync.py index 4adbc09f..d54ef012 100644 --- a/desloppify/app/commands/review/importing/plan_sync.py +++ b/desloppify/app/commands/review/importing/plan_sync.py @@ -28,6 +28,7 @@ ) from desloppify.engine._plan.sync.workflow_gates import sync_import_scores_needed from desloppify.engine._plan.sync.workflow import clear_score_communicated_sentinel +from desloppify.engine._plan.refresh_lifecycle import mark_subjective_review_completed from desloppify.engine.plan_triage import ( TRIAGE_CMD_RUN_STAGES_CLAUDE, TRIAGE_CMD_RUN_STAGES_CODEX, @@ -54,12 +55,29 @@ class _ImportSyncInputs: covered_ids: tuple[str, ...] +@dataclass(frozen=True) +class PlanImportSyncOutcome: + """Visible result of post-import plan synchronization.""" + + status: str + message: str | None = None + + +@dataclass(frozen=True) +class _ImportPlanTransition: + import_result: ReviewImportSyncResult | None + covered_pruned: list[str] + import_scores_result: object + reconcile_result: ReconcileResult + + def _print_review_import_sync( state: dict, result: ReviewImportSyncResult, *, workflow_injected: bool, triage_injected: bool, + outcome: PlanImportSyncOutcome, ) -> None: """Print summary of plan changes after review import sync.""" new_ids = result.new_ids @@ -72,6 +90,7 @@ def _print_review_import_sync( _print_review_import_footer( workflow_injected=workflow_injected, triage_injected=triage_injected, + outcome=outcome, ) @@ -118,14 +137,15 @@ def _print_review_import_footer( *, workflow_injected: bool, triage_injected: bool, + outcome: PlanImportSyncOutcome, ) -> None: print() - print( - colorize( - " Review queue sync completed. Workflow follow-up may be front-loaded.", - "dim", - ) - ) + status_line = " Review queue sync completed. Workflow follow-up may be front-loaded." + status_tone = "dim" + if outcome.status == "degraded" and outcome.message: + status_line = f" Review queue sync degraded: {outcome.message}" + status_tone = "yellow" + print(colorize(status_line, status_tone)) print() print(colorize(" View execution queue: desloppify plan queue", "dim")) print(colorize(" View newest first: desloppify plan queue --sort recent", "dim")) @@ -197,6 +217,67 @@ def _sync_review_delta( ) +def _apply_import_plan_transitions( + plan: dict, + state: dict, + *, + sync_inputs: _ImportSyncInputs, + assessment_mode: str, + trusted: bool, + import_file: str | None, + import_payload: NormalizedReviewImportPayload | None, + target_strict: float, + was_boundary_ready: bool, +) -> _ImportPlanTransition: + """Apply plan mutations driven by a review import before persistence/output.""" + import_result = _sync_review_delta(plan, state, sync_inputs) + covered_pruned = ( + _prune_covered_subjective_ids_from_plan(plan, covered_ids=sync_inputs.covered_ids) + if trusted + else [] + ) + import_scores_result = sync_import_scores_needed( + plan, + state, + assessment_mode=assessment_mode, + import_file=import_file, + import_payload=import_payload, + ) + if trusted: + clear_score_communicated_sentinel(plan) + if sync_inputs.covered_ids: + mark_subjective_review_completed( + plan, + scan_count=int(state.get("scan_count", 0) or 0), + ) + + reconcile_result = ReconcileResult() + if was_boundary_ready and ( + sync_inputs.has_review_issue_delta + or import_scores_result.changes + or (trusted and bool(sync_inputs.covered_ids)) + ): + reconcile_result = reconcile_plan(plan, state, target_strict=target_strict) + + if import_result is not None and covered_pruned: + import_result = ReviewImportSyncResult( + new_ids=import_result.new_ids, + added_to_queue=import_result.added_to_queue, + triage_injected=import_result.triage_injected, + stale_pruned_from_queue=import_result.stale_pruned_from_queue, + covered_subjective_pruned_from_queue=covered_pruned, + triage_injected_ids=import_result.triage_injected_ids, + triage_deferred=import_result.triage_deferred, + ) + + return _ImportPlanTransition( + import_result=import_result, + covered_pruned=covered_pruned, + import_scores_result=import_scores_result, + reconcile_result=reconcile_result, + ) + + def _prune_covered_subjective_ids_from_plan( plan: dict, *, @@ -248,6 +329,7 @@ def _append_review_import_sync_log( pipeline_result: ReconcileResult, *, covered_ids: tuple[str, ...], + outcome: PlanImportSyncOutcome, ) -> None: if not ( import_result is not None @@ -287,6 +369,8 @@ def _append_review_import_sync_log( "auto_cluster_changes": pipeline_result.auto_cluster_changes, "import_scores_injected": list(getattr(import_scores_result, "injected", []) or []), "import_scores_pruned": list(getattr(import_scores_result, "pruned", []) or []), + "sync_status": outcome.status, + "sync_message": outcome.message, }, ) @@ -297,7 +381,7 @@ def sync_plan_after_import( assessment_mode: str, *, request: PlanImportSyncRequest | None = None, -) -> None: +) -> PlanImportSyncOutcome: """Apply issue/workflow syncs after import in one load/save cycle.""" try: state_file = request.state_file if request is not None else None @@ -310,46 +394,28 @@ def sync_plan_after_import( if state_file is not None: plan_path = plan_path_for_state(Path(state_file)) if not has_living_plan(plan_path): - return + return PlanImportSyncOutcome(status="skipped") plan = load_plan(plan_path) sync_inputs = _build_import_sync_inputs(diff, import_payload) trusted = assessment_mode in {"trusted_internal", "attested_external"} was_boundary_ready = live_planned_queue_empty(plan) - import_result = _sync_review_delta(plan, state, sync_inputs) - covered_pruned = ( - _prune_covered_subjective_ids_from_plan(plan, covered_ids=sync_inputs.covered_ids) - if trusted - else [] - ) - import_scores_result = sync_import_scores_needed( + transition = _apply_import_plan_transitions( plan, state, + sync_inputs=sync_inputs, assessment_mode=assessment_mode, + trusted=trusted, import_file=import_file, import_payload=import_payload, + target_strict=target_strict, + was_boundary_ready=was_boundary_ready, ) - if trusted: - clear_score_communicated_sentinel(plan) - - result = ReconcileResult() - if was_boundary_ready and ( - sync_inputs.has_review_issue_delta - or import_scores_result.changes - or (trusted and bool(sync_inputs.covered_ids)) - ): - result = reconcile_plan(plan, state, target_strict=target_strict) - if import_result is not None and covered_pruned: - import_result = ReviewImportSyncResult( - new_ids=import_result.new_ids, - added_to_queue=import_result.added_to_queue, - triage_injected=import_result.triage_injected, - stale_pruned_from_queue=import_result.stale_pruned_from_queue, - covered_subjective_pruned_from_queue=covered_pruned, - triage_injected_ids=import_result.triage_injected_ids, - triage_deferred=import_result.triage_deferred, - ) + import_result = transition.import_result + covered_pruned = transition.covered_pruned + import_scores_result = transition.import_scores_result + result = transition.reconcile_result dirty = bool( import_result is not None @@ -357,6 +423,7 @@ def sync_plan_after_import( or import_scores_result.changes or result.dirty ) + outcome = PlanImportSyncOutcome(status="synced") if dirty: _append_review_import_sync_log( plan, @@ -365,6 +432,7 @@ def sync_plan_after_import( import_scores_result, result, covered_ids=sync_inputs.covered_ids, + outcome=outcome, ) save_plan(plan, plan_path) @@ -374,15 +442,18 @@ def sync_plan_after_import( import_result, workflow_injected=bool(result.workflow_injected_ids), triage_injected=bool(result.triage and result.triage.injected), + outcome=outcome, ) _print_workflow_injected_message(result.workflow_injected_ids) + return outcome except PLAN_LOAD_EXCEPTIONS as exc: - print( - colorize( - f" Note: skipped plan sync after review import ({exc}).", - "dim", - ) - ) + message = f"skipped plan sync after review import ({exc})" + print(colorize(f" Plan sync degraded: {message}.", "yellow")) + return PlanImportSyncOutcome(status="degraded", message=message) -__all__ = ["PlanImportSyncRequest", "sync_plan_after_import"] +__all__ = [ + "PlanImportSyncOutcome", + "PlanImportSyncRequest", + "sync_plan_after_import", +] diff --git a/desloppify/app/commands/review/runner_parallel/__init__.py b/desloppify/app/commands/review/runner_parallel/__init__.py index 5ee578e3..1a087de8 100644 --- a/desloppify/app/commands/review/runner_parallel/__init__.py +++ b/desloppify/app/commands/review/runner_parallel/__init__.py @@ -23,6 +23,7 @@ BatchResult, BatchTask, ) +from ..batch.execution import CollectBatchResultsRequest from ..runner_process_impl.io import extract_payload_from_log logger = logging.getLogger(__name__) @@ -96,16 +97,16 @@ def execute_batches( def collect_batch_results( *, - selected_indexes: list[int], - failures: list[int], - output_files: dict[int, Path], - allowed_dims: set[str], + request: CollectBatchResultsRequest, extract_payload_fn, normalize_result_fn, ) -> tuple[list[BatchResult], list[int]]: """Parse and normalize batch outputs, preserving prior failures.""" + selected_indexes = request.selected_indexes + output_files = request.output_files + allowed_dims = request.allowed_dims batch_results: list[BatchResult] = [] - failure_set = set(failures) + failure_set = set(request.failures) for idx in selected_indexes: had_execution_failure = idx in failure_set raw_path = output_files[idx] diff --git a/desloppify/app/commands/review/state_payloads.py b/desloppify/app/commands/review/state_payloads.py index 623a4b3c..7cbd69c1 100644 --- a/desloppify/app/commands/review/state_payloads.py +++ b/desloppify/app/commands/review/state_payloads.py @@ -4,6 +4,10 @@ from typing import TypedDict, cast +from desloppify.engine._state.schema_types_review import ( + AssessmentImportAuditEntry, +) + class SubjectiveAssessmentPayload(TypedDict, total=False): score: float @@ -19,19 +23,6 @@ class SubjectiveAssessmentPayload(TypedDict, total=False): component_scores: dict[str, float] -class AssessmentImportAuditEntry(TypedDict): - timestamp: str - mode: str - trusted: bool - reason: str - override_used: bool - attested_external: bool - provisional: bool - provisional_count: int - attest: str - import_file: str - - def subjective_assessment_store( state: dict, ) -> dict[str, SubjectiveAssessmentPayload]: diff --git a/desloppify/app/commands/scan/artifacts.py b/desloppify/app/commands/scan/artifacts.py index 054d19d2..002dddc5 100644 --- a/desloppify/app/commands/scan/artifacts.py +++ b/desloppify/app/commands/scan/artifacts.py @@ -2,11 +2,11 @@ from __future__ import annotations -import importlib import logging import os from pathlib import Path +from desloppify.app.commands.helpers.dynamic_loaders import load_optional_scorecard_module from desloppify.app.commands.scan.contracts import ScanQueryPayload from desloppify.app.commands.scan.workflow import ( ScanMergeResult, @@ -92,13 +92,12 @@ def build_scan_query_payload( def _load_scorecard_helpers(): - """Load scorecard helper callables lazily via importlib. + """Load scorecard helper callables lazily through the approved loader seam. Deferred: scorecard depends on PIL (optional dependency). """ - try: - scorecard_module = importlib.import_module("desloppify.app.output.scorecard") - except ImportError: + scorecard_module = load_optional_scorecard_module() + if scorecard_module is None: return None, None generate = getattr(scorecard_module, "generate_scorecard", None) badge_config = getattr(scorecard_module, "get_badge_config", None) diff --git a/desloppify/app/commands/scan/preflight.py b/desloppify/app/commands/scan/preflight.py index 4870ea96..b1d47815 100644 --- a/desloppify/app/commands/scan/preflight.py +++ b/desloppify/app/commands/scan/preflight.py @@ -16,10 +16,27 @@ from desloppify.base.output.terminal import colorize from desloppify.app.commands.resolve.plan_load import warn_plan_load_degraded_once from desloppify.engine._work_queue.context import resolve_plan_load_status +from desloppify.engine._plan.constants import WORKFLOW_RUN_SCAN_ID +from desloppify.engine.planning.queue_policy import build_execution_queue +from desloppify.engine._work_queue.core import QueueBuildOptions _logger = logging.getLogger(__name__) +def _only_run_scan_workflow_remaining(state: dict, plan: dict) -> bool: + result = build_execution_queue( + state, + options=QueueBuildOptions( + status="open", + count=None, + plan=plan, + include_skipped=False, + ), + ) + items = result.get("items", []) + return len(items) == 1 and items[0].get("id") == WORKFLOW_RUN_SCAN_ID + + def scan_queue_preflight(args: object) -> None: """Warn and gate scan when queue has unfinished items.""" # CI profile always passes @@ -79,6 +96,13 @@ def scan_queue_preflight(args: object) -> None: return if mode is ScoreDisplayMode.LIVE: return # Queue fully clear or no active cycle — scan allowed + if ( + mode is ScoreDisplayMode.PHASE_TRANSITION + and breakdown.queue_total == 1 + and breakdown.workflow == 1 + and _only_run_scan_workflow_remaining(state, plan) + ): + return remaining = breakdown.queue_total # GATE — block both FROZEN (objective work) and PHASE_TRANSITION diff --git a/desloppify/app/commands/scan/workflow.py b/desloppify/app/commands/scan/workflow.py index 6f289355..ceb37a6e 100644 --- a/desloppify/app/commands/scan/workflow.py +++ b/desloppify/app/commands/scan/workflow.py @@ -53,7 +53,7 @@ ) from desloppify.engine._work_queue.issues import mark_stale_holistic from desloppify.engine.planning.scan import PlanScanOptions, generate_issues as generate_plan_issues -from desloppify.intelligence.review.dimensions.metadata import ( +from desloppify.base.subjective_dimensions import ( resettable_default_dimensions, ) from desloppify.languages.framework import ( diff --git a/desloppify/engine/_plan/cluster_membership.py b/desloppify/engine/_plan/cluster_membership.py new file mode 100644 index 00000000..b1ba2ee0 --- /dev/null +++ b/desloppify/engine/_plan/cluster_membership.py @@ -0,0 +1,37 @@ +"""Canonical cluster membership helpers for persisted plan payloads.""" + +from __future__ import annotations + +from desloppify.engine.plan_state import Cluster + + +def cluster_issue_ids(cluster: Cluster | dict[str, object]) -> list[str]: + """Return the effective issue IDs for a cluster.""" + ordered: list[str] = [] + seen: set[str] = set() + + def _append(raw_ids: object) -> None: + if not isinstance(raw_ids, list): + return + for raw_id in raw_ids: + if not isinstance(raw_id, str): + continue + issue_id = raw_id.strip() + if not issue_id or issue_id in seen: + continue + seen.add(issue_id) + ordered.append(issue_id) + + _append(cluster.get("issue_ids")) + + steps = cluster.get("action_steps") + if isinstance(steps, list): + for step in steps: + if not isinstance(step, dict): + continue + _append(step.get("issue_refs")) + + return ordered + + +__all__ = ["cluster_issue_ids"] diff --git a/desloppify/engine/_plan/operations/cluster.py b/desloppify/engine/_plan/operations/cluster.py index 807fcd6b..1c9fd663 100644 --- a/desloppify/engine/_plan/operations/cluster.py +++ b/desloppify/engine/_plan/operations/cluster.py @@ -128,6 +128,7 @@ def remove_from_cluster( ensure_plan_defaults(plan) cluster = _cluster_or_raise(plan, cluster_name) member_ids: list[str] = cluster["issue_ids"] + removed_ids = set(issue_ids) now = utc_now() count = 0 for fid in issue_ids: @@ -141,6 +142,21 @@ def remove_from_cluster( timestamp=now, ) + steps = cluster.get("action_steps") + if isinstance(steps, list): + for step in steps: + if not isinstance(step, dict): + continue + refs = step.get("issue_refs") + if not isinstance(refs, list): + continue + filtered_refs = [ + ref for ref in refs + if isinstance(ref, str) and ref not in removed_ids + ] + if filtered_refs != refs: + step["issue_refs"] = filtered_refs + if count > 0 and cluster.get("auto"): cluster["user_modified"] = True diff --git a/desloppify/engine/_plan/refresh_lifecycle.py b/desloppify/engine/_plan/refresh_lifecycle.py index 4c97635b..86a5f693 100644 --- a/desloppify/engine/_plan/refresh_lifecycle.py +++ b/desloppify/engine/_plan/refresh_lifecycle.py @@ -9,6 +9,7 @@ from desloppify.engine._state.issue_semantics import counts_toward_objective_backlog _POSTFLIGHT_SCAN_KEY = "postflight_scan_completed_at_scan_count" +_SUBJECTIVE_REVIEW_KEY = "subjective_review_completed_at_scan_count" _LIFECYCLE_PHASE_KEY = "lifecycle_phase" LIFECYCLE_PHASE_REVIEW_INITIAL = "review_initial" @@ -145,6 +146,39 @@ def mark_postflight_scan_completed( return True +def subjective_review_completed_for_scan( + plan: PlanModel, + *, + scan_count: int | None, +) -> bool: + """Return True when postflight subjective review finished for *scan_count*.""" + refresh_state = plan.get("refresh_state") + if not isinstance(refresh_state, dict): + return False + try: + normalized_scan_count = int(scan_count or 0) + except (TypeError, ValueError): + normalized_scan_count = 0 + return refresh_state.get(_SUBJECTIVE_REVIEW_KEY) == normalized_scan_count + + +def mark_subjective_review_completed( + plan: PlanModel, + *, + scan_count: int | None, +) -> bool: + """Record that subjective review completed for the current postflight scan.""" + refresh_state = _refresh_state(plan) + try: + normalized_scan_count = int(scan_count or 0) + except (TypeError, ValueError): + normalized_scan_count = 0 + if refresh_state.get(_SUBJECTIVE_REVIEW_KEY) == normalized_scan_count: + return False + refresh_state[_SUBJECTIVE_REVIEW_KEY] = normalized_scan_count + return True + + def clear_postflight_scan_completion( plan: PlanModel, *, @@ -178,7 +212,9 @@ def clear_postflight_scan_completion( "LIFECYCLE_PHASE_WORKFLOW", "LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT", "mark_postflight_scan_completed", + "mark_subjective_review_completed", "postflight_scan_pending", + "subjective_review_completed_for_scan", "set_lifecycle_phase", "VALID_LIFECYCLE_PHASES", ] diff --git a/desloppify/engine/_plan/schema/__init__.py b/desloppify/engine/_plan/schema/__init__.py index 7d6fbbfa..ab859b06 100644 --- a/desloppify/engine/_plan/schema/__init__.py +++ b/desloppify/engine/_plan/schema/__init__.py @@ -44,6 +44,7 @@ class ActionStep(TypedDict, total=False): title: Required[str] # Short summary, 1 line detail: str # Long description, paragraphs OK issue_refs: list[str] # Issue ID suffixes this step addresses + effort: str # "trivial" | "small" | "medium" | "large" done: bool # Completion tracking (default False) @@ -68,6 +69,7 @@ class Cluster(TypedDict, total=False): dismissed: list[str] agent_safe: bool dependency_order: int + depends_on_clusters: list[str] action_steps: list[ActionStep] priority: int source_clusters: list[str] diff --git a/desloppify/engine/_plan/sync/pipeline.py b/desloppify/engine/_plan/sync/pipeline.py index f64ccdd8..8d0a959b 100644 --- a/desloppify/engine/_plan/sync/pipeline.py +++ b/desloppify/engine/_plan/sync/pipeline.py @@ -26,6 +26,7 @@ from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._plan.sync.workflow import ( ScoreSnapshot, + _subjective_review_current_for_cycle, sync_communicate_score_needed, sync_create_plan_needed, ) @@ -161,8 +162,12 @@ def reconcile_plan(plan: dict, state: dict, *, target_strict: float) -> Reconcil # scored and communicate-score hasn't fired yet this cycle. The phase # cleanup safety net still prunes if this peek is wrong. will_inject_workflow = ( - not policy.unscored_ids - and "previous_plan_start_scores" not in plan + "previous_plan_start_scores" not in plan + and _subjective_review_current_for_cycle( + plan, + state, + policy=policy, + ) ) if will_inject_workflow: result.subjective = QueueSyncResult() diff --git a/desloppify/engine/_plan/sync/workflow.py b/desloppify/engine/_plan/sync/workflow.py index b06a9879..d3894f29 100644 --- a/desloppify/engine/_plan/sync/workflow.py +++ b/desloppify/engine/_plan/sync/workflow.py @@ -6,6 +6,9 @@ from pathlib import Path from typing import Any +from desloppify.engine._plan.refresh_lifecycle import ( + subjective_review_completed_for_scan, +) from desloppify.engine._plan.policy import stale as stale_policy_mod from desloppify.engine._plan.constants import ( SUBJECTIVE_PREFIX, @@ -246,6 +249,38 @@ def _no_unscored( ) +def _subjective_review_current_for_cycle( + plan: PlanModel, + state: StateModel, + *, + policy: SubjectiveVisibility | None, +) -> bool: + """Return True when the current cycle no longer owes subjective review.""" + if not _no_unscored(state, policy): + return False + + refresh_state = _get_refresh_state(plan) + if refresh_state is None: + return True + + postflight_scan_count = refresh_state.get("postflight_scan_completed_at_scan_count") + try: + current_scan_count = int(state.get("scan_count", 0) or 0) + except (TypeError, ValueError): + current_scan_count = 0 + + if postflight_scan_count != current_scan_count: + return True + + if subjective_review_completed_for_scan(plan, scan_count=current_scan_count): + return True + + if policy is not None: + return not (policy.stale_ids or policy.under_target_ids) + + return True + + def _inject(plan: PlanModel, item_id: str) -> QueueSyncResult: """Inject *item_id* into the workflow prefix and clear stale skip entries.""" order = plan["queue_order"] @@ -318,7 +353,7 @@ def sync_create_plan_needed( return _EMPTY() if any(sid in order for sid in TRIAGE_IDS): return _EMPTY() - if not _no_unscored(state, policy): + if not _subjective_review_current_for_cycle(plan, state, policy=policy): return _EMPTY() if not has_objective_backlog(state, policy): @@ -433,7 +468,7 @@ def sync_communicate_score_needed( # at injection time and cleared at cycle boundaries. if "previous_plan_start_scores" in plan: return _EMPTY() - if not _no_unscored(state, policy): + if not _subjective_review_current_for_cycle(plan, state, policy=policy): return _EMPTY() if current_scores is not None: diff --git a/desloppify/engine/_plan/triage/prompt.py b/desloppify/engine/_plan/triage/prompt.py index 2774d92a..0284df18 100644 --- a/desloppify/engine/_plan/triage/prompt.py +++ b/desloppify/engine/_plan/triage/prompt.py @@ -33,6 +33,7 @@ class TriageInput: triage_version: int # next version number resolved_issues: dict[str, dict] # full issue objects for resolved IDs completed_clusters: list[dict] # clusters completed since last triage + value_check_targets: list[str] | None def __init__( self, @@ -48,6 +49,7 @@ def __init__( triage_version: int, resolved_issues: dict[str, dict], completed_clusters: list[dict], + value_check_targets: list[str] | None = None, open_issues: dict[str, dict] | None = None, mechanical_issues: dict[str, dict] | None = None, ) -> None: @@ -77,6 +79,7 @@ def __init__( self.triage_version = triage_version self.resolved_issues = resolved_issues self.completed_clusters = completed_clusters + self.value_check_targets = value_check_targets @property def open_issues(self) -> dict[str, dict]: diff --git a/desloppify/engine/_plan/triage/snapshot.py b/desloppify/engine/_plan/triage/snapshot.py index 66457f99..a11589f4 100644 --- a/desloppify/engine/_plan/triage/snapshot.py +++ b/desloppify/engine/_plan/triage/snapshot.py @@ -4,6 +4,7 @@ from dataclasses import dataclass +from desloppify.engine._plan.cluster_membership import cluster_issue_ids from desloppify.engine._plan.constants import TRIAGE_IDS, is_synthetic_id from desloppify.engine._plan.policy.stale import open_review_ids from desloppify.engine._plan.schema import Cluster, PlanModel @@ -11,6 +12,9 @@ from desloppify.engine._state.schema import StateModel +_cluster_issue_ids = cluster_issue_ids + + def _normalized_issue_id_list(raw_ids: object) -> list[str]: normalized: list[str] = [] seen: set[str] = set() @@ -27,32 +31,6 @@ def _normalized_issue_id_list(raw_ids: object) -> list[str]: return normalized -def _cluster_issue_ids(cluster: Cluster) -> list[str]: - ordered: list[str] = [] - seen: set[str] = set() - - def _append(raw_ids: object) -> None: - if not isinstance(raw_ids, list): - return - for raw_id in raw_ids: - if not isinstance(raw_id, str): - continue - issue_id = raw_id.strip() - if not issue_id or issue_id in seen: - continue - seen.add(issue_id) - ordered.append(issue_id) - - _append(cluster.get("issue_ids")) - steps = cluster.get("action_steps") - if steps is not None: - for step in steps: - if not isinstance(step, dict): - continue - _append(step.get("issue_refs")) - return ordered - - def plan_review_ids(plan: PlanModel) -> list[str]: """Return review/concerns IDs currently represented in queue_order.""" return [ @@ -146,14 +124,14 @@ def manual_clusters_with_issues(plan: PlanModel) -> list[str]: return [ name for name, cluster in plan.get("clusters", {}).items() - if _cluster_issue_ids(cluster) and not cluster.get("auto") + if cluster_issue_ids(cluster) and not cluster.get("auto") ] def find_cluster_for(issue_id: str, clusters: dict[str, Cluster]) -> str | None: """Return the owning cluster name for an issue ID, if any.""" for name, cluster in clusters.items(): - if issue_id in _cluster_issue_ids(cluster): + if issue_id in cluster_issue_ids(cluster): return name return None diff --git a/desloppify/engine/_scoring/subjective/core.py b/desloppify/engine/_scoring/subjective/core.py index 87aae68f..ca7ed9c6 100644 --- a/desloppify/engine/_scoring/subjective/core.py +++ b/desloppify/engine/_scoring/subjective/core.py @@ -3,16 +3,14 @@ from __future__ import annotations from desloppify.base.subjective_dimension_catalog import DISPLAY_NAMES -from desloppify.base.subjective_dimensions import default_dimension_keys +from desloppify.base.subjective_dimensions import ( + default_dimension_keys, + dimension_display_name, + dimension_weight, +) from desloppify.base.text_utils import is_numeric from desloppify.engine._scoring.policy.core import SUBJECTIVE_CHECKS from desloppify.engine._state.issue_semantics import is_triage_finding -from desloppify.intelligence.review.dimensions.metadata import ( - dimension_display_name as metadata_dimension_display_name, -) -from desloppify.intelligence.review.dimensions.metadata import ( - dimension_weight as metadata_dimension_weight, -) def _display_fallback(dim_name: str) -> str: @@ -42,11 +40,11 @@ def _primary_lang_from_issues(issues: dict) -> str | None: def _dimension_display_name(dim_name: str, *, lang_name: str | None) -> str: - return str(metadata_dimension_display_name(dim_name, lang_name=lang_name)) + return str(dimension_display_name(dim_name, lang_name=lang_name)) def _dimension_weight(dim_name: str, *, lang_name: str | None) -> float: - return float(metadata_dimension_weight(dim_name, lang_name=lang_name)) + return float(dimension_weight(dim_name, lang_name=lang_name)) def _compute_dimension_score( diff --git a/desloppify/engine/_state/merge.py b/desloppify/engine/_state/merge.py index fecaec6b..406a60df 100644 --- a/desloppify/engine/_state/merge.py +++ b/desloppify/engine/_state/merge.py @@ -38,11 +38,48 @@ from desloppify.base.registry import get_detector_meta +def _latest_trusted_assessment_import_timestamp(state: StateModel) -> str: + """Return the newest trusted assessment-import timestamp, if present.""" + for raw_entry in reversed(state.get("assessment_import_audit", []) or []): + if not isinstance(raw_entry, dict): + continue + if raw_entry.get("mode") not in {"trusted_internal", "attested_external"}: + continue + timestamp = str(raw_entry.get("timestamp", "")).strip() + if timestamp: + return timestamp + return "" + + +def _preserve_fresh_assessment_on_reconcile( + payload: dict[str, Any], + *, + previous_last_scan: str, + latest_trusted_import_ts: str, +) -> bool: + """Suppress immediate re-staling after a fresh trusted review import. + + A scan that runs directly after a trusted review import is reconciling the + issue inventory up to the code state that was just reviewed. If the + assessment was imported after the previous scan, we should not immediately + invalidate it based on that older scan delta. + """ + if previous_last_scan == "" or latest_trusted_import_ts == "": + return False + if latest_trusted_import_ts <= previous_last_scan: + return False + assessed_at = str(payload.get("assessed_at", "")).strip() + if assessed_at == "": + return False + return assessed_at >= latest_trusted_import_ts + + def _mark_stale_on_mechanical_change( state: StateModel, *, changed_detectors: set[str], now: str, + previous_last_scan: str, ) -> None: """Mark subjective assessments stale when mechanical issues change. @@ -74,6 +111,7 @@ def _mark_stale_on_mechanical_change( if not affected_dims: return + latest_trusted_import_ts = _latest_trusted_assessment_import_timestamp(state) for dimension in sorted(affected_dims): if dimension not in assessments: continue @@ -83,6 +121,12 @@ def _mark_stale_on_mechanical_change( # Don't overwrite if already stale if payload.get("needs_review_refresh"): continue + if _preserve_fresh_assessment_on_reconcile( + payload, + previous_last_scan=previous_last_scan, + latest_trusted_import_ts=latest_trusted_import_ts, + ): + continue payload["needs_review_refresh"] = True payload["refresh_reason"] = "mechanical_issues_changed" payload["stale_since"] = now @@ -117,6 +161,7 @@ def merge_scan( ensure_work_item_semantics(issue) resolved_options = options or MergeScanOptions() + previous_last_scan = str(state.get("last_scan", "") or "") now = utc_now() _record_scan_metadata( state, @@ -178,7 +223,10 @@ def merge_scan( changed_detectors = upsert_changed | resolve_changed if changed_detectors: _mark_stale_on_mechanical_change( - state, changed_detectors=changed_detectors, now=now, + state, + changed_detectors=changed_detectors, + now=now, + previous_last_scan=previous_last_scan, ) _recompute_stats( diff --git a/desloppify/engine/_work_queue/plan_order.py b/desloppify/engine/_work_queue/plan_order.py index f2ea3f96..61e69d9f 100644 --- a/desloppify/engine/_work_queue/plan_order.py +++ b/desloppify/engine/_work_queue/plan_order.py @@ -4,6 +4,7 @@ from typing import Any +from desloppify.engine._plan.cluster_membership import cluster_issue_ids from desloppify.engine._plan.cluster_semantics import ( cluster_autofix_hint, infer_cluster_action_type, @@ -17,15 +18,6 @@ from desloppify.engine._work_queue.types import WorkQueueItem from desloppify.state_io import StateModel - -def _cluster_issue_ids(cluster: dict[str, Any]) -> list[str]: - """Return canonical cluster members after plan-load normalization.""" - issue_ids = cluster.get("issue_ids", []) - if not isinstance(issue_ids, list): - return [] - return [issue_id for issue_id in issue_ids if isinstance(issue_id, str) and issue_id] - - def new_item_ids(state: StateModel) -> set[str]: """Return issue IDs added in the most recent scan.""" scan_history = state.get("scan_history", []) @@ -60,7 +52,7 @@ def enrich_plan_metadata(items: list[WorkQueueItem], plan: dict) -> None: item["plan_cluster"] = { "name": cluster_name, "description": cluster_data.get("description"), - "total_items": len(_cluster_issue_ids(cluster_data)), + "total_items": len(cluster_issue_ids(cluster_data)), "action_steps": cluster_data.get("action_steps") or [], } @@ -122,7 +114,7 @@ def filter_cluster_focus( return items clusters: dict = plan.get("clusters", {}) cluster_data = clusters.get(effective_cluster, {}) - cluster_member_ids = set(_cluster_issue_ids(cluster_data)) + cluster_member_ids = set(cluster_issue_ids(cluster_data)) if not cluster_member_ids: return items return [item for item in items if item["id"] in cluster_member_ids] @@ -153,7 +145,7 @@ def _build_cluster_meta( action_type = infer_cluster_action_type(cluster_data, detector=detector) stored_desc = cluster_data.get("description") or "" - total_in_cluster = len(_cluster_issue_ids(cluster_data)) + total_in_cluster = len(cluster_issue_ids(cluster_data)) if stored_desc and total_in_cluster != len(members): summary = stored_desc.replace(str(total_in_cluster), str(len(members))) else: @@ -208,7 +200,7 @@ def collapse_clusters(items: list[WorkQueueItem], plan: dict) -> list[WorkQueueI fid_to_cluster: dict[str, str] = {} for name, cluster in clusters.items(): - for issue_id in _cluster_issue_ids(cluster): + for issue_id in cluster_issue_ids(cluster): # Manual clusters take priority when an issue is in both if issue_id not in fid_to_cluster or not cluster.get("auto"): fid_to_cluster[issue_id] = name diff --git a/desloppify/engine/_work_queue/snapshot.py b/desloppify/engine/_work_queue/snapshot.py index c185f6ef..f661c97c 100644 --- a/desloppify/engine/_work_queue/snapshot.py +++ b/desloppify/engine/_work_queue/snapshot.py @@ -318,7 +318,21 @@ def _phase_for_snapshot( ) -> str: raw_phase = _raw_persisted_phase(plan) + ordered_postflight_phase = _ordered_postflight_phase( + postflight_assessment_items=postflight_assessment_items, + postflight_review_items=postflight_review_items, + postflight_workflow_items=postflight_workflow_items, + triage_items=triage_items, + ) + # ── Fine-grained persisted phase: trust it if items match ── + if raw_phase in { + PHASE_ASSESSMENT_POSTFLIGHT, + PHASE_REVIEW_POSTFLIGHT, + PHASE_WORKFLOW_POSTFLIGHT, + PHASE_TRIAGE_POSTFLIGHT, + } and ordered_postflight_phase is not None: + return ordered_postflight_phase if raw_phase in _FINE_GRAINED_ITEM_MAP: items_key = _FINE_GRAINED_ITEM_MAP[raw_phase] items = locals().get(items_key) if items_key else None @@ -345,6 +359,25 @@ def _phase_for_snapshot( ) +def _ordered_postflight_phase( + *, + postflight_assessment_items: list[WorkQueueItem], + postflight_review_items: list[WorkQueueItem], + postflight_workflow_items: list[WorkQueueItem], + triage_items: list[WorkQueueItem], +) -> str | None: + """Return the earliest active postflight phase in fixed sequence order.""" + if postflight_assessment_items: + return PHASE_ASSESSMENT_POSTFLIGHT + if postflight_workflow_items: + return PHASE_WORKFLOW_POSTFLIGHT + if triage_items: + return PHASE_TRIAGE_POSTFLIGHT + if postflight_review_items: + return PHASE_REVIEW_POSTFLIGHT + return None + + def _legacy_phase_inference( plan: dict | None, *, @@ -408,8 +441,6 @@ def _legacy_phase_inference( return PHASE_ASSESSMENT_POSTFLIGHT if postflight_workflow_items: return PHASE_WORKFLOW_POSTFLIGHT - if triage_items and review_backlog_present: - return PHASE_TRIAGE_POSTFLIGHT if undispositioned_review_backlog_present and postflight_review_items: return PHASE_REVIEW_POSTFLIGHT if explicit_queue_items: diff --git a/desloppify/engine/_work_queue/synthetic.py b/desloppify/engine/_work_queue/synthetic.py index 4e16e2f6..e7997d7b 100644 --- a/desloppify/engine/_work_queue/synthetic.py +++ b/desloppify/engine/_work_queue/synthetic.py @@ -29,12 +29,15 @@ confirmed_triage_stage_names, recorded_unconfirmed_triage_stage_names, ) +from desloppify.engine._plan.triage.snapshot import build_triage_snapshot from desloppify.engine._plan.refresh_lifecycle import ( + LIFECYCLE_PHASE_REVIEW_INITIAL, LIFECYCLE_PHASE_TRIAGE, LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT, LIFECYCLE_PHASE_WORKFLOW, LIFECYCLE_PHASE_WORKFLOW_POSTFLIGHT, current_lifecycle_phase, + subjective_review_completed_for_scan, ) from desloppify.engine.plan_triage import ( TRIAGE_IDS, @@ -131,6 +134,16 @@ def build_triage_stage_items(plan: dict, state: dict) -> list[WorkQueueItem]: if sid in present_ids } present_names.update(recorded_unconfirmed) + triage_snapshot = build_triage_snapshot(plan, state) + recovery_needed = ( + not present_names + and bool(triage_snapshot.live_open_ids) + and triage_snapshot.triage_has_run + and triage_snapshot.is_triage_stale + ) + if recovery_needed: + present_names = {name for name, _sid in TRIAGE_STAGE_SPECS} + confirmed = set() if not present_names: return [] @@ -228,6 +241,20 @@ def build_subjective_items( if latest_trusted_audit_ts: break current_phase = current_lifecycle_phase(plan) if isinstance(plan, dict) else None + current_scan_count = int(state.get("scan_count", 0) or 0) + postflight_scan_completed_this_scan = False + if isinstance(plan, dict): + refresh_state = plan.get("refresh_state") + if isinstance(refresh_state, dict): + postflight_scan_completed_this_scan = ( + refresh_state.get("postflight_scan_completed_at_scan_count") + == current_scan_count + ) + review_completed_this_scan = ( + subjective_review_completed_for_scan(plan, scan_count=current_scan_count) + if isinstance(plan, dict) + else False + ) def _suppressed_same_cycle_refresh(dimension_key: str, *, stale: bool) -> bool: if not stale or latest_trusted_audit_ts == "": @@ -281,15 +308,23 @@ def _prepare_command( or (strict_val <= 0.0 and int(entry.get("failing", 0)) == 0) ) is_stale = bool(entry.get("stale")) - if not is_unassessed and not is_stale: + is_below_target = strict_val < threshold + needs_review = ( + is_unassessed + or is_stale + or ( + is_below_target + and postflight_scan_completed_this_scan + and current_phase != LIFECYCLE_PHASE_REVIEW_INITIAL + and not review_completed_this_scan + ) + ) + if not needs_review: continue if _suppressed_same_cycle_refresh(dim_key, stale=is_stale): continue - if strict_val >= threshold: + if not is_below_target and not is_unassessed: continue - # Live subjective work is limited to never-reviewed or explicitly - # stale dimensions. Fresh under-target scores remain advisory data, - # not active queue items. # If review issues already exist for this dimension, triage/fix them # before suggesting another review refresh pass. if open_review > 0: diff --git a/desloppify/engine/_work_queue/types.py b/desloppify/engine/_work_queue/types.py index 9efa5ead..995ef413 100644 --- a/desloppify/engine/_work_queue/types.py +++ b/desloppify/engine/_work_queue/types.py @@ -4,6 +4,8 @@ from typing import Any, Literal, TypeAlias, TypedDict +from desloppify.engine.plan_state import ActionStep + QueueItemKind: TypeAlias = Literal[ "issue", "cluster", @@ -19,7 +21,7 @@ class PlanClusterRef(TypedDict, total=False): name: str description: str | None total_items: int - action_steps: list[dict[str, Any]] + action_steps: list[ActionStep] class QueueItemBase(TypedDict): @@ -189,7 +191,7 @@ class SerializedQueueItem(TypedDict, total=False): members_sample_limit: int autofix_hint: str execution_policy: str - action_steps: list[dict[str, Any]] + action_steps: list[ActionStep] WorkQueueItem: TypeAlias = ( diff --git a/desloppify/engine/hook_registry.py b/desloppify/engine/hook_registry.py index 8626cea4..113ae2e8 100644 --- a/desloppify/engine/hook_registry.py +++ b/desloppify/engine/hook_registry.py @@ -1,4 +1,4 @@ -"""Registry for optional language hook modules consumed by detectors.""" +"""Registry accessors for optional language hook modules consumed by detectors.""" from __future__ import annotations @@ -17,24 +17,20 @@ def register_lang_hooks( test_coverage: object | None = None, ) -> None: """Register optional detector hook modules for a language.""" - if test_coverage is not None: - registry_state.register_hook(lang_name, "test_coverage", test_coverage) + registry_state.register_lang_hooks( + lang_name, + test_coverage=test_coverage, + ) def _bootstrap_language_module(module: object) -> None: - """Run optional language-module bootstrap hook(s). - - Preference order: - 1) ``register_hooks`` (hook-only bootstrap, no language registry mutation) - 2) ``register`` (legacy fallback) - """ + """Run optional language-module bootstrap hook(s).""" register_hooks_fn = getattr(module, "register_hooks", None) if register_hooks_fn is not None: if not callable(register_hooks_fn): raise TypeError("Language module register_hooks entrypoint must be callable") register_hooks_fn() return - register_fn = getattr(module, "register", None) if register_fn is None: return @@ -43,54 +39,29 @@ def _bootstrap_language_module(module: object) -> None: register_fn() -def _load_language_module(module_name: str) -> object: - """Resolve language module from sys.modules or import it lazily.""" - module = sys.modules.get(module_name) - if module is not None: - return module - return importlib.import_module(module_name) - - -def _get_lang_hook( +def get_lang_hook( lang_name: str | None, hook_name: str, ) -> object | None: + """Get a previously-registered language hook module, lazy-loading if needed.""" if not lang_name: return None hook = registry_state.get_hook(lang_name, hook_name) if hook is not None: return hook + # Lazy bootstrap: import the language module and run its registration. module_name = f"desloppify.languages.{lang_name}" try: - module = _load_language_module(module_name) - except (ImportError, ValueError, TypeError, RuntimeError, OSError) as exc: - logger.debug( - "Unable to import language hook package %s: %s", lang_name, exc - ) - return None - - # Re-run explicit register() entrypoint to repopulate hook state after - # registry clears in tests/refresh flows. Avoid module reload side effects. - try: + module = sys.modules.get(module_name) or importlib.import_module(module_name) _bootstrap_language_module(module) except (ImportError, ValueError, TypeError, RuntimeError, OSError) as exc: - logger.debug( - "Unable to bootstrap language hook package %s: %s", lang_name, exc - ) + logger.debug("Unable to bootstrap language hooks for %s: %s", lang_name, exc) return None return registry_state.get_hook(lang_name, hook_name) -def get_lang_hook( - lang_name: str | None, - hook_name: str, -) -> object | None: - """Get a previously-registered language hook module.""" - return _get_lang_hook(lang_name, hook_name) - - def clear_lang_hooks() -> None: """Clear registered language hooks.""" registry_state.clear_hooks() diff --git a/desloppify/engine/plan_state.py b/desloppify/engine/plan_state.py index f00125bc..64fd3ce7 100644 --- a/desloppify/engine/plan_state.py +++ b/desloppify/engine/plan_state.py @@ -35,6 +35,7 @@ ) from desloppify.engine._plan.schema import ( ActionStep, + EpicTriageMeta, EPIC_PREFIX, PLAN_VERSION, VALID_EPIC_DIRECTIONS, @@ -57,6 +58,7 @@ "Cluster", "CommitRecord", "EPIC_PREFIX", + "EpicTriageMeta", "ExecutionLogEntry", "ItemOverride", "PLAN_FILE", diff --git a/desloppify/intelligence/review/context.py b/desloppify/intelligence/review/context.py index 31f31670..4e36e23b 100644 --- a/desloppify/intelligence/review/context.py +++ b/desloppify/intelligence/review/context.py @@ -27,7 +27,10 @@ from desloppify.intelligence.review.context_signals.migration import ( classify_error_strategy, ) -from desloppify.intelligence.review.context_builder import build_review_context_inner +from desloppify.intelligence.review.context_builder import ( + ReviewContextBuildServices, + build_review_context_inner, +) # ── Shared helpers ──────────────────────────────────────────────── @@ -101,18 +104,20 @@ def build_review_context( lang, state, ctx, - read_file_text_fn=read_file_text, - abs_path_fn=abs_path, - rel_fn=rel, - importer_count_fn=importer_count, - default_review_module_patterns_fn=default_review_module_patterns, - func_name_re=FUNC_NAME_RE, - class_name_re=CLASS_NAME_RE, - name_prefix_re=NAME_PREFIX_RE, - error_patterns=ERROR_PATTERNS, - gather_ai_debt_signals_fn=gather_ai_debt_signals, - gather_auth_context_fn=gather_auth_context, - classify_error_strategy_fn=classify_error_strategy, + ReviewContextBuildServices( + read_file_text=read_file_text, + abs_path=abs_path, + rel_path=rel, + importer_count=importer_count, + default_review_module_patterns=default_review_module_patterns, + gather_ai_debt_signals=gather_ai_debt_signals, + gather_auth_context=gather_auth_context, + classify_error_strategy=classify_error_strategy, + func_name_re=FUNC_NAME_RE, + class_name_re=CLASS_NAME_RE, + name_prefix_re=NAME_PREFIX_RE, + error_patterns=ERROR_PATTERNS, + ), ) finally: if not already_cached: diff --git a/desloppify/intelligence/review/context_builder.py b/desloppify/intelligence/review/context_builder.py index 637740c6..7a1fac4a 100644 --- a/desloppify/intelligence/review/context_builder.py +++ b/desloppify/intelligence/review/context_builder.py @@ -4,44 +4,54 @@ import re from collections import Counter +from collections.abc import Callable +from dataclasses import dataclass from pathlib import Path from desloppify.engine._state.schema import StateModel from desloppify.intelligence.review._context.models import ReviewContext +@dataclass(frozen=True) +class ReviewContextBuildServices: + """Typed dependency bundle for review-context assembly.""" + + read_file_text: Callable[[str], str | None] + abs_path: Callable[[str], str] + rel_path: Callable[[str], str] + importer_count: Callable[[dict[str, object]], int] + default_review_module_patterns: Callable[[str], list[str] | tuple[str, ...] | set[str]] + gather_ai_debt_signals: Callable[..., dict[str, object]] + gather_auth_context: Callable[..., dict[str, object]] + classify_error_strategy: Callable[[str], str] + func_name_re: re.Pattern[str] + class_name_re: re.Pattern[str] + name_prefix_re: re.Pattern[str] + error_patterns: dict[str, re.Pattern[str]] + + def build_review_context_inner( files: list[str], lang: object, state: StateModel, ctx: ReviewContext, - *, - read_file_text_fn, - abs_path_fn, - rel_fn, - importer_count_fn, - default_review_module_patterns_fn, - func_name_re, - class_name_re, - name_prefix_re, - error_patterns: dict[str, re.Pattern[str]], - gather_ai_debt_signals_fn, - gather_auth_context_fn, - classify_error_strategy_fn, + services: ReviewContextBuildServices, ) -> ReviewContext: """Inner context builder (runs with file cache enabled).""" file_contents: dict[str, str] = {} for filepath in files: - content = read_file_text_fn(abs_path_fn(filepath)) + content = services.read_file_text(services.abs_path(filepath)) if content is not None: file_contents[filepath] = content prefix_counter: Counter = Counter() total_names = 0 for content in file_contents.values(): - for name in func_name_re.findall(content) + class_name_re.findall(content): + for name in services.func_name_re.findall(content) + services.class_name_re.findall( + content + ): total_names += 1 - match = name_prefix_re.match(name) + match = services.name_prefix_re.match(name) if match: prefix_counter[match.group(1)] += 1 ctx.naming_vocabulary = { @@ -51,7 +61,7 @@ def build_review_context_inner( error_counts: Counter = Counter() for content in file_contents.values(): - for pattern_name, pattern in error_patterns.items(): + for pattern_name, pattern in services.error_patterns.items(): if pattern.search(content): error_counts[pattern_name] += 1 ctx.error_conventions = dict(error_counts) @@ -59,7 +69,7 @@ def build_review_context_inner( dir_patterns: dict[str, Counter] = {} module_pattern_fn = getattr(lang, "review_module_patterns_fn", None) if not callable(module_pattern_fn): - module_pattern_fn = default_review_module_patterns_fn + module_pattern_fn = services.default_review_module_patterns for filepath, content in file_contents.items(): parts = Path(filepath).parts if len(parts) < 2: @@ -68,7 +78,7 @@ def build_review_context_inner( counter = dir_patterns.setdefault(dir_name, Counter()) pattern_names = module_pattern_fn(content) if not isinstance(pattern_names, list | tuple | set): - pattern_names = default_review_module_patterns_fn(content) + pattern_names = services.default_review_module_patterns(content) for pattern_name in pattern_names: counter[pattern_name] += 1 if re.search(r"\bclass\s+\w+", content): @@ -83,9 +93,9 @@ def build_review_context_inner( graph = lang.dep_graph importer_counts = {} for filepath, entry in graph.items(): - count = importer_count_fn(entry) + count = services.importer_count(entry) if count > 0: - importer_counts[rel_fn(filepath)] = count + importer_counts[services.rel_path(filepath)] = count top = sorted(importer_counts.items(), key=lambda item: -item[1])[:20] ctx.import_graph_summary = {"top_imported": dict(top)} @@ -93,7 +103,7 @@ def build_review_context_inner( ctx.zone_distribution = lang.zone_map.counts() allowed_review_files = { - rel_fn(filepath) + services.rel_path(filepath) for filepath in file_contents if isinstance(filepath, str) and filepath } @@ -105,7 +115,7 @@ def build_review_context_inner( issue_file_raw = issue.get("file", "") if not isinstance(issue_file_raw, str) or not issue_file_raw: continue - issue_file = rel_fn(issue_file_raw) + issue_file = services.rel_path(issue_file_raw) if issue_file not in allowed_review_files: continue by_file.setdefault(issue_file, []).append( @@ -133,8 +143,8 @@ def build_review_context_inner( continue dir_name = parts[-2] + "/" counter = dir_functions.setdefault(dir_name, Counter()) - for name in func_name_re.findall(content): - match = name_prefix_re.match(name) + for name in services.func_name_re.findall(content): + match = services.name_prefix_re.match(name) if match: counter[match.group(1)] += 1 ctx.sibling_conventions = { @@ -143,14 +153,20 @@ def build_review_context_inner( if sum(c.values()) >= 3 } - ctx.ai_debt_signals = gather_ai_debt_signals_fn(file_contents, rel_fn=rel_fn) - ctx.auth_patterns = gather_auth_context_fn(file_contents, rel_fn=rel_fn) + ctx.ai_debt_signals = services.gather_ai_debt_signals( + file_contents, + rel_fn=services.rel_path, + ) + ctx.auth_patterns = services.gather_auth_context( + file_contents, + rel_fn=services.rel_path, + ) strategies: dict[str, str] = {} for filepath, content in file_contents.items(): - strategy = classify_error_strategy_fn(content) + strategy = services.classify_error_strategy(content) if strategy: - strategies[rel_fn(filepath)] = strategy + strategies[services.rel_path(filepath)] = strategy ctx.error_strategies = strategies ctx.normalize_sections(strict=True) @@ -158,5 +174,6 @@ def build_review_context_inner( __all__ = [ + "ReviewContextBuildServices", "build_review_context_inner", ] diff --git a/desloppify/intelligence/review/context_signals/auth.py b/desloppify/intelligence/review/context_signals/auth.py index 9b27b009..d7f11378 100644 --- a/desloppify/intelligence/review/context_signals/auth.py +++ b/desloppify/intelligence/review/context_signals/auth.py @@ -65,6 +65,27 @@ ".tsx", } ) +_NON_RUNTIME_AUTH_SEGMENTS = frozenset( + { + "doc", + "docs", + "example", + "examples", + "guide", + "guidance", + "prompt", + "prompts", + "template", + "templates", + } +) +_NON_RUNTIME_AUTH_BASENAMES = ( + "agents", + "prompt", + "prompts", + "query", + "readme", +) # Table name pattern: matches unquoted, "double-quoted", `backtick`, or [bracket] names, # optionally preceded by a schema qualifier (e.g. public.users, "auth"."profiles"). _SQL_IDENT = r'(?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+)' @@ -276,10 +297,29 @@ def _segment_has_auth_enforcement(segment: str) -> bool: return bool(_NEGATED_AUTH_BRANCH_RE.search(segment) and _AUTH_DENIAL_RE.search(segment)) +def is_auth_runtime_path(filepath: str) -> bool: + """Return True when a path looks like executable auth-bearing source.""" + lower = filepath.lower().replace("\\", "/") + if not any(lower.endswith(ext) for ext in _AUTH_SOURCE_EXTENSIONS): + return False + parts = [part for part in lower.split("/") if part] + if any(part in _NON_RUNTIME_AUTH_SEGMENTS for part in parts[:-1]): + return False + basename = parts[-1] if parts else lower + stem, _, _ext = basename.partition(".") + if stem in _NON_RUNTIME_AUTH_BASENAMES: + return False + return True + + def _is_auth_source_file(filepath: str) -> bool: - """Return True when a file path should be scanned for executable auth signals.""" - lower = filepath.lower() - return any(lower.endswith(ext) for ext in _AUTH_SOURCE_EXTENSIONS) + """Backward-compatible wrapper for auth runtime-path filtering.""" + return is_auth_runtime_path(filepath) -__all__ = ["AuthorizationSignals", "RouteAuthCoverage", "gather_auth_context"] +__all__ = [ + "AuthorizationSignals", + "RouteAuthCoverage", + "gather_auth_context", + "is_auth_runtime_path", +] diff --git a/desloppify/intelligence/review/importing/payload.py b/desloppify/intelligence/review/importing/payload.py index a92d24d0..22be877a 100644 --- a/desloppify/intelligence/review/importing/payload.py +++ b/desloppify/intelligence/review/importing/payload.py @@ -79,15 +79,9 @@ def parse_review_import_payload( if not isinstance(data, dict): raise ValueError(f"{mode_name} review import payload must be a JSON object") - missing_issues_error = f"{mode_name} review import payload must contain 'issues'" - key_error = normalize_legacy_findings_alias( - data, - missing_issues_error=missing_issues_error, - ) - if key_error is not None: - raise ValueError(key_error) - issues_list = data.get("issues") + if issues_list is None: + raise ValueError(f"{mode_name} review import payload must contain 'issues'") if not isinstance(issues_list, list): raise ValueError(f"{mode_name} review import payload 'issues' must be a list") for idx, entry in enumerate(issues_list): diff --git a/desloppify/intelligence/review/prepare_batches_collectors_structure.py b/desloppify/intelligence/review/prepare_batches_collectors_structure.py index 28190c41..7d255785 100644 --- a/desloppify/intelligence/review/prepare_batches_collectors_structure.py +++ b/desloppify/intelligence/review/prepare_batches_collectors_structure.py @@ -3,6 +3,7 @@ from __future__ import annotations from desloppify.intelligence.review._context.models import HolisticContext +from desloppify.intelligence.review.context_signals.auth import is_auth_runtime_path from .prepare_batches_core import _collect_unique_files, _representative_files_for_directory @@ -50,6 +51,8 @@ def _authorization_files( for rpath, info in sorted(route_auth_coverage.items()): if not isinstance(rpath, str) or not isinstance(info, dict): continue + if not is_auth_runtime_path(rpath): + continue without_auth = _to_int(info.get("without_auth", 0)) with_auth = _to_int(info.get("with_auth", 0)) if without_auth > 0: @@ -80,6 +83,8 @@ def _authorization_files( sibling_module_counts[module] = sibling_module_counts.get(module, 0) + 1 for rpath in auth_ctx.get("service_role_usage", []): + if not isinstance(rpath, str) or not is_auth_runtime_path(rpath): + continue auth_files.append({"file": rpath}) rls_coverage = auth_ctx.get("rls_coverage", {}) rls_files = rls_coverage.get("files", {}) @@ -87,6 +92,8 @@ def _authorization_files( for file_paths in rls_files.values(): if isinstance(file_paths, list): for filepath in file_paths: + if not isinstance(filepath, str) or not is_auth_runtime_path(filepath): + continue auth_files.append({"file": filepath}) return _collect_unique_files([auth_files], max_files=max_files) diff --git a/desloppify/languages/_framework/generic_support/core.py b/desloppify/languages/_framework/generic_support/core.py index 47f01950..4727a821 100644 --- a/desloppify/languages/_framework/generic_support/core.py +++ b/desloppify/languages/_framework/generic_support/core.py @@ -135,7 +135,7 @@ def generic_lang( # Register language-specific test coverage hooks if provided. if opts.test_coverage_module is not None: - from desloppify.engine.hook_registry import register_lang_hooks + from desloppify.languages._framework.registry.state import register_lang_hooks register_lang_hooks(name, test_coverage=opts.test_coverage_module) diff --git a/desloppify/languages/_framework/registry/__init__.py b/desloppify/languages/_framework/registry/__init__.py index 09dbd0eb..8d27c653 100644 --- a/desloppify/languages/_framework/registry/__init__.py +++ b/desloppify/languages/_framework/registry/__init__.py @@ -18,6 +18,7 @@ is_registered, record_load_error, register, + register_lang_hooks, register_hook, remove, set_load_attempted, @@ -42,6 +43,7 @@ "raise_load_errors", "record_load_error", "register", + "register_lang_hooks", "register_full_plugin", "register_hook", "register_lang_class", diff --git a/desloppify/languages/_framework/registry/registration.py b/desloppify/languages/_framework/registry/registration.py index 5d1ebb8a..742ba72f 100644 --- a/desloppify/languages/_framework/registry/registration.py +++ b/desloppify/languages/_framework/registry/registration.py @@ -6,8 +6,6 @@ from pathlib import Path from typing import TypeVar -from desloppify.engine.hook_registry import register_lang_hooks - from . import state from ..base.types import LangConfig from .resolution import make_lang_config @@ -53,7 +51,7 @@ def register_full_plugin( test_coverage: object, ) -> None: """Register a full language plugin with uniform hooks + duplicate guard.""" - register_lang_hooks(name, test_coverage=test_coverage) + state.register_lang_hooks(name, test_coverage=test_coverage) if state.is_registered(name): return register_lang_class(name, config_cls) diff --git a/desloppify/languages/_framework/registry/state.py b/desloppify/languages/_framework/registry/state.py index 2452d484..1fce35f0 100644 --- a/desloppify/languages/_framework/registry/state.py +++ b/desloppify/languages/_framework/registry/state.py @@ -14,6 +14,7 @@ "get", "all_items", "all_keys", + "register_lang_hooks", "register_hook", "get_hook", "clear_hooks", @@ -64,6 +65,16 @@ def all_keys() -> list[str]: return list(_STATE.registry.keys()) +def register_lang_hooks( + lang_name: str, + *, + test_coverage: object | None = None, +) -> None: + """Register optional detector hook modules for a language.""" + if test_coverage is not None: + register_hook(lang_name, "test_coverage", test_coverage) + + def register_hook(lang_name: str, hook_name: str, hook: object) -> None: """Register a language hook inside the shared runtime state.""" hooks = _STATE.hooks.setdefault(lang_name, {}) diff --git a/desloppify/languages/csharp/__init__.py b/desloppify/languages/csharp/__init__.py index 4af4c6c6..6ba2cf0c 100644 --- a/desloppify/languages/csharp/__init__.py +++ b/desloppify/languages/csharp/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, detector_phase_signature, @@ -11,6 +10,7 @@ shared_subjective_duplicates_tail, ) from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.base.types import ( DetectorPhase, LangConfig, diff --git a/desloppify/languages/cxx/__init__.py b/desloppify/languages/cxx/__init__.py index 14db8afb..1afed6ac 100644 --- a/desloppify/languages/cxx/__init__.py +++ b/desloppify/languages/cxx/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, detector_phase_signature, @@ -17,6 +16,7 @@ ) from desloppify.languages._framework.generic_parts.tool_factories import make_tool_phase from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.treesitter.phases import all_treesitter_phases from desloppify.languages.cxx import test_coverage as cxx_test_coverage_hooks from desloppify.languages.cxx._helpers import build_cxx_dep_graph diff --git a/desloppify/languages/dart/__init__.py b/desloppify/languages/dart/__init__.py index 19f5e814..ef19ea57 100644 --- a/desloppify/languages/dart/__init__.py +++ b/desloppify/languages/dart/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.engine.policy.zones import COMMON_ZONE_RULES, Zone, ZoneRule from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, @@ -13,6 +12,7 @@ ) from desloppify.languages._framework.base.types import DetectorPhase, LangConfig from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.treesitter.phases import all_treesitter_phases from desloppify.languages.dart import test_coverage as dart_test_coverage_hooks from desloppify.languages.dart.commands import get_detect_commands diff --git a/desloppify/languages/gdscript/__init__.py b/desloppify/languages/gdscript/__init__.py index 95d86ccc..b7616dff 100644 --- a/desloppify/languages/gdscript/__init__.py +++ b/desloppify/languages/gdscript/__init__.py @@ -4,7 +4,6 @@ from desloppify.base.discovery.paths import get_area from desloppify.engine.policy.zones import COMMON_ZONE_RULES, Zone, ZoneRule -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, detector_phase_signature, @@ -13,6 +12,7 @@ ) from desloppify.languages._framework.base.types import DetectorPhase, LangConfig from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.treesitter.phases import all_treesitter_phases from desloppify.languages.gdscript import test_coverage as gdscript_test_coverage_hooks from desloppify.languages.gdscript.commands import get_detect_commands diff --git a/desloppify/languages/go/__init__.py b/desloppify/languages/go/__init__.py index a0302755..5a7a878d 100644 --- a/desloppify/languages/go/__init__.py +++ b/desloppify/languages/go/__init__.py @@ -7,7 +7,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, detector_phase_signature, @@ -17,6 +16,7 @@ from desloppify.languages._framework.base.types import DetectorPhase, LangConfig from desloppify.languages._framework.generic_support.core import make_tool_phase from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.treesitter.phases import all_treesitter_phases from desloppify.languages.go import test_coverage as go_test_coverage_hooks from desloppify.languages.go.commands import get_detect_commands diff --git a/desloppify/languages/python/__init__.py b/desloppify/languages/python/__init__.py index 5a7389f1..503acc99 100644 --- a/desloppify/languages/python/__init__.py +++ b/desloppify/languages/python/__init__.py @@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any from desloppify.base.discovery.source import find_py_files -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.engine.policy.zones import COMMON_ZONE_RULES, Zone, ZoneRule from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, @@ -14,6 +13,7 @@ shared_subjective_duplicates_tail, ) from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.base.shared_phases import phase_private_imports from desloppify.languages._framework.base.types import ( DetectorCoverageStatus, diff --git a/desloppify/languages/rust/__init__.py b/desloppify/languages/rust/__init__.py index 54541889..e5a4a08d 100644 --- a/desloppify/languages/rust/__init__.py +++ b/desloppify/languages/rust/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.engine.policy.zones import COMMON_ZONE_RULES, Zone, ZoneRule from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, @@ -12,6 +11,7 @@ ) from desloppify.languages._framework.base.types import DetectorPhase, LangConfig from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages._framework.treesitter.phases import all_treesitter_phases from desloppify.languages.rust import test_coverage as rust_test_coverage_hooks from desloppify.languages.rust._fixers import get_rust_fixers diff --git a/desloppify/languages/rust/phases.py b/desloppify/languages/rust/phases.py index 74664fbd..73c7c6be 100644 --- a/desloppify/languages/rust/phases.py +++ b/desloppify/languages/rust/phases.py @@ -6,6 +6,8 @@ from pathlib import Path from desloppify.base.output.terminal import log +from desloppify.engine._state.filtering import make_issue +from desloppify.engine._state.schema_types_issues import Issue from desloppify.engine.detectors.base import ComplexitySignal from desloppify.engine.detectors.graph import detect_cycles from desloppify.engine.detectors.orphaned import ( @@ -50,8 +52,6 @@ parse_clippy_messages, run_rustdoc_result, ) -from desloppify.state import Issue -from desloppify.state import make_issue RUST_CLIPPY_LABEL = "cargo clippy" RUST_CHECK_LABEL = "cargo check" diff --git a/desloppify/languages/rust/phases_smells.py b/desloppify/languages/rust/phases_smells.py index f56cf55b..537f5c0a 100644 --- a/desloppify/languages/rust/phases_smells.py +++ b/desloppify/languages/rust/phases_smells.py @@ -5,12 +5,12 @@ from pathlib import Path from desloppify.base.output.terminal import log +from desloppify.engine._state.schema_types_issues import Issue from desloppify.engine.policy.zones import adjust_potential from desloppify.languages._framework.base.smell_contracts import normalize_smell_entries from desloppify.languages._framework.base.types import LangRuntimeContract from desloppify.languages._framework.issue_factories import make_smell_issues from desloppify.languages.rust.detectors.smells import detect_smells -from desloppify.state import Issue def phase_smells(path: Path, lang: LangRuntimeContract) -> tuple[list[Issue], dict[str, int]]: diff --git a/desloppify/languages/typescript/__init__.py b/desloppify/languages/typescript/__init__.py index 9451b60e..aedfcb57 100644 --- a/desloppify/languages/typescript/__init__.py +++ b/desloppify/languages/typescript/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations from desloppify.base.discovery.paths import get_area -from desloppify.engine.hook_registry import register_lang_hooks from desloppify.languages._framework.base.phase_builders import ( detector_phase_security, detector_phase_signature, @@ -17,6 +16,7 @@ LangSecurityResult, ) from desloppify.languages._framework.registry.registration import register_full_plugin +from desloppify.languages._framework.registry.state import register_lang_hooks from desloppify.languages.typescript import test_coverage as ts_test_coverage_hooks from desloppify.languages.typescript._fixers import get_ts_fixers import desloppify.languages.typescript.commands as ts_commands_mod diff --git a/desloppify/languages/typescript/detectors/smells/helpers_blocks.py b/desloppify/languages/typescript/detectors/smells/helpers_blocks.py deleted file mode 100644 index c3b7c3b4..00000000 --- a/desloppify/languages/typescript/detectors/smells/helpers_blocks.py +++ /dev/null @@ -1,100 +0,0 @@ -"""Block parsing and code-text projection helpers for TS smell detectors.""" - -from __future__ import annotations - -from desloppify.languages.typescript.syntax.scanner import scan_code - - -def _track_brace_body( - lines: list[str], start_line: int, *, max_scan: int = 2000 -) -> int | None: - """Find the closing brace matching the first opening brace from start_line.""" - depth = 0 - found_open = False - for line_idx in range(start_line, min(start_line + max_scan, len(lines))): - for _, ch, in_string in scan_code(lines[line_idx]): - if in_string: - continue - if ch == "{": - depth += 1 - found_open = True - elif ch == "}": - depth -= 1 - if found_open and depth == 0: - return line_idx - return None - - -def _find_block_end(content: str, brace_start: int, max_scan: int = 5000) -> int | None: - """Find the closing brace position in a content string from an opening brace.""" - depth = 0 - for ci, ch, in_s in scan_code( - content, brace_start, min(brace_start + max_scan, len(content)) - ): - if in_s: - continue - if ch == "{": - depth += 1 - elif ch == "}": - depth -= 1 - if depth == 0: - return ci - return None - - -def _extract_block_body( - content: str, brace_start: int, max_scan: int = 5000 -) -> str | None: - """Return text between ``{`` at brace_start and its matching ``}``.""" - end = _find_block_end(content, brace_start, max_scan) - if end is None: - return None - return content[brace_start + 1 : end] - - -def _content_line_info(content: str, pos: int) -> tuple[int, str]: - """Return ``(line_no, stripped snippet[:100])`` for a position in content.""" - line_no = content[:pos].count("\n") + 1 - line_start = content.rfind("\n", 0, pos) + 1 - line_end = content.find("\n", pos) - if line_end == -1: - line_end = len(content) - return line_no, content[line_start:line_end].strip()[:100] - - -def _code_text(text: str) -> str: - """Blank string literals and ``//`` comments to spaces, preserving positions.""" - out = list(text) - in_line_comment = False - prev_code_idx = -2 - prev_code_ch = "" - for i, ch, in_s in scan_code(text): - if ch == "\n": - in_line_comment = False - prev_code_ch = "" - continue - if in_line_comment: - out[i] = " " - continue - if in_s: - out[i] = " " - continue - if ch == "/" and prev_code_ch == "/" and prev_code_idx == i - 1: - out[prev_code_idx] = " " - out[i] = " " - in_line_comment = True - prev_code_ch = "" - continue - prev_code_idx = i - prev_code_ch = ch - return "".join(out) - - -__all__ = [ - "_code_text", - "_content_line_info", - "_extract_block_body", - "_find_block_end", - "_track_brace_body", - "scan_code", -] diff --git a/desloppify/languages/typescript/detectors/smells/helpers_line_state.py b/desloppify/languages/typescript/detectors/smells/helpers_line_state.py deleted file mode 100644 index 22367157..00000000 --- a/desloppify/languages/typescript/detectors/smells/helpers_line_state.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Line-state scanners for block comments and template literals.""" - -from __future__ import annotations - - -def _scan_template_content( - line: str, start: int, brace_depth: int = 0 -) -> tuple[int, bool, int]: - """Scan template literal content from *start* in *line*.""" - j = start - while j < len(line): - ch = line[j] - if ch == "\\" and j + 1 < len(line): - j += 2 - continue - if ch == "$" and j + 1 < len(line) and line[j + 1] == "{": - brace_depth += 1 - j += 2 - continue - if ch == "}" and brace_depth > 0: - brace_depth -= 1 - j += 1 - continue - if ch == "`" and brace_depth == 0: - return (j + 1, True, brace_depth) - j += 1 - return (j, False, brace_depth) - - -def _scan_code_line(line: str) -> tuple[bool, bool, int]: - """Scan a normal code line for block comment or template literal start.""" - j = 0 - in_str = None - while j < len(line): - ch = line[j] - - if in_str and ch == "\\" and j + 1 < len(line): - j += 2 - continue - - if in_str: - if ch == in_str: - in_str = None - j += 1 - continue - - if ch == "/" and j + 1 < len(line) and line[j + 1] == "/": - break - - if ch == "/" and j + 1 < len(line) and line[j + 1] == "*": - close = line.find("*/", j + 2) - if close != -1: - j = close + 2 - continue - return (True, False, 0) - - if ch == "`": - end_pos, found_close, depth = _scan_template_content(line, j + 1) - if found_close: - j = end_pos - continue - return (False, True, depth) - - if ch in ("'", '"'): - in_str = ch - j += 1 - continue - - j += 1 - - return (False, False, 0) - - -def _build_ts_line_state(lines: list[str]) -> dict[int, str]: - """Build a map of lines inside block comments or template literals.""" - state: dict[int, str] = {} - in_block_comment = False - in_template = False - template_brace_depth = 0 - - for i, line in enumerate(lines): - if in_block_comment: - state[i] = "block_comment" - if "*/" in line: - in_block_comment = False - continue - - if in_template: - state[i] = "template_literal" - _, found_close, template_brace_depth = _scan_template_content( - line, 0, template_brace_depth - ) - if found_close: - in_template = False - continue - - in_block_comment, in_template, depth = _scan_code_line(line) - if in_template: - template_brace_depth = depth - - return state - - -__all__ = [ - "_build_ts_line_state", - "_scan_code_line", - "_scan_template_content", -] diff --git a/desloppify/tests/commands/plan/test_cluster_guard.py b/desloppify/tests/commands/plan/test_cluster_guard.py index 5da82de7..187aa529 100644 --- a/desloppify/tests/commands/plan/test_cluster_guard.py +++ b/desloppify/tests/commands/plan/test_cluster_guard.py @@ -2,7 +2,7 @@ from __future__ import annotations -from desloppify.app.commands.plan.override_resolve_helpers import ( +from desloppify.app.commands.plan.override.resolve_helpers import ( _CLUSTER_INDIVIDUAL_THRESHOLD, check_cluster_guard as _check_cluster_guard, ) diff --git a/desloppify/tests/commands/plan/test_cluster_ops_direct.py b/desloppify/tests/commands/plan/test_cluster_ops_direct.py index a64abcd8..9a7e1e8e 100644 --- a/desloppify/tests/commands/plan/test_cluster_ops_direct.py +++ b/desloppify/tests/commands/plan/test_cluster_ops_direct.py @@ -9,12 +9,12 @@ import pytest import desloppify.app.commands.plan.cluster.dispatch as cluster_dispatch_mod -import desloppify.app.commands.plan.cluster_ops_display as cluster_display_mod -import desloppify.app.commands.plan.cluster_ops_manage as cluster_manage_mod -import desloppify.app.commands.plan.cluster_ops_reorder as cluster_reorder_mod -import desloppify.app.commands.plan.cluster_steps as cluster_steps_mod -import desloppify.app.commands.plan.cluster_update as cluster_update_mod -import desloppify.app.commands.plan.cluster_update_flow as cluster_update_flow_mod +import desloppify.app.commands.plan.cluster.ops_display as cluster_display_mod +import desloppify.app.commands.plan.cluster.ops_manage as cluster_manage_mod +import desloppify.app.commands.plan.cluster.ops_reorder as cluster_reorder_mod +import desloppify.app.commands.plan.cluster.steps as cluster_steps_mod +import desloppify.app.commands.plan.cluster.update as cluster_update_mod +import desloppify.app.commands.plan.cluster.update_flow as cluster_update_flow_mod from desloppify.base.exception_sets import CommandError diff --git a/desloppify/tests/commands/plan/test_cluster_ux.py b/desloppify/tests/commands/plan/test_cluster_ux.py index df8bafd2..9a2bb019 100644 --- a/desloppify/tests/commands/plan/test_cluster_ux.py +++ b/desloppify/tests/commands/plan/test_cluster_ux.py @@ -5,7 +5,7 @@ import argparse import desloppify.app.commands.plan.cluster.dispatch as cluster_mod -import desloppify.app.commands.plan.cluster_update as cluster_update_mod +import desloppify.app.commands.plan.cluster.update as cluster_update_mod from desloppify.engine._plan.schema import empty_plan # --------------------------------------------------------------------------- diff --git a/desloppify/tests/commands/plan/test_plan_override_transactions.py b/desloppify/tests/commands/plan/test_plan_override_transactions.py index aa7058bf..c8e7b22c 100644 --- a/desloppify/tests/commands/plan/test_plan_override_transactions.py +++ b/desloppify/tests/commands/plan/test_plan_override_transactions.py @@ -9,8 +9,8 @@ from desloppify import state as state_mod from desloppify.app.commands.helpers.command_runtime import CommandRuntime -from desloppify.app.commands.plan import override_io -from desloppify.app.commands.plan import override_skip +from desloppify.app.commands.plan.override import io as override_io +from desloppify.app.commands.plan.override import skip as override_skip from desloppify.base.exception_sets import CommandError from desloppify.engine.plan_state import empty_plan, load_plan, save_plan from desloppify.engine.plan_ops import skip_items diff --git a/desloppify/tests/commands/plan/test_plan_overrides_direct.py b/desloppify/tests/commands/plan/test_plan_overrides_direct.py index 069db22d..b9fb9676 100644 --- a/desloppify/tests/commands/plan/test_plan_overrides_direct.py +++ b/desloppify/tests/commands/plan/test_plan_overrides_direct.py @@ -8,12 +8,12 @@ import pytest -import desloppify.app.commands.plan.override_io as override_io_mod -import desloppify.app.commands.plan.override_misc as override_misc_mod -import desloppify.app.commands.plan.override_resolve_cmd as override_resolve_cmd_mod -import desloppify.app.commands.plan.override_resolve_helpers as resolve_helpers_mod -import desloppify.app.commands.plan.override_resolve_workflow as resolve_workflow_mod -import desloppify.app.commands.plan.override_skip as override_skip_mod +import desloppify.app.commands.plan.override.io as override_io_mod +import desloppify.app.commands.plan.override.misc as override_misc_mod +import desloppify.app.commands.plan.override.resolve_cmd as override_resolve_cmd_mod +import desloppify.app.commands.plan.override.resolve_helpers as resolve_helpers_mod +import desloppify.app.commands.plan.override.resolve_workflow as resolve_workflow_mod +import desloppify.app.commands.plan.override.skip as override_skip_mod import desloppify.app.commands.plan.reorder_handlers as reorder_handlers_mod from desloppify.base.exception_sets import CommandError @@ -244,6 +244,77 @@ def test_resolve_workflow_patterns_scan_gate_blocks_without_new_scan(monkeypatch assert any(action == "scan_gate_blocked" for action, _ in logs) +def test_resolve_workflow_patterns_reconciles_when_create_plan_drains_queue(monkeypatch) -> None: + plan = { + "queue_order": [resolve_workflow_mod.WORKFLOW_CREATE_PLAN_ID], + "epic_triage_meta": { + "triage_stages": {}, + "last_completed_at": "2026-03-09T00:00:00+00:00", + }, + "scan_count_at_plan_start": 9, + } + seen: list[object] = [] + + monkeypatch.setattr(resolve_workflow_mod, "load_plan", lambda: plan) + monkeypatch.setattr(resolve_workflow_mod, "blocked_triage_stages", lambda _plan: {}) + monkeypatch.setattr(resolve_workflow_mod, "save_plan", lambda *_a, **_k: seen.append("save")) + monkeypatch.setattr(resolve_workflow_mod, "state_path", lambda _args: Path("state.json")) + monkeypatch.setattr( + resolve_workflow_mod.state_mod, + "load_state", + lambda _path: {"scan_count": 10, "config": {"target_strict_score": 96}}, + ) + monkeypatch.setattr( + resolve_workflow_mod, + "append_log_entry", + lambda *_a, **_k: None, + ) + monkeypatch.setattr(resolve_workflow_mod, "live_planned_queue_empty", lambda _plan: True) + monkeypatch.setattr(resolve_workflow_mod, "has_open_review_issues", lambda _state: True) + monkeypatch.setattr( + resolve_workflow_mod, + "ensure_active_triage_issue_ids", + lambda _plan, _state: seen.append(("active_triage", True)), + ) + monkeypatch.setattr( + resolve_workflow_mod, + "inject_triage_stages", + lambda _plan: seen.append(("inject_triage", True)), + ) + monkeypatch.setattr( + resolve_workflow_mod, + "set_lifecycle_phase", + lambda _plan, phase: seen.append(("phase", phase)) or True, + ) + monkeypatch.setattr( + resolve_workflow_mod, + "target_strict_score_from_config", + lambda config: seen.append(("target", config)) or 96.0, + ) + monkeypatch.setattr( + resolve_workflow_mod, + "reconcile_plan", + lambda _plan, _state, *, target_strict: seen.append( + ("reconcile", list(_plan.get("queue_order", [])), target_strict) + ), + ) + + args = argparse.Namespace(force_resolve=False, state=None, lang=None, path=".", exclude=None) + outcome = resolve_workflow_mod.resolve_workflow_patterns( + args, + synthetic_ids=[resolve_workflow_mod.WORKFLOW_CREATE_PLAN_ID], + real_patterns=[], + note="Detailed workflow completion note", + ) + + assert outcome.status == "handled" + assert ("active_triage", True) in seen + assert ("inject_triage", True) in seen + assert ("phase", resolve_workflow_mod.LIFECYCLE_PHASE_TRIAGE_POSTFLIGHT) in seen + assert ("target", {"target_strict_score": 96}) not in seen + assert not any(isinstance(item, tuple) and item[:1] == ("reconcile",) for item in seen) + + def test_cmd_plan_resolve_workflow_gate_integration_paths(monkeypatch, capsys) -> None: """Command-level workflow gating smoke: triage block, short forced note, scan gate.""" current_plan: dict = {} diff --git a/desloppify/tests/commands/plan/test_triage_auto_start.py b/desloppify/tests/commands/plan/test_triage_auto_start.py index d91fe318..915cd1da 100644 --- a/desloppify/tests/commands/plan/test_triage_auto_start.py +++ b/desloppify/tests/commands/plan/test_triage_auto_start.py @@ -3,9 +3,11 @@ from __future__ import annotations import argparse +from pathlib import Path import desloppify.app.commands.plan.triage.command as triage_mod from desloppify.app.commands.plan.triage import helpers as triage_helpers +import desloppify.app.commands.plan.triage.workflow as triage_workflow_mod from desloppify.app.commands.plan.triage.services import TriageServices from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.constants import TRIAGE_IDS, TRIAGE_STAGE_IDS @@ -48,6 +50,11 @@ def _fake_args(**overrides) -> argparse.Namespace: "note": None, "start": False, "dry_run": False, + "run_stages": False, + "runner": "codex", + "report_file": None, + "only_stages": None, + "stage_prompt": None, } defaults.update(overrides) return argparse.Namespace(**defaults) @@ -190,3 +197,50 @@ def test_inject_triage_stages_clears_skipped_entries(self): assert "triage::enrich" not in plan["skipped"] assert "triage::sense-check" not in plan["skipped"] assert "review::z.py::x9" in plan["skipped"] + + def test_cmd_plan_triage_run_stages_reads_report_file_before_runner_dispatch( + self, + monkeypatch, + tmp_path: Path, + capsys, + ) -> None: + plan = empty_plan() + state = _state_with_issues("r1", "r2", "r3") + _patch_triage(monkeypatch, plan, state) + monkeypatch.setattr(triage_mod, "require_issue_inventory", lambda _state: True) + + report_file = tmp_path / "sense-check.txt" + report_file.write_text( + "This report came from a file and should be loaded before staged runner dispatch.", + encoding="utf-8", + ) + + seen: dict[str, object] = {} + + def fake_run_codex_pipeline(args, *, stages_to_run, services): + seen["report"] = args.report + seen["report_file"] = args.report_file + seen["stages_to_run"] = stages_to_run + seen["services"] = services + run_dir = tmp_path / ".desloppify" / "triage_runs" / "fake-run" + run_dir.mkdir(parents=True, exist_ok=True) + (run_dir / "run_summary.json").write_text("{}", encoding="utf-8") + print(f"runner wrote: {run_dir}") + + monkeypatch.setattr(triage_workflow_mod, "run_codex_pipeline", fake_run_codex_pipeline) + + args = _fake_args( + run_stages=True, + runner="codex", + report=None, + report_file=str(report_file), + only_stages="observe", + ) + triage_mod.cmd_plan_triage(args) + + out = capsys.readouterr().out + assert seen["report"] == report_file.read_text(encoding="utf-8") + assert seen["report_file"] == str(report_file) + assert seen["stages_to_run"] == ["observe"] + assert seen["services"] is not None + assert "runner wrote:" in out diff --git a/desloppify/tests/commands/plan/test_triage_dependency_guard.py b/desloppify/tests/commands/plan/test_triage_dependency_guard.py index 01ea5a74..6f7dedbb 100644 --- a/desloppify/tests/commands/plan/test_triage_dependency_guard.py +++ b/desloppify/tests/commands/plan/test_triage_dependency_guard.py @@ -4,9 +4,9 @@ import argparse -import desloppify.app.commands.plan.override_resolve_cmd as override_mod -import desloppify.app.commands.plan.override_resolve_workflow as override_workflow_mod -from desloppify.app.commands.plan.override_resolve_helpers import blocked_triage_stages as _blocked_triage_stages +import desloppify.app.commands.plan.override.resolve_cmd as override_mod +import desloppify.app.commands.plan.override.resolve_workflow as override_workflow_mod +from desloppify.app.commands.plan.override.resolve_helpers import blocked_triage_stages as _blocked_triage_stages from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.constants import TRIAGE_STAGE_IDS @@ -117,6 +117,7 @@ def test_plan_resolve_allows_unblocked_triage_stage(monkeypatch, capsys): plan = _plan_with_triage_stages("observe") # observe confirmed monkeypatch.setattr(override_workflow_mod, "load_plan", lambda *a, **kw: plan) + monkeypatch.setattr(override_workflow_mod, "live_planned_queue_empty", lambda _plan: False) saved_plans = [] monkeypatch.setattr(override_workflow_mod, "save_plan", lambda p, *a, **kw: saved_plans.append(p)) @@ -134,6 +135,7 @@ def test_plan_resolve_force_resolve_overrides_block(monkeypatch, capsys): plan = _plan_with_triage_stages() # nothing confirmed monkeypatch.setattr(override_workflow_mod, "load_plan", lambda *a, **kw: plan) + monkeypatch.setattr(override_workflow_mod, "live_planned_queue_empty", lambda _plan: False) saved_plans = [] monkeypatch.setattr(override_workflow_mod, "save_plan", lambda p, *a, **kw: saved_plans.append(p)) @@ -152,6 +154,7 @@ def test_plan_resolve_observe_is_never_blocked(monkeypatch, capsys): plan = _plan_with_triage_stages() # nothing confirmed monkeypatch.setattr(override_workflow_mod, "load_plan", lambda *a, **kw: plan) + monkeypatch.setattr(override_workflow_mod, "live_planned_queue_empty", lambda _plan: False) saved_plans = [] monkeypatch.setattr(override_workflow_mod, "save_plan", lambda p, *a, **kw: saved_plans.append(p)) diff --git a/desloppify/tests/commands/plan/test_triage_plan_state_access_direct.py b/desloppify/tests/commands/plan/test_triage_plan_state_access_direct.py index 9d5f9f2f..0f0a6a37 100644 --- a/desloppify/tests/commands/plan/test_triage_plan_state_access_direct.py +++ b/desloppify/tests/commands/plan/test_triage_plan_state_access_direct.py @@ -2,6 +2,8 @@ from __future__ import annotations +from typing import get_type_hints + import desloppify.app.commands.plan.triage.plan_state_access as plan_state_access_mod from desloppify.app.commands.plan.triage.plan_state_access import ( ensure_cluster_map, @@ -11,6 +13,8 @@ ensure_triage_meta, normalized_issue_id_list, ) +from desloppify.engine._work_queue.types import PlanClusterRef, SerializedQueueItem +from desloppify.engine.plan_state import ActionStep, Cluster def test_plan_state_access_initializes_missing_collections() -> None: @@ -71,3 +75,15 @@ def test_plan_state_access_exports_expected_helpers() -> None: assert "ensure_triage_meta" in plan_state_access_mod.__all__ assert "ensure_execution_log" in plan_state_access_mod.__all__ assert "normalized_issue_id_list" in plan_state_access_mod.__all__ + + +def test_plan_schema_and_queue_types_cover_runtime_cluster_payloads() -> None: + action_step_hints = get_type_hints(ActionStep) + cluster_hints = get_type_hints(Cluster) + plan_cluster_hints = get_type_hints(PlanClusterRef) + serialized_queue_hints = get_type_hints(SerializedQueueItem) + + assert "effort" in action_step_hints + assert "depends_on_clusters" in cluster_hints + assert "action_steps" in plan_cluster_hints + assert "action_steps" in serialized_queue_hints diff --git a/desloppify/tests/commands/plan/test_triage_runner.py b/desloppify/tests/commands/plan/test_triage_runner.py index 26f372cd..dcea4c99 100644 --- a/desloppify/tests/commands/plan/test_triage_runner.py +++ b/desloppify/tests/commands/plan/test_triage_runner.py @@ -900,6 +900,47 @@ def test_sense_check_validation_ok(tmp_path: Path) -> None: assert ok +def test_sense_check_validation_uses_frozen_value_targets(tmp_path: Path) -> None: + """Validation should accept decision-ledger targets captured before value-pass pruning.""" + (tmp_path / "src").mkdir() + (tmp_path / "src" / "foo.ts").write_text("export {}") + plan = _plan_with_stages( + **{ + "sense-check": { + "report": ( + "## Decision Ledger\n" + "- kept-cluster -> keep\n" + "- pruned-cluster -> skip\n" + "- review::.::holistic::cross_module_architecture::private_framework_boundary_still_leaks -> skip\n\n" + "Verified kept-cluster in src/foo.ts lines 1-10 and recorded why the pruned targets were removed during the value pass. " + + "x" * 80 + ), + "value_targets": [ + "kept-cluster", + "pruned-cluster", + "review::.::holistic::cross_module_architecture::private_framework_boundary_still_leaks", + ], + } + } + ) + plan["clusters"] = { + "kept-cluster": { + "issue_ids": ["review::a::b"], + "description": "active", + "action_steps": [ + { + "title": "fix", + "detail": "Update src/foo.ts to simplify the active path and remove duplication. " + "x" * 40, + "effort": "small", + "issue_refs": ["review::a::b"], + } + ], + } + } + ok, msg = validate_stage("sense-check", plan, {}, tmp_path) + assert ok, msg + + def test_sense_check_stage_in_pipeline_order() -> None: """sense-check must appear between enrich and commit in TRIAGE_STAGE_IDS.""" from desloppify.engine._plan.constants import TRIAGE_STAGE_IDS diff --git a/desloppify/tests/commands/plan/test_triage_split_modules_direct.py b/desloppify/tests/commands/plan/test_triage_split_modules_direct.py index 54c0550d..0e8b8bd8 100644 --- a/desloppify/tests/commands/plan/test_triage_split_modules_direct.py +++ b/desloppify/tests/commands/plan/test_triage_split_modules_direct.py @@ -67,9 +67,22 @@ def test_completion_policy_helpers_cover_success_and_fail_paths(monkeypatch, cap lambda _plan, _state=None: ["c1"], ) monkeypatch.setattr(completion_policy_mod, "active_triage_issue_scope", lambda _plan, _state=None: None) + monkeypatch.setattr( + completion_policy_mod, + "open_review_ids_from_state", + lambda _state: {"review::a.py::id1"}, + ) + monkeypatch.setattr(completion_policy_mod, "triage_coverage", lambda _plan, open_review_ids: (1, 1, [])) monkeypatch.setattr(completion_policy_mod, "unenriched_clusters", lambda _plan, _state=None: []) monkeypatch.setattr(completion_policy_mod, "unclustered_review_issues", lambda _plan, _state: []) assert completion_policy_mod._completion_clusters_valid({"clusters": {}}, state={}) is True + readiness = completion_policy_mod.evaluate_completion_readiness( + {"clusters": {}}, + state={}, + ) + assert readiness.ok is True + assert readiness.organized == 1 + assert readiness.total == 1 assert completion_policy_mod._resolve_completion_strategy("keep", meta={}) == "keep" assert completion_policy_mod._resolve_completion_strategy(None, meta={}) is None @@ -118,6 +131,26 @@ def test_completion_policy_helpers_cover_success_and_fail_paths(monkeypatch, cap assert "Strategy too short" in out +def test_runner_validate_completion_uses_shared_completion_boundary(monkeypatch, tmp_path: Path) -> None: + import desloppify.app.commands.plan.triage.runner.stage_validation as stage_validation_mod + + monkeypatch.setattr( + stage_validation_mod, + "evaluate_completion_readiness", + lambda _plan, _state, require_confirmed_stages=False: completion_policy_mod.CompletionReadiness( + ok=True, + message="Advisory: shared boundary hit", + organized=2, + total=2, + ), + ) + + ok, message = stage_validation_mod.validate_completion({}, {}, tmp_path) + + assert ok is True + assert message == "Advisory: shared boundary hit" + + def test_completion_stage_helpers_include_gate_and_auto_confirm_defaults(monkeypatch, capsys) -> None: plan = {"clusters": {"a": {"issue_ids": ["id1"], "action_steps": []}}} diff --git a/desloppify/tests/commands/plan/test_triage_stage_prompts_flow_direct.py b/desloppify/tests/commands/plan/test_triage_stage_prompts_flow_direct.py index 009d1559..bb466dde 100644 --- a/desloppify/tests/commands/plan/test_triage_stage_prompts_flow_direct.py +++ b/desloppify/tests/commands/plan/test_triage_stage_prompts_flow_direct.py @@ -211,7 +211,7 @@ def test_record_sense_stage_and_run_stage_sense_check(tmp_path, capsys, monkeypa services = _Services(plan=plan) args = argparse.Namespace(report="Verified all steps: src/services/main.ts lines 10-50 match descriptions. Structure and content accurate. " + "y" * 30) - def _record_sense(stages: dict, *, report: str, existing_stage, is_reuse): + def _record_sense(stages: dict, *, report: str, existing_stage, is_reuse, value_targets=None): stages["sense-check"] = { "stage": "sense-check", "report": report, diff --git a/desloppify/tests/commands/plan/test_triage_tooling_fixes.py b/desloppify/tests/commands/plan/test_triage_tooling_fixes.py index f0b594aa..5b391fc4 100644 --- a/desloppify/tests/commands/plan/test_triage_tooling_fixes.py +++ b/desloppify/tests/commands/plan/test_triage_tooling_fixes.py @@ -5,7 +5,7 @@ import argparse from pathlib import Path -from desloppify.app.commands.plan import cluster_update as cluster_update_mod +from desloppify.app.commands.plan.cluster import update as cluster_update_mod from desloppify.app.commands.plan.triage.validation.core import ( _cluster_file_overlaps, diff --git a/desloppify/tests/commands/plan/test_workflow_gates.py b/desloppify/tests/commands/plan/test_workflow_gates.py index cb7e8b61..5184a8c3 100644 --- a/desloppify/tests/commands/plan/test_workflow_gates.py +++ b/desloppify/tests/commands/plan/test_workflow_gates.py @@ -13,9 +13,9 @@ import argparse -import desloppify.app.commands.plan.override_resolve_cmd as resolve_mod -import desloppify.app.commands.plan.override_resolve_workflow as resolve_workflow_mod -import desloppify.app.commands.plan.override_misc as misc_mod +import desloppify.app.commands.plan.override.misc as misc_mod +import desloppify.app.commands.plan.override.resolve_cmd as resolve_mod +import desloppify.app.commands.plan.override.resolve_workflow as resolve_workflow_mod from desloppify.engine._plan.schema import empty_plan from desloppify.engine._plan.constants import ( WORKFLOW_CREATE_PLAN_ID, diff --git a/desloppify/tests/commands/resolve/test_cmd_resolve.py b/desloppify/tests/commands/resolve/test_cmd_resolve.py index 084f2c54..a3a42ffc 100644 --- a/desloppify/tests/commands/resolve/test_cmd_resolve.py +++ b/desloppify/tests/commands/resolve/test_cmd_resolve.py @@ -161,7 +161,7 @@ def test_resolve_successful(self, monkeypatch, capsys): "last_scan": "2025-01-01", } monkeypatch.setattr(resolve_mod, "load_state", lambda sp: fake_state) - monkeypatch.setattr(state_persistence_mod.state_compat, "save_state", lambda state, sp: None) + monkeypatch.setattr(state_persistence_mod, "save_state", lambda state, sp: None) monkeypatch.setattr( state_mod, "resolve_issues", @@ -204,7 +204,7 @@ def test_wontfix_shows_strict_cost_warning(self, monkeypatch, capsys): "last_scan": "2025-01-01", } monkeypatch.setattr(resolve_mod, "load_state", lambda sp: fake_state) - monkeypatch.setattr(state_persistence_mod.state_compat, "save_state", lambda state, sp: None) + monkeypatch.setattr(state_persistence_mod, "save_state", lambda state, sp: None) monkeypatch.setattr( state_mod, "resolve_issues", @@ -246,7 +246,7 @@ def test_reopen_without_attestation_allowed(self, monkeypatch, capsys): "last_scan": "2025-01-01", } monkeypatch.setattr(resolve_mod, "load_state", lambda sp: fake_state) - monkeypatch.setattr(state_persistence_mod.state_compat, "save_state", lambda state, sp: None) + monkeypatch.setattr(state_persistence_mod, "save_state", lambda state, sp: None) monkeypatch.setattr( state_mod, "resolve_issues", @@ -292,7 +292,7 @@ def test_resolve_save_state_error_exits(self, monkeypatch, capsys): lambda state, pattern, status, note, **kwargs: ["f1"], ) monkeypatch.setattr( - state_persistence_mod.state_compat, + state_persistence_mod, "save_state", lambda state, sp: (_ for _ in ()).throw(OSError("disk full")), ) @@ -379,7 +379,7 @@ def test_suppress_save_state_error_exits(self, monkeypatch, capsys): state_path=Path("/tmp/fake.json"), ) monkeypatch.setattr( - state_persistence_mod.state_compat, + state_persistence_mod, "save_state", lambda state, sp: (_ for _ in ()).throw(OSError("readonly")), ) @@ -441,7 +441,7 @@ def test_state_persistence_helpers_delegate_and_wrap_os_errors(self, monkeypatch saved: dict[str, object] = {} monkeypatch.setattr( - state_persistence_mod.state_compat, + state_persistence_mod, "save_state", lambda state, state_file: saved.update(state=state, state_file=state_file), ) @@ -463,7 +463,7 @@ def test_state_persistence_helpers_delegate_and_wrap_os_errors(self, monkeypatch assert saved["config"] is config monkeypatch.setattr( - state_persistence_mod.state_compat, + state_persistence_mod, "save_state", lambda *_args: (_ for _ in ()).throw(OSError("readonly")), ) diff --git a/desloppify/tests/commands/resolve/test_living_plan_direct.py b/desloppify/tests/commands/resolve/test_living_plan_direct.py index a6b0a75b..739507c1 100644 --- a/desloppify/tests/commands/resolve/test_living_plan_direct.py +++ b/desloppify/tests/commands/resolve/test_living_plan_direct.py @@ -71,6 +71,86 @@ def test_update_living_plan_after_resolve_fixed_flow(monkeypatch, capsys) -> Non assert "add" in calls and "clear" in calls and "save" in calls +def test_update_living_plan_after_resolve_reconciles_when_queue_drains(monkeypatch) -> None: + plan = { + "queue_order": ["workflow::create-plan"], + "overrides": {}, + "clusters": {}, + } + state = {"config": {"target_strict_score": 97}} + seen: list[object] = [] + + monkeypatch.setattr(living_plan_mod, "has_living_plan", lambda _p=None: True) + monkeypatch.setattr(living_plan_mod, "load_plan", lambda _p=None: plan) + + def _purge(_plan, _ids): + _plan["queue_order"] = [] + return 1 + + monkeypatch.setattr(living_plan_mod, "purge_ids", _purge) + monkeypatch.setattr(living_plan_mod, "auto_complete_steps", lambda _plan: []) + monkeypatch.setattr(living_plan_mod, "append_log_entry", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "add_uncommitted_issues", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "clear_postflight_scan_completion", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "save_plan", lambda _plan, _p=None: None) + monkeypatch.setattr(living_plan_mod, "live_planned_queue_empty", lambda _plan: True) + monkeypatch.setattr( + living_plan_mod, + "target_strict_score_from_config", + lambda config: seen.append(("target", config)) or 97.0, + ) + monkeypatch.setattr( + living_plan_mod, + "reconcile_plan", + lambda _plan, _state, *, target_strict: seen.append( + ("reconcile", target_strict, _state) + ), + ) + + living_plan_mod.update_living_plan_after_resolve( + args=_args(status="fixed", note="done"), + all_resolved=["workflow::create-plan"], + attestation="attest", + state=state, + ) + + assert ("target", state["config"]) in seen + assert ("reconcile", 97.0, state) in seen + + +def test_update_living_plan_after_resolve_skips_reconcile_without_state(monkeypatch) -> None: + plan = { + "queue_order": ["a"], + "overrides": {}, + "clusters": {}, + } + seen: list[str] = [] + + monkeypatch.setattr(living_plan_mod, "has_living_plan", lambda _p=None: True) + monkeypatch.setattr(living_plan_mod, "load_plan", lambda _p=None: plan) + monkeypatch.setattr(living_plan_mod, "purge_ids", lambda _plan, _ids: 1) + monkeypatch.setattr(living_plan_mod, "auto_complete_steps", lambda _plan: []) + monkeypatch.setattr(living_plan_mod, "append_log_entry", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "add_uncommitted_issues", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "clear_postflight_scan_completion", lambda *_a, **_k: None) + monkeypatch.setattr(living_plan_mod, "save_plan", lambda _plan, _p=None: None) + monkeypatch.setattr(living_plan_mod, "live_planned_queue_empty", lambda _plan: True) + monkeypatch.setattr( + living_plan_mod, + "reconcile_plan", + lambda *_a, **_k: seen.append("reconcile"), + ) + + living_plan_mod.update_living_plan_after_resolve( + args=_args(status="fixed", note="done"), + all_resolved=["a"], + attestation="attest", + state=None, + ) + + assert seen == [] + + def test_update_living_plan_after_resolve_handles_plan_exceptions(monkeypatch, capsys) -> None: monkeypatch.setattr(living_plan_mod, "has_living_plan", lambda _p=None: True) monkeypatch.setattr( diff --git a/desloppify/tests/commands/review/test_review_batch_execution_helpers_direct.py b/desloppify/tests/commands/review/test_review_batch_execution_helpers_direct.py index 8e002c8f..0bef2018 100644 --- a/desloppify/tests/commands/review/test_review_batch_execution_helpers_direct.py +++ b/desloppify/tests/commands/review/test_review_batch_execution_helpers_direct.py @@ -146,11 +146,14 @@ def test_collect_and_reconcile_results_marks_failure_modes(tmp_path: Path) -> No output_files = {0: out0, 1: tmp_path / "out1.json", 2: tmp_path / "out2.json"} batch_status: dict[str, dict[str, object]] = {} batch_results, successful, failures, failure_set = results_mod.collect_and_reconcile_results( - collect_batch_results_fn=lambda **_kwargs: ([{"ok": True}], [1, 2]), - selected_indexes=[0, 1, 2], + collect_batch_results_fn=lambda _request: ([{"ok": True}], [1, 2]), + request=orchestrator_mod.review_batches_mod.CollectBatchResultsRequest( + selected_indexes=[0, 1, 2], + failures=[1], + output_files=output_files, + allowed_dims={"design_coherence"}, + ), execution_failures=[1], - output_files=output_files, - packet={"dimensions": ["design_coherence"]}, batch_positions={0: 1, 1: 2, 2: 3}, batch_status=batch_status, ) @@ -390,7 +393,7 @@ def test_do_import_run_recollects_batches_from_selected_indexes(tmp_path: Path, ) assert len(collect_calls) == 1 - assert collect_calls[0]["selected_indexes"] == [0, 1] + assert collect_calls[0]["request"].selected_indexes == [0, 1] def test_try_load_prepared_packet_accepts_matching_contract(tmp_path: Path, monkeypatch) -> None: diff --git a/desloppify/tests/commands/review/test_review_batch_execution_phases_direct.py b/desloppify/tests/commands/review/test_review_batch_execution_phases_direct.py index 86bfe66b..c959f451 100644 --- a/desloppify/tests/commands/review/test_review_batch_execution_phases_direct.py +++ b/desloppify/tests/commands/review/test_review_batch_execution_phases_direct.py @@ -74,8 +74,8 @@ def test_prepare_batch_run_returns_none_for_dry_run(tmp_path: Path) -> None: "dimension_prompts": {"design_coherence": "prompt"}, } - def prepare_run_artifacts_fn(**kwargs): - run_dir = kwargs["run_root"] / kwargs["stamp"] + def prepare_run_artifacts_fn(request): + run_dir = request.run_root / request.stamp logs_dir = run_dir / "logs" prompts_dir = run_dir / "prompts" results_dir = run_dir / "results" @@ -91,7 +91,7 @@ def prepare_run_artifacts_fn(**kwargs): deps = SimpleNamespace( colorize_fn=lambda text, _tone=None: text, run_stamp_fn=lambda: "stamp", - load_or_prepare_packet_fn=lambda *_a, **_k: ( + load_or_prepare_packet_fn=lambda _request: ( packet, tmp_path / "packet.json", tmp_path / "prompt.json", diff --git a/desloppify/tests/commands/review/test_review_importing_support_direct.py b/desloppify/tests/commands/review/test_review_importing_support_direct.py index bee52d25..618ce857 100644 --- a/desloppify/tests/commands/review/test_review_importing_support_direct.py +++ b/desloppify/tests/commands/review/test_review_importing_support_direct.py @@ -9,6 +9,7 @@ import desloppify.app.commands.review.importing.cmd as import_cmd_mod import desloppify.app.commands.review.importing.flags as flags_mod +import desloppify.app.commands.review.importing.output as import_output_mod import desloppify.app.commands.review.importing.plan_sync as plan_sync_mod import desloppify.app.commands.review.importing.results as results_mod import desloppify.engine._plan.constants as plan_constants_mod @@ -119,6 +120,34 @@ def test_sync_plan_after_import_no_living_plan(monkeypatch) -> None: ) +def test_sync_plan_after_import_marks_subjective_review_complete_for_current_scan( + monkeypatch: pytest.MonkeyPatch, +) -> None: + plan = { + "queue_order": [], + "refresh_state": {"postflight_scan_completed_at_scan_count": 7}, + } + _patch_basic_plan_sync_runtime(monkeypatch, plan=plan) + + state = { + "scan_count": 7, + "subjective_assessments": { + "naming_quality": {"score": 82.0}, + }, + } + outcome = plan_sync_mod.sync_plan_after_import( + state=state, + diff={"new": 0, "reopened": 0, "auto_resolved": 0}, + assessment_mode="trusted_internal", + request=_sync_request( + import_payload={"assessments": {"Naming Quality": 82}}, + ), + ) + + assert outcome.status == "synced" + assert plan["refresh_state"]["subjective_review_completed_at_scan_count"] == 7 + + def test_print_review_import_sync_reports_new_ids_and_triage_commands(capsys) -> None: state = { "issues": { @@ -137,6 +166,7 @@ def test_print_review_import_sync_reports_new_ids_and_triage_commands(capsys) -> result, workflow_injected=False, triage_injected=True, + outcome=plan_sync_mod.PlanImportSyncOutcome(status="synced"), ) out = capsys.readouterr().out @@ -147,6 +177,23 @@ def test_print_review_import_sync_reports_new_ids_and_triage_commands(capsys) -> assert plan_sync_mod.TRIAGE_CMD_RUN_STAGES_CLAUDE in out +def test_print_open_review_summary_avoids_duplicate_count_phrase(capsys) -> None: + next_command = import_output_mod.print_open_review_summary( + { + "issues": { + "review::alpha": {"status": "open", "detector": "review"}, + "review::beta": {"status": "open", "detector": "review"}, + } + }, + colorize_fn=lambda text, _tone: text, + ) + + out = capsys.readouterr().out + assert "2 review work items open total" in out + assert "(2 review work items open total)" not in out + assert next_command == "desloppify show review --status open" + + def test_sync_plan_after_import_scopes_living_plan_to_state_file(monkeypatch, tmp_path) -> None: seen: dict[str, object] = {} @@ -182,13 +229,14 @@ def test_sync_plan_after_import_handles_plan_exceptions(monkeypatch, capsys) -> ) monkeypatch.setattr(plan_sync_mod, "PLAN_LOAD_EXCEPTIONS", (OSError,)) - plan_sync_mod.sync_plan_after_import( + outcome = plan_sync_mod.sync_plan_after_import( state={}, diff={"new": 1, "reopened": 0}, assessment_mode="issues_only", ) out = capsys.readouterr().out - assert "skipped plan sync after review import" in out + assert "Plan sync degraded" in out + assert outcome.status == "degraded" def test_sync_plan_after_import_runs_review_sync_for_auto_resolved_deltas(monkeypatch) -> None: @@ -296,6 +344,7 @@ def test_sync_plan_after_import_logs_triage_provenance(monkeypatch) -> None: assert detail["triage_injected_ids"] == ["triage::observe", "triage::reflect"] assert detail["triage_deferred"] is False assert detail["stale_pruned_from_queue"] == [] + assert detail["sync_status"] == "synced" def test_sync_plan_after_import_keeps_workflow_before_triage(monkeypatch) -> None: @@ -778,19 +827,20 @@ def test_plan_sync_source_preserves_scoped_sync_pipeline_contract() -> None: assert "plan_path = None" in src assert "plan_path_for_state(Path(state_file))" in src assert "if not has_living_plan(plan_path):" in src + assert 'return PlanImportSyncOutcome(status="skipped")' in src assert "plan = load_plan(plan_path)" in src assert 'trusted = assessment_mode in {"trusted_internal", "attested_external"}' in src - assert "import_result = _sync_review_delta(plan, state, sync_inputs)" in src - assert "import_scores_result = sync_import_scores_needed(" in src - assert "clear_score_communicated_sentinel(plan)" in src assert "sync_inputs = _build_import_sync_inputs(diff, import_payload)" in src - assert "result = ReconcileResult()" in src assert "was_boundary_ready = live_planned_queue_empty(plan)" in src - assert "if was_boundary_ready and (" in src - assert "_prune_covered_subjective_ids_from_plan" in src + assert "transition = _apply_import_plan_transitions(" in src + assert "import_result = transition.import_result" in src + assert "covered_pruned = transition.covered_pruned" in src + assert "import_scores_result = transition.import_scores_result" in src + assert "result = transition.reconcile_result" in src assert "_append_review_import_sync_log(" in src assert "save_plan(plan, plan_path)" in src assert "_print_review_import_sync(" in src + assert 'return PlanImportSyncOutcome(status="degraded", message=message)' in src def test_results_source_preserves_query_and_narrative_contract() -> None: diff --git a/desloppify/tests/commands/review/test_review_runner_helpers_direct.py b/desloppify/tests/commands/review/test_review_runner_helpers_direct.py index d525b736..146da040 100644 --- a/desloppify/tests/commands/review/test_review_runner_helpers_direct.py +++ b/desloppify/tests/commands/review/test_review_runner_helpers_direct.py @@ -8,6 +8,7 @@ import desloppify.app.commands.review.batch.prompt_template as prompt_template_mod import desloppify.app.commands.review.runner_parallel as runner_helpers_mod +from desloppify.app.commands.review.batch.execution import CollectBatchResultsRequest def test_execute_batches_parallel_emits_heartbeat_event() -> None: @@ -75,10 +76,12 @@ def test_collect_batch_results_recovers_from_log_stdout_payload(tmp_path: Path) ) batch_results, failures = runner_helpers_mod.collect_batch_results( - selected_indexes=[0], - failures=[0], - output_files={0: raw_path}, - allowed_dims={"logic_clarity"}, + request=CollectBatchResultsRequest( + selected_indexes=[0], + failures=[0], + output_files={0: raw_path}, + allowed_dims={"logic_clarity"}, + ), extract_payload_fn=lambda raw: json.loads(raw), normalize_result_fn=lambda parsed, _allowed: ( parsed.get("assessments", {}), @@ -102,10 +105,12 @@ def test_collect_batch_results_marks_failure_on_normalize_error(tmp_path: Path) raw_path.write_text(json.dumps({"assessments": {"logic_clarity": 50.0}, "issues": []})) batch_results, failures = runner_helpers_mod.collect_batch_results( - selected_indexes=[0], - failures=[], - output_files={0: raw_path}, - allowed_dims={"logic_clarity"}, + request=CollectBatchResultsRequest( + selected_indexes=[0], + failures=[], + output_files={0: raw_path}, + allowed_dims={"logic_clarity"}, + ), extract_payload_fn=lambda raw: json.loads(raw), normalize_result_fn=lambda _parsed, _allowed: (_ for _ in ()).throw( ValueError("normalize failed") diff --git a/desloppify/tests/commands/scan/test_scan_preflight.py b/desloppify/tests/commands/scan/test_scan_preflight.py index 08e7a6f8..d1fa4c6d 100644 --- a/desloppify/tests/commands/scan/test_scan_preflight.py +++ b/desloppify/tests/commands/scan/test_scan_preflight.py @@ -164,12 +164,46 @@ def test_queue_with_only_workflow_items_blocks_scan(): "desloppify.app.commands.scan.preflight.plan_aware_queue_breakdown", return_value=breakdown, ), + patch( + "desloppify.app.commands.scan.preflight._only_run_scan_workflow_remaining", + return_value=False, + ), pytest.raises(CommandError), ): mock_state_mod.load_state.return_value = {"issues": {}} scan_queue_preflight(args) +def test_queue_with_only_run_scan_workflow_allows_scan(): + """The synthetic workflow::run-scan item must not block scan execution.""" + from desloppify.app.commands.helpers.queue_progress import QueueBreakdown + + args = SimpleNamespace(profile=None, force_rescan=False, state=None, lang="python") + plan = {"plan_start_scores": {"strict": 80.0}} + breakdown = QueueBreakdown(queue_total=1, workflow=1) + with ( + patch( + "desloppify.app.commands.scan.preflight.resolve_plan_load_status", + return_value=_plan_status(plan), + ), + patch( + "desloppify.app.commands.scan.preflight.state_path", + return_value="/tmp/test-state.json", + ), + patch("desloppify.app.commands.scan.preflight.state_mod") as mock_state_mod, + patch( + "desloppify.app.commands.scan.preflight.plan_aware_queue_breakdown", + return_value=breakdown, + ), + patch( + "desloppify.app.commands.scan.preflight._only_run_scan_workflow_remaining", + return_value=True, + ), + ): + mock_state_mod.load_state.return_value = {"issues": {}} + scan_queue_preflight(args) + + # ── --force-rescan ────────────────────────────────────────── diff --git a/desloppify/tests/commands/test_cmd_move.py b/desloppify/tests/commands/test_cmd_move.py index 40ba059d..3ad2967d 100644 --- a/desloppify/tests/commands/test_cmd_move.py +++ b/desloppify/tests/commands/test_cmd_move.py @@ -284,7 +284,7 @@ def _fake_import(module_name: str): raise AssertionError(f"unexpected import request: {module_name}") monkeypatch.setattr( - "desloppify.app.commands.move.language.importlib.import_module", + "desloppify.app.commands.helpers.dynamic_loaders.importlib.import_module", _fake_import, ) assert load_lang_move_module("python") is scaffold @@ -300,7 +300,7 @@ def _fake_import(module_name: str): raise AssertionError(f"unexpected import request: {module_name}") monkeypatch.setattr( - "desloppify.app.commands.move.language.importlib.import_module", + "desloppify.app.commands.helpers.dynamic_loaders.importlib.import_module", _fake_import, ) diff --git a/desloppify/tests/commands/test_direct_coverage_modules.py b/desloppify/tests/commands/test_direct_coverage_modules.py index 0105c2d4..9a2f172c 100644 --- a/desloppify/tests/commands/test_direct_coverage_modules.py +++ b/desloppify/tests/commands/test_direct_coverage_modules.py @@ -80,8 +80,7 @@ import desloppify.languages.rust.move as rust_move_mod import desloppify.languages.rust.phases_smells as rust_phases_smells_mod import desloppify.languages.typescript.detectors.smells.detector_safety as ts_smell_detectors_safety -import desloppify.languages.typescript.detectors.smells.helpers_blocks as ts_smell_blocks_mod -import desloppify.languages.typescript.detectors.smells.helpers_line_state as ts_smell_line_state_mod +import desloppify.languages.typescript.detectors.smells.helpers as ts_smell_helpers_mod import desloppify.languages.typescript.detectors.deps.runtime as ts_deps_runtime import desloppify.languages.typescript.extractors_components as ts_extractors_components from desloppify.engine._work_queue.models import QueueBuildOptions, QueueVisibility @@ -432,15 +431,15 @@ def test_typescript_split_smell_helpers_have_direct_coverage(): " }", "}", ] - assert ts_smell_blocks_mod._track_brace_body(lines, 0) == 5 - body = ts_smell_blocks_mod._extract_block_body("if (ok) { keep(); }", 8) + assert ts_smell_helpers_mod._track_brace_body(lines, 0) == 5 + body = ts_smell_helpers_mod._extract_block_body("if (ok) { keep(); }", 8) assert body == " keep(); " - masked = ts_smell_blocks_mod._code_text('const x = "message"; // hi') + masked = ts_smell_helpers_mod._code_text('const x = "message"; // hi') assert "message" not in masked - assert ts_smell_line_state_mod._scan_template_content("x`${a}`", 1, 0)[1] is True - assert ts_smell_line_state_mod._scan_code_line("/* open comment") == (True, False, 0) - states = ts_smell_line_state_mod._build_ts_line_state( + assert ts_smell_helpers_mod._scan_template_content("x`${a}`", 1, 0)[1] is True + assert ts_smell_helpers_mod._scan_code_line("/* open comment") == (True, False, 0) + states = ts_smell_helpers_mod._build_ts_line_state( [ "const a = 1;", "/* block", diff --git a/desloppify/tests/commands/test_lifecycle_transitions.py b/desloppify/tests/commands/test_lifecycle_transitions.py index f156a84f..7f0dfbdb 100644 --- a/desloppify/tests/commands/test_lifecycle_transitions.py +++ b/desloppify/tests/commands/test_lifecycle_transitions.py @@ -115,7 +115,7 @@ def _queue_ids(state: dict, plan: dict) -> list[str]: return [item["id"] for item in result["items"]] -def _spoof_reviews_complete(state: dict, *, score: float = 95.0) -> None: +def _spoof_reviews_complete(state: dict, *, score: float = 100.0) -> None: """Mutate state in place: replace all placeholder dims with scored ones.""" for key in DIM_KEYS: display, dim_entry, assessment = _scored_dim_entries(key, score) @@ -306,9 +306,14 @@ def test_triage_after_review_issues_on_scan(self, monkeypatch): assert len(triage_ids) == len(TRIAGE_STAGE_IDS), ids # After triage completes for the live review issue set, the findings surface. - plan.setdefault("epic_triage_meta", {})["triaged_ids"] = sorted( + triage_meta = plan.setdefault("epic_triage_meta", {}) + triage_meta["triaged_ids"] = sorted( fid for fid in state["work_items"] if state["work_items"][fid].get("detector") == "review" ) + triage_meta["triage_stages"] = { + stage_id.removeprefix("triage::"): {"confirmed_at": "2026-03-13T00:00:00+00:00"} + for stage_id in TRIAGE_STAGE_IDS + } purge_ids(plan, TRIAGE_STAGE_IDS) ids = _queue_ids(state, plan) review_ids = [fid for fid in ids if fid.startswith("review")] @@ -387,9 +392,14 @@ def test_golden_path(self, monkeypatch): ) # ── Complete triage → review findings finally become executable ── - plan.setdefault("epic_triage_meta", {})["triaged_ids"] = sorted( + triage_meta = plan.setdefault("epic_triage_meta", {}) + triage_meta["triaged_ids"] = sorted( fid for fid in state["work_items"] if state["work_items"][fid].get("detector") == "review" ) + triage_meta["triage_stages"] = { + stage_id.removeprefix("triage::"): {"confirmed_at": "2026-03-13T00:00:00+00:00"} + for stage_id in TRIAGE_STAGE_IDS + } purge_ids(plan, list(TRIAGE_STAGE_IDS)) ids = _queue_ids(state, plan) assert not any(fid.startswith("triage::") for fid in ids), f"Post-triage: {ids}" diff --git a/desloppify/tests/core/test_hook_registry.py b/desloppify/tests/core/test_hook_registry.py index 1c83e1d4..1edb53ba 100644 --- a/desloppify/tests/core/test_hook_registry.py +++ b/desloppify/tests/core/test_hook_registry.py @@ -54,11 +54,13 @@ def _fake_import_module(name: str, package: str | None = None): monkeypatch.setattr(registry_mod.importlib, "import_module", _fake_import_module) + # First attempt fails (transient import error), hook returns None. assert get_lang_hook("retrylang", "test_coverage") is None + # Second attempt succeeds via lazy bootstrap. assert get_lang_hook("retrylang", "test_coverage") is sentinel -def test_get_lang_hook_bootstraps_module_register_entrypoint(monkeypatch) -> None: +def test_register_lang_hooks_supports_module_register_entrypoint(monkeypatch) -> None: clear_lang_hooks_for_tests() sentinel = object() real_import_module = importlib.import_module @@ -77,5 +79,5 @@ def _fake_import_module(name: str, package: str | None = None): monkeypatch.setattr(registry_mod.importlib, "import_module", _fake_import_module) + # Lazy bootstrap should call register() which registers the hook. assert get_lang_hook("bootstraplang", "test_coverage") is sentinel - diff --git a/desloppify/tests/engine/test_planning_public_contract_direct.py b/desloppify/tests/engine/test_planning_public_contract_direct.py index 8544e0da..13e6ba95 100644 --- a/desloppify/tests/engine/test_planning_public_contract_direct.py +++ b/desloppify/tests/engine/test_planning_public_contract_direct.py @@ -17,7 +17,7 @@ def test_runtime_modules_use_canonical_state_and_plan_surfaces() -> None: ["from desloppify.state_io import StateModel, save_state"], ["from desloppify.state import"], ), - "app/commands/plan/override_io.py": ( + "app/commands/plan/override/io.py": ( ["from desloppify.state_io import StateModel, get_state_file, save_state"], ["from desloppify import state as state_mod"], ), diff --git a/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py b/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py index c0765df3..f32ff6a6 100644 --- a/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py +++ b/desloppify/tests/intelligence/test_review_import_prepare_split_direct.py @@ -359,6 +359,31 @@ def test_authorization_collector_uses_module_fallback_for_with_auth_siblings() - assert "ui/home.py" not in files +def test_authorization_collector_excludes_guidance_like_runtime_paths() -> None: + ctx = SimpleNamespace( + authorization={ + "route_auth_coverage": { + "guidance/auth_examples.py": { + "handlers": 1, + "with_auth": 0, + "without_auth": 1, + }, + "src/routes/admin.py": {"handlers": 1, "with_auth": 0, "without_auth": 1}, + }, + "service_role_usage": ["prompts/security_prompt.ts", "src/lib/supabase.ts"], + "rls_coverage": { + "files": { + "accounts": ["docs/rls_examples.sql", "db/schema.sql"], + } + }, + } + ) + + files = collectors_structure_mod._authorization_files(ctx, max_files=10) + + assert files == ["src/routes/admin.py", "src/lib/supabase.ts", "db/schema.sql"] + + def test_prepare_batches_core_path_normalization_rules() -> None: assert prepare_batches_core_mod._normalize_file_path(" src/app.py ") == "src/app.py" assert prepare_batches_core_mod._normalize_file_path('"README",') == "README" diff --git a/desloppify/tests/plan/test_auto_cluster.py b/desloppify/tests/plan/test_auto_cluster.py index b6023034..845bbaad 100644 --- a/desloppify/tests/plan/test_auto_cluster.py +++ b/desloppify/tests/plan/test_auto_cluster.py @@ -252,6 +252,26 @@ def test_remove_from_cluster_clears_focus_when_cluster_becomes_non_actionable(): assert plan["active_cluster"] is None +def test_remove_from_cluster_also_clears_step_issue_refs(): + plan = empty_plan() + ensure_plan_defaults(plan) + create_cluster(plan, "manual/cleanup") + add_to_cluster(plan, "manual/cleanup", ["u1", "u2"]) + plan["clusters"]["manual/cleanup"]["action_steps"] = [ + {"title": "Fix first issue", "issue_refs": ["u1"]}, + {"title": "Fix both issues", "issue_refs": ["u1", "u2"]}, + {"title": "Keep second issue", "issue_refs": ["u2"]}, + ] + + removed = remove_from_cluster(plan, "manual/cleanup", ["u1"]) + + assert removed == 1 + assert plan["clusters"]["manual/cleanup"]["issue_ids"] == ["u2"] + assert plan["clusters"]["manual/cleanup"]["action_steps"][0]["issue_refs"] == [] + assert plan["clusters"]["manual/cleanup"]["action_steps"][1]["issue_refs"] == ["u2"] + assert plan["clusters"]["manual/cleanup"]["action_steps"][2]["issue_refs"] == ["u2"] + + def test_auto_cluster_deletes_stale(): plan = empty_plan() state = _state_with( diff --git a/desloppify/tests/plan/test_reconcile_pipeline.py b/desloppify/tests/plan/test_reconcile_pipeline.py index ad2f2e9d..db37507b 100644 --- a/desloppify/tests/plan/test_reconcile_pipeline.py +++ b/desloppify/tests/plan/test_reconcile_pipeline.py @@ -129,6 +129,53 @@ def test_reconcile_plan_second_call_is_noop() -> None: assert result2.workflow_injected_ids == [] +def test_reconcile_plan_holds_workflow_until_current_scan_subjective_review_completes() -> None: + """Postflight review must run before communicate-score/create-plan.""" + state = { + "issues": {"unused::a": _issue("unused::a")}, + "scan_count": 19, + "dimension_scores": { + "Naming quality": { + "score": 82.0, + "strict": 82.0, + "failing": 0, + "checks": 1, + "detectors": { + "subjective_assessment": {"dimension_key": "naming_quality"}, + }, + } + }, + "subjective_assessments": { + "naming_quality": {"score": 82.0, "placeholder": False} + }, + } + plan = empty_plan() + plan["refresh_state"] = {"postflight_scan_completed_at_scan_count": 19} + + result = reconcile_plan(plan, state, target_strict=95.0) + + assert "subjective::naming_quality" in plan["queue_order"] + assert WORKFLOW_COMMUNICATE_SCORE_ID not in plan["queue_order"] + assert WORKFLOW_CREATE_PLAN_ID not in plan["queue_order"] + assert result.workflow_injected_ids == [] + + plan["queue_order"] = [ + issue_id + for issue_id in plan["queue_order"] + if issue_id != "subjective::naming_quality" + ] + plan["refresh_state"]["subjective_review_completed_at_scan_count"] = 19 + + result = reconcile_plan(plan, state, target_strict=95.0) + + assert WORKFLOW_COMMUNICATE_SCORE_ID in plan["queue_order"] + assert WORKFLOW_CREATE_PLAN_ID in plan["queue_order"] + assert result.workflow_injected_ids == [ + WORKFLOW_COMMUNICATE_SCORE_ID, + WORKFLOW_CREATE_PLAN_ID, + ] + + # --------------------------------------------------------------------------- # Mid-cycle auto-clustering guard # --------------------------------------------------------------------------- diff --git a/desloppify/tests/review/batch/test_split_modules_direct.py b/desloppify/tests/review/batch/test_split_modules_direct.py index 35bbd719..fcccce73 100644 --- a/desloppify/tests/review/batch/test_split_modules_direct.py +++ b/desloppify/tests/review/batch/test_split_modules_direct.py @@ -47,12 +47,12 @@ def test_import_shared_extract_reviewed_files_deduplicates(): assert reviewed == ["a.py", "b.py"] -def test_import_shared_parse_payload_accepts_legacy_findings_alias(): - parsed = parse_review_import_payload( - {"findings": [{"summary": "legacy payload"}]}, - mode_name="Holistic", - ) - assert parsed.issues == [{"summary": "legacy payload"}] +def test_import_shared_parse_payload_requires_canonical_issues_key(): + with pytest.raises(ValueError, match="must contain 'issues'"): + parse_review_import_payload( + {"findings": [{"summary": "legacy payload"}]}, + mode_name="Holistic", + ) def test_store_assessments_keeps_holistic_precedence(): diff --git a/desloppify/tests/review/context/test_context_builder_direct.py b/desloppify/tests/review/context/test_context_builder_direct.py index 8662dd5a..7514faa7 100644 --- a/desloppify/tests/review/context/test_context_builder_direct.py +++ b/desloppify/tests/review/context/test_context_builder_direct.py @@ -6,7 +6,10 @@ from types import SimpleNamespace from desloppify.intelligence.review._context.models import ReviewContext -from desloppify.intelligence.review.context_builder import build_review_context_inner +from desloppify.intelligence.review.context_builder import ( + ReviewContextBuildServices, + build_review_context_inner, +) class _ZoneMap: @@ -51,21 +54,23 @@ def test_build_review_context_inner_populates_sections() -> None: lang, state, ReviewContext(), - read_file_text_fn=lambda path: content_by_path.get(path), - abs_path_fn=lambda path: path, - rel_fn=lambda path: path, - importer_count_fn=lambda entry: entry.get("importers", 0), - default_review_module_patterns_fn=lambda content: ["service"] if "def" in content else [], - func_name_re=re.compile(r"def\s+([A-Za-z_]\w*)"), - class_name_re=re.compile(r"class\s+([A-Za-z_]\w*)"), - name_prefix_re=re.compile(r"([a-z]+)"), - error_patterns={ - "has_try": re.compile(r"\btry\b"), - "has_raise": re.compile(r"\braise\b"), - }, - gather_ai_debt_signals_fn=lambda file_contents, rel_fn: {"files": sorted(file_contents)}, - gather_auth_context_fn=lambda file_contents, rel_fn: {"auth_files": len(file_contents)}, - classify_error_strategy_fn=lambda content: "raises" if "raise" in content else "returns", + ReviewContextBuildServices( + read_file_text=lambda path: content_by_path.get(path), + abs_path=lambda path: path, + rel_path=lambda path: path, + importer_count=lambda entry: entry.get("importers", 0), + default_review_module_patterns=lambda content: ["service"] if "def" in content else [], + gather_ai_debt_signals=lambda file_contents, rel_fn: {"files": sorted(file_contents)}, + gather_auth_context=lambda file_contents, rel_fn: {"auth_files": len(file_contents)}, + classify_error_strategy=lambda content: "raises" if "raise" in content else "returns", + func_name_re=re.compile(r"def\s+([A-Za-z_]\w*)"), + class_name_re=re.compile(r"class\s+([A-Za-z_]\w*)"), + name_prefix_re=re.compile(r"([a-z]+)"), + error_patterns={ + "has_try": re.compile(r"\btry\b"), + "has_raise": re.compile(r"\braise\b"), + }, + ), ) assert ctx.naming_vocabulary["total_names"] == 3 @@ -94,20 +99,24 @@ def test_build_review_context_inner_falls_back_to_default_module_patterns() -> N lang, {"issues": {}}, ReviewContext(), - read_file_text_fn=lambda _path: "def run_task():\n return 1\n", - abs_path_fn=lambda path: path, - rel_fn=lambda path: path, - importer_count_fn=lambda _entry: 0, - default_review_module_patterns_fn=lambda _content: ["fallback_pattern", "fallback_pattern"], - func_name_re=re.compile(r"def\s+([A-Za-z_]\w*)"), - class_name_re=re.compile(r"class\s+([A-Za-z_]\w*)"), - name_prefix_re=re.compile(r"([a-z]+)"), - error_patterns={}, - gather_ai_debt_signals_fn=lambda _file_contents, rel_fn: {}, - gather_auth_context_fn=lambda _file_contents, rel_fn: {}, - classify_error_strategy_fn=lambda _content: "", + ReviewContextBuildServices( + read_file_text=lambda _path: "def run_task():\n return 1\n", + abs_path=lambda path: path, + rel_path=lambda path: path, + importer_count=lambda _entry: 0, + default_review_module_patterns=lambda _content: [ + "fallback_pattern", + "fallback_pattern", + ], + gather_ai_debt_signals=lambda _file_contents, rel_fn: {}, + gather_auth_context=lambda _file_contents, rel_fn: {}, + classify_error_strategy=lambda _content: "", + func_name_re=re.compile(r"def\s+([A-Za-z_]\w*)"), + class_name_re=re.compile(r"class\s+([A-Za-z_]\w*)"), + name_prefix_re=re.compile(r"([a-z]+)"), + error_patterns={}, + ), ) assert ctx.module_patterns == {} assert ctx.codebase_stats["avg_file_loc"] == 2 - diff --git a/desloppify/tests/review/context/test_mechanical_evidence.py b/desloppify/tests/review/context/test_mechanical_evidence.py index 14f57675..cd1aa1fd 100644 --- a/desloppify/tests/review/context/test_mechanical_evidence.py +++ b/desloppify/tests/review/context/test_mechanical_evidence.py @@ -495,6 +495,36 @@ def test_no_change_doesnt_mark_stale(self): dc = state["subjective_assessments"]["design_coherence"] assert "needs_review_refresh" not in dc + def test_fresh_trusted_import_survives_immediate_reconcile_scan(self): + from desloppify.engine._state.merge import merge_scan + from desloppify.engine._state.schema import empty_state + + state = empty_state() + state["last_scan"] = "2026-03-13T13:09:25+00:00" + state["assessment_import_audit"] = [ + { + "mode": "trusted_internal", + "timestamp": "2026-03-13T15:14:29+00:00", + } + ] + state["subjective_assessments"] = { + "design_coherence": { + "score": 79.0, + "assessed_at": "2026-03-13T15:14:29+00:00", + "source": "holistic", + }, + } + + new_issues = [ + _issue(id="s1", detector="structural", file="big.py", detail={"loc": 500}), + ] + merge_scan(state, new_issues) + + dc = state["subjective_assessments"]["design_coherence"] + assert "needs_review_refresh" not in dc + assert "refresh_reason" not in dc + assert "stale_since" not in dc + def test_already_stale_not_overwritten(self): from desloppify.engine._state.merge import merge_scan from desloppify.engine._state.schema import empty_state diff --git a/desloppify/tests/review/context/test_review_context_signals_direct.py b/desloppify/tests/review/context/test_review_context_signals_direct.py index 5b969b8b..d84727b9 100644 --- a/desloppify/tests/review/context/test_review_context_signals_direct.py +++ b/desloppify/tests/review/context/test_review_context_signals_direct.py @@ -103,6 +103,17 @@ def test_gather_auth_context_ignores_non_source_guidance_files(): assert result == {} +def test_gather_auth_context_ignores_runtime_extensions_in_guidance_paths() -> None: + file_contents = { + "guidance/auth_examples.py": "@app.get('/docs')\ndef route():\n request.user\n", + "prompts/security_prompt.ts": "const k = service_role; createClient(url, k)", + "src/routes/admin.py": "@app.get('/admin')\ndef route():\n return 1\n", + } + result = signal_auth_mod.gather_auth_context(file_contents, rel_fn=lambda p: p) + assert list(result["route_auth_coverage"]) == ["src/routes/admin.py"] + assert "service_role_usage" not in result + + def test_gather_auth_context_counts_public_route_markers_separately(): file_contents = { "api.py": ( diff --git a/desloppify/tests/review/review_commands_runner_cases.py b/desloppify/tests/review/review_commands_runner_cases.py index 2b6e5d8a..b766ba44 100644 --- a/desloppify/tests/review/review_commands_runner_cases.py +++ b/desloppify/tests/review/review_commands_runner_cases.py @@ -15,6 +15,7 @@ import desloppify.app.commands.review.runner_parallel as runner_parallel_mod import desloppify.app.commands.runner.codex_batch as runner_process_mod from desloppify.app.commands.review.batch.orchestrator import do_run_batches +from desloppify.app.commands.review.batch.execution import CollectBatchResultsRequest from desloppify.base.exception_sets import CommandError runner_helpers_mod = SimpleNamespace( @@ -67,10 +68,12 @@ def normalize_result(payload, _allowed_dims): return payload.get("assessments", {}), payload.get("issues", []), notes, {}, {}, {} batch_results, failures = runner_helpers_mod.collect_batch_results( - selected_indexes=[0], - failures=[0], - output_files={0: output_file}, - allowed_dims={"logic_clarity"}, + request=CollectBatchResultsRequest( + selected_indexes=[0], + failures=[0], + output_files={0: output_file}, + allowed_dims={"logic_clarity"}, + ), extract_payload_fn=lambda raw: json.loads(raw), normalize_result_fn=normalize_result, ) @@ -115,10 +118,12 @@ def extract_payload(raw: str) -> dict[str, object] | None: return None batch_results, failures = runner_helpers_mod.collect_batch_results( - selected_indexes=[0], - failures=[], - output_files={0: raw_path}, - allowed_dims={"logic_clarity"}, + request=CollectBatchResultsRequest( + selected_indexes=[0], + failures=[], + output_files={0: raw_path}, + allowed_dims={"logic_clarity"}, + ), extract_payload_fn=extract_payload, normalize_result_fn=lambda payload, _allowed: ( # noqa: ARG005 payload.get("assessments", {}), @@ -479,6 +484,102 @@ def test_do_run_batches_scan_after_import_exits_on_failed_followup( assert exc_info.value.exit_code == 7 + def test_do_run_batches_success_path_imports_merged_results( + self, empty_state, tmp_path + ): + packet = { + "command": "review", + "mode": "holistic", + "language": "typescript", + "dimensions": ["high_level_elegance"], + "investigation_batches": [ + { + "name": "Batch A", + "dimensions": ["high_level_elegance"], + "files_to_read": ["src/a.ts"], + "why": "A", + } + ], + } + packet_path = tmp_path / "packet.json" + packet_path.write_text(json.dumps(packet)) + + args = MagicMock() + args.path = str(tmp_path) + args.dimensions = None + args.runner = "codex" + args.parallel = False + args.dry_run = False + args.packet = str(packet_path) + args.only_batches = None + args.scan_after_import = False + args.allow_partial = True + args.save_run_log = True + args.run_log_file = None + + review_packet_dir = tmp_path / ".desloppify" / "review_packets" + runs_dir = tmp_path / ".desloppify" / "subagents" / "runs" + + lang = MagicMock() + lang.name = "typescript" + + with ( + patch( + "desloppify.app.commands.review.runtime_paths.PROJECT_ROOT", + tmp_path, + ), + patch( + "desloppify.app.commands.review.runtime_paths.REVIEW_PACKET_DIR", + review_packet_dir, + ), + patch( + "desloppify.app.commands.review.runtime_paths.SUBAGENT_RUNS_DIR", + runs_dir, + ), + patch( + "desloppify.app.commands.review.batch.execution_phases.scored_dimensions_for_lang", + return_value=["high_level_elegance"], + ), + patch( + "desloppify.app.commands.review.batch.orchestrator.execute_batches", + return_value=[], + ), + patch( + "desloppify.app.commands.review.batch.orchestrator.collect_batch_results", + return_value=( + [ + runner_parallel_mod.BatchResult( + batch_index=1, + assessments={"high_level_elegance": 84.0}, + dimension_notes={}, + issues=[], + quality={}, + ) + ], + [], + ), + ), + patch( + "desloppify.app.commands.review.batch.orchestrator._merge_batch_results", + return_value={ + "assessments": {"high_level_elegance": 84.0}, + "dimension_notes": {}, + "issues": [], + "review_quality": {}, + }, + ), + patch( + "desloppify.app.commands.review.batch.orchestrator.run_followup_scan", + ) as run_followup_scan, + patch( + "desloppify.app.commands.review.batch.orchestrator._do_import", + ) as do_import, + ): + do_run_batches(args, empty_state, lang, "fake_sp", config={}) + + do_import.assert_called_once() + run_followup_scan.assert_not_called() + def test_do_run_batches_keyboard_interrupt_writes_partial_summary( self, empty_state, tmp_path ): @@ -552,4 +653,3 @@ def test_do_run_batches_keyboard_interrupt_writes_partial_summary( run_log_path = Path(summary_payload["run_log"]) run_log_text = run_log_path.read_text() assert "run-interrupted reason=keyboard_interrupt" in run_log_text - diff --git a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py index e8c65c9f..e539d058 100644 --- a/desloppify/tests/review/test_work_queue_plan_order_and_triage.py +++ b/desloppify/tests/review/test_work_queue_plan_order_and_triage.py @@ -257,6 +257,39 @@ def test_legacy_force_visible_triage_stage_is_ignored_during_execute(): assert ids == ["smells::src/a.py::x"] +def test_stale_triage_surfaces_observe_instead_of_empty_queue(): + """When new review findings exist after triage, next should surface triage recovery.""" + from desloppify.engine._plan.schema import empty_plan + + review_issue = _issue( + "review::.::holistic::design_coherence::needs_triage", + detector="review", + tier=4, + confidence="high", + detail={"dimension": "design_coherence", "holistic": True}, + ) + state = _state([review_issue]) + state["scan_count"] = 7 + + plan = empty_plan() + plan["queue_order"] = [review_issue["id"]] + plan["refresh_state"] = { + "lifecycle_phase": "review_postflight", + "postflight_scan_completed_at_scan_count": 7, + } + plan["epic_triage_meta"] = { + "triaged_ids": ["review::.::holistic::older::already_triaged"], + "triage_stages": { + "observe": {"confirmed_at": "2026-03-13T14:00:00+00:00"}, + "reflect": {"confirmed_at": "2026-03-13T14:01:00+00:00"}, + }, + } + + queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) + ids = [item["id"] for item in queue["items"]] + assert ids[0] == "triage::observe" + + def test_postflight_synthetic_queue_keeps_objective_backlog_suppressed(): """Synthetic-only postflight work must not reactivate implicit execute mode.""" from desloppify.engine._plan.schema import empty_plan @@ -762,3 +795,49 @@ def test_triage_stages_sort_after_workflow_in_natural_ranking(): wf_key = item_sort_key(workflow_item) tr_key = item_sort_key(triage_item) assert wf_key < tr_key, "workflow actions should sort before triage stages" + + +def test_fresh_under_target_postflight_review_preempts_persisted_workflow() -> None: + """Fresh below-target postflight review surfaces before queued workflow items.""" + state = _state( + [], + dimension_scores={ + "Naming quality": { + "score": 82.0, + "strict": 82.0, + "failing": 0, + "checks": 1, + "detectors": { + "subjective_assessment": { + "dimension_key": "naming_quality", + "placeholder": False, + }, + }, + }, + }, + ) + state["scan_count"] = 19 + state["subjective_assessments"] = { + "naming_quality": { + "score": 82.0, + "placeholder": False, + } + } + plan = { + "queue_order": ["workflow::communicate-score", "workflow::create-plan"], + "queue_skipped": {}, + "refresh_state": { + "postflight_scan_completed_at_scan_count": 19, + "lifecycle_phase": "workflow_postflight", + }, + } + + queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) + assert [item["id"] for item in queue["items"]] == ["subjective::naming_quality"] + + plan["refresh_state"]["subjective_review_completed_at_scan_count"] = 19 + queue = build_work_queue(state, count=None, include_subjective=True, plan=plan) + assert [item["id"] for item in queue["items"]] == [ + "workflow::communicate-score", + "workflow::create-plan", + ] diff --git a/desloppify/tests/workflows/test_tweet_release_script.py b/desloppify/tests/workflows/test_tweet_release_script.py new file mode 100644 index 00000000..06687ce5 --- /dev/null +++ b/desloppify/tests/workflows/test_tweet_release_script.py @@ -0,0 +1,217 @@ +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path +from types import SimpleNamespace +from uuid import uuid4 + +import pytest + + +SCRIPT_PATH = ( + Path(__file__).resolve().parents[3] + / ".github" + / "workflows" + / "scripts" + / "tweet_release.py" +) + + +def _load_tweet_release_module(monkeypatch: pytest.MonkeyPatch): + anthropic_stub = SimpleNamespace(Anthropic=lambda: SimpleNamespace(messages=None)) + tweepy_stub = SimpleNamespace( + OAuth1UserHandler=lambda *args, **kwargs: None, + API=lambda auth: None, + Client=lambda **kwargs: None, + errors=SimpleNamespace(TwitterServerError=RuntimeError), + ) + monkeypatch.setitem(sys.modules, "anthropic", anthropic_stub) + monkeypatch.setitem(sys.modules, "tweepy", tweepy_stub) + + module_name = f"tweet_release_test_{uuid4().hex}" + spec = importlib.util.spec_from_file_location(module_name, SCRIPT_PATH) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_generate_image_uses_timeout_and_wraps_request_failure( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_tweet_release_module(monkeypatch) + seen: dict[str, object] = {} + + def fake_post(*args, **kwargs): + seen["timeout"] = kwargs["timeout"] + raise module.requests.Timeout("too slow") + + monkeypatch.setattr(module.requests, "post", fake_post) + + with pytest.raises(module.ReleaseTweetError, match="fal.ai request failed"): + module.generate_image("prompt", "key") + + assert seen["timeout"] == module.REQUEST_TIMEOUT_SECONDS + + +def test_generate_tweet_and_prompt_wraps_bad_claude_payload( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_tweet_release_module(monkeypatch) + + class _Messages: + @staticmethod + def create(**_kwargs): + return SimpleNamespace(content=[SimpleNamespace(text="{not json}")]) + + monkeypatch.setattr( + module.anthropic, + "Anthropic", + lambda: SimpleNamespace(messages=_Messages()), + ) + + with pytest.raises(module.ReleaseTweetError, match="Anthropic returned invalid JSON payload"): + module.generate_tweet_and_prompt("v1.2.3", ["Feature"], "https://example.com/release") + + +def test_download_image_uses_timeout_and_wraps_network_failure( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_tweet_release_module(monkeypatch) + seen: dict[str, object] = {} + + def fake_get(*args, **kwargs): + seen["timeout"] = kwargs["timeout"] + raise module.requests.ConnectionError("network down") + + monkeypatch.setattr(module.requests, "get", fake_get) + + with pytest.raises(module.ReleaseTweetError, match="image download failed"): + module.download_image("https://example.com/image.png") + + assert seen["timeout"] == module.REQUEST_TIMEOUT_SECONDS + + +def test_main_posts_trimmed_tweet_and_cleans_up( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + module = _load_tweet_release_module(monkeypatch) + image_path = tmp_path / "release.png" + image_path.write_bytes(b"image") + posted: dict[str, str] = {} + + monkeypatch.setenv("RELEASE_TAG", "v1.2.3") + monkeypatch.setenv("RELEASE_BODY", "## First\n## Second") + monkeypatch.setenv("RELEASE_URL", "https://example.com/release") + monkeypatch.setenv("FAL_KEY", "fal-key") + monkeypatch.setattr( + module, + "generate_tweet_and_prompt", + lambda *_args: { + "tweet": "Introducing desloppify v1.2.3!\n" + "\n".join("- feature" for _ in range(80)), + "image_prompt": "draw a release board", + }, + ) + monkeypatch.setattr(module, "generate_image", lambda *_args: "https://example.com/img.png") + monkeypatch.setattr(module, "download_image", lambda *_args: str(image_path)) + + def fake_post(tweet_text: str, image_file: str, reply_text: str) -> None: + posted["tweet"] = tweet_text + posted["image"] = image_file + posted["reply"] = reply_text + + monkeypatch.setattr(module, "post_tweet_with_reply", fake_post) + + module.main() + + assert posted["image"] == str(image_path) + assert len(posted["tweet"]) <= 280 + assert posted["reply"] == "Release notes: https://example.com/release" + assert not image_path.exists() + + +def test_post_tweet_with_reply_wraps_media_upload_failure( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_tweet_release_module(monkeypatch) + + class _Api: + @staticmethod + def media_upload(_image_path): + raise RuntimeError("upload boom") + + monkeypatch.setenv("TWITTER_API_KEY", "key") + monkeypatch.setenv("TWITTER_API_SECRET", "secret") + monkeypatch.setenv("TWITTER_ACCESS_TOKEN", "token") + monkeypatch.setenv("TWITTER_ACCESS_SECRET", "access-secret") + monkeypatch.setattr(module.tweepy, "API", lambda _auth: _Api()) + + with pytest.raises(module.ReleaseTweetError, match="Twitter media upload failed: upload boom"): + module.post_tweet_with_reply("tweet", "/tmp/image.png", "reply") + + +def test_post_tweet_with_reply_wraps_non_retryable_create_tweet_failure( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_tweet_release_module(monkeypatch) + + class _Media: + media_id = "m1" + + class _Api: + @staticmethod + def media_upload(_image_path): + return _Media() + + class _Client: + @staticmethod + def create_tweet(**_kwargs): + raise RuntimeError("tweet boom") + + monkeypatch.setenv("TWITTER_API_KEY", "key") + monkeypatch.setenv("TWITTER_API_SECRET", "secret") + monkeypatch.setenv("TWITTER_ACCESS_TOKEN", "token") + monkeypatch.setenv("TWITTER_ACCESS_SECRET", "access-secret") + monkeypatch.setattr( + module.tweepy, + "errors", + SimpleNamespace(TwitterServerError=type("TwitterServerError", (Exception,), {})), + ) + monkeypatch.setattr(module.tweepy, "API", lambda _auth: _Api()) + monkeypatch.setattr(module.tweepy, "Client", lambda **_kwargs: _Client()) + + with pytest.raises(module.ReleaseTweetError, match="Twitter create_tweet failed: tweet boom"): + module.post_tweet_with_reply("tweet", "/tmp/image.png", "reply") + + +def test_main_exits_cleanly_on_bounded_release_failure( + monkeypatch: pytest.MonkeyPatch, + capsys: pytest.CaptureFixture[str], +) -> None: + module = _load_tweet_release_module(monkeypatch) + + monkeypatch.setenv("RELEASE_TAG", "v1.2.3") + monkeypatch.setenv("RELEASE_BODY", "## First") + monkeypatch.setenv("RELEASE_URL", "https://example.com/release") + monkeypatch.setenv("FAL_KEY", "fal-key") + monkeypatch.setattr( + module, + "generate_tweet_and_prompt", + lambda *_args: { + "tweet": "Introducing desloppify v1.2.3!", + "image_prompt": "draw a release board", + }, + ) + monkeypatch.setattr( + module, + "generate_image", + lambda *_args: (_ for _ in ()).throw(module.ReleaseTweetError("fal.ai request failed")), + ) + + with pytest.raises(SystemExit) as exc_info: + module.main() + + assert exc_info.value.code == 1 + assert "Release tweet failed: fal.ai request failed" in capsys.readouterr().err From e3c131052ad6a47871a3e26b8fe4600b6680bb47 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 18:17:10 +0100 Subject: [PATCH 09/15] chore: update scorecard image Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- assets/scorecard.png | Bin 90863 -> 91353 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/scorecard.png b/assets/scorecard.png index 326ecf0a795c36b72b71e664ff9485caf09d228b..0c72abed72e2bf681d1f2b4411812ba72eeea6f1 100644 GIT binary patch delta 53342 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 CBF{Yl delta 52853 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 From a5a0fdd904f26e0f172d35f6ebd313b11923b571 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 18:20:36 +0100 Subject: [PATCH 10/15] fix: update renamed test reference in Makefile and CI contract Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- Makefile | 2 +- desloppify/tests/ci/test_ci_contracts.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 5836dcea..3a1a8e5c 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ arch: install-ci-tools ci-contracts: install-ci-tools pytest -q desloppify/tests/ci/test_ci_contracts.py - pytest -q desloppify/tests/commands/test_lifecycle_transitions.py -k "subjective_then_score_then_triage" + pytest -q desloppify/tests/commands/test_lifecycle_transitions.py -k "assessment_then_score_when_no_review_followup" integration-roslyn: install-ci-tools pytest -q desloppify/tests/lang/csharp/test_csharp_deps.py -k "roslyn" diff --git a/desloppify/tests/ci/test_ci_contracts.py b/desloppify/tests/ci/test_ci_contracts.py index a8080f45..1d9cee1f 100644 --- a/desloppify/tests/ci/test_ci_contracts.py +++ b/desloppify/tests/ci/test_ci_contracts.py @@ -129,7 +129,7 @@ def test_ci_contracts_target_includes_phase_order_invariant() -> None: text = MAKEFILE.read_text() assert ( 'pytest -q desloppify/tests/commands/test_lifecycle_transitions.py ' - '-k "subjective_then_score_then_triage"' + '-k "assessment_then_score_when_no_review_followup"' ) in text From 7fe01b42f22d6fc030399ed4cace4f848663b3a5 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 19:42:39 +0100 Subject: [PATCH 11/15] fix: improve cxx detector scoping (PR #415) - Filter C/C++ security findings to scoped first-party file set - CMake-based test coverage mapping via add_executable/add_library/target_sources - Disable unsound generic unused-import phase for C++ - Fix _extract_import_name for C++ header extensions (.h, .hh, .hpp) - Remove duplicate test, add missing EOF newlines Co-Authored-By: Dragoy <Dragoy@users.noreply.github.com> --- .../detectors/coverage/mapping_imports.py | 32 +++++++ .../detectors/test_coverage/detector.py | 17 +++- .../treesitter/analysis/unused_imports.py | 41 ++++----- desloppify/languages/cxx/__init__.py | 7 +- .../languages/cxx/detectors/security.py | 8 +- desloppify/languages/cxx/test_coverage.py | 76 +++++++++++++++- .../languages/cxx/tests/test_coverage.py | 86 ++++++++++++++++++- desloppify/languages/cxx/tests/test_init.py | 6 ++ .../languages/cxx/tests/test_security.py | 49 ++++++++++- .../common/test_treesitter_analysis_direct.py | 2 + 10 files changed, 291 insertions(+), 33 deletions(-) diff --git a/desloppify/engine/detectors/coverage/mapping_imports.py b/desloppify/engine/detectors/coverage/mapping_imports.py index f975d257..ddd46d6f 100644 --- a/desloppify/engine/detectors/coverage/mapping_imports.py +++ b/desloppify/engine/detectors/coverage/mapping_imports.py @@ -8,11 +8,13 @@ from desloppify.engine.hook_registry import get_lang_hook + def _load_lang_test_coverage_module(lang_name: str | None): """Load language-specific test coverage helpers from ``lang/<name>/test_coverage.py``.""" return get_lang_hook(lang_name, "test_coverage") or object() + def _infer_lang_name(test_files: set[str], production_files: set[str]) -> str | None: """Infer language from known file extensions when explicit lang is unavailable.""" paths = list(test_files) + list(production_files) @@ -40,6 +42,33 @@ def _infer_lang_name(test_files: set[str], production_files: set[str]) -> str | return None + +def _discover_additional_test_mapping_files( + test_files: set[str], + production_files: set[str], + lang_name: str | None = None, +) -> set[str]: + """Allow language hooks to contribute mapping-only files for coverage discovery.""" + if lang_name is None: + lang_name = _infer_lang_name(test_files, production_files) + mod = _load_lang_test_coverage_module(lang_name) + discover = getattr(mod, "discover_test_mapping_files", None) + if not callable(discover): + return set() + + discovered = discover(test_files, production_files) + if not discovered: + return set() + + result: set[str] = set() + for path in discovered: + if not path: + continue + result.add(str(Path(path).resolve())) + return result + + + def _resolve_import( spec: str, test_path: str, @@ -53,6 +82,7 @@ def _resolve_import( return None + def _resolve_barrel_reexports( filepath: str, production_files: set[str], @@ -68,6 +98,7 @@ def _resolve_barrel_reexports( return set() + def _parse_test_imports( test_path: str, production_files: set[str], @@ -111,6 +142,7 @@ def _parse_test_imports( __all__ = [ + "_discover_additional_test_mapping_files", "_infer_lang_name", "_load_lang_test_coverage_module", "_parse_test_imports", diff --git a/desloppify/engine/detectors/test_coverage/detector.py b/desloppify/engine/detectors/test_coverage/detector.py index 1b7f9502..1080cb49 100644 --- a/desloppify/engine/detectors/test_coverage/detector.py +++ b/desloppify/engine/detectors/test_coverage/detector.py @@ -8,6 +8,9 @@ naming_based_mapping, transitive_coverage, ) +from desloppify.engine.detectors.coverage.mapping_imports import ( + _discover_additional_test_mapping_files, +) from desloppify.engine.policy.zones import FileZoneMap from .discovery import ( @@ -21,6 +24,7 @@ ) + def detect_test_coverage( graph: dict, zone_map: FileZoneMap, @@ -49,14 +53,23 @@ def detect_test_coverage( entries = _no_tests_issues(scorable, graph, lang_name, complexity_map) return entries, potential - directly_tested = set(inline_tested) + mapping_test_files = set(test_files) if test_files: + mapping_test_files |= _discover_additional_test_mapping_files( + test_files, + production_files, + lang_name, + ) + + directly_tested = set(inline_tested) + if mapping_test_files: directly_tested |= import_based_mapping( graph, - test_files, + mapping_test_files, production_files, lang_name, ) + if test_files: directly_tested |= naming_based_mapping(test_files, production_files, lang_name) transitively_tested = transitive_coverage(directly_tested, graph, production_files) diff --git a/desloppify/languages/_framework/treesitter/analysis/unused_imports.py b/desloppify/languages/_framework/treesitter/analysis/unused_imports.py index ea2727a8..f0689991 100644 --- a/desloppify/languages/_framework/treesitter/analysis/unused_imports.py +++ b/desloppify/languages/_framework/treesitter/analysis/unused_imports.py @@ -147,27 +147,28 @@ def _extract_import_name(import_path: str) -> str: "MyApp::Model::User" -> "User" "Data.List" -> "List" """ - # Strip common path separators and take the last segment. - for sep in ("::", ".", "/", "\\"): - if sep in import_path: - parts = import_path.split(sep) - # Filter out empty segments and take the last. - parts = [p for p in parts if p] + candidate = import_path.strip() + for sep in ("/", "\\"): + if sep in candidate: + parts = [p for p in candidate.split(sep) if p] if parts: - name = parts[-1] - # Strip file extensions. - for ext in (".go", ".rs", ".rb", ".py", ".js", ".jsx", ".ts", - ".tsx", ".java", ".kt", ".cs", ".fs", ".ml", - ".ex", ".erl", ".hs", ".lua", ".zig", ".pm", - ".sh", ".pl", ".scala", ".swift", ".php", - ".dart", ".mjs", ".cjs"): - if name.endswith(ext): - name = name[:-len(ext)] - break - return name - - # No separator — the path itself is the name. - return import_path + candidate = parts[-1] + + for ext in (".go", ".rs", ".rb", ".py", ".js", ".jsx", ".ts", + ".tsx", ".java", ".kt", ".cs", ".fs", ".ml", + ".ex", ".erl", ".hs", ".lua", ".zig", ".pm", + ".sh", ".pl", ".scala", ".swift", ".php", + ".dart", ".mjs", ".cjs", ".h", ".hh", ".hpp"): + if candidate.endswith(ext): + return candidate[:-len(ext)] + + for sep in ("::", "."): + if sep in candidate: + parts = [p for p in candidate.split(sep) if p] + if parts: + return parts[-1] + + return candidate __all__ = ["detect_unused_imports"] diff --git a/desloppify/languages/cxx/__init__.py b/desloppify/languages/cxx/__init__.py index 1afed6ac..0698eeb8 100644 --- a/desloppify/languages/cxx/__init__.py +++ b/desloppify/languages/cxx/__init__.py @@ -49,6 +49,11 @@ def detect_lang_security_detailed(self, files, zone_map) -> LangSecurityResult: return detect_cxx_security(files, zone_map) def __init__(self): + tree_sitter_phases = [ + phase for phase in all_treesitter_phases("cpp") + if phase.label != "Unused imports" + ] + super().__init__( name="cxx", extensions=CXX_EXTENSIONS, @@ -61,7 +66,7 @@ def __init__(self): DetectorPhase("Structural analysis", phase_structural), DetectorPhase("Coupling + cycles + orphaned", phase_coupling), DetectorPhase("cppcheck", phase_cppcheck_issue), - *all_treesitter_phases("cpp"), + *tree_sitter_phases, detector_phase_signature(), detector_phase_test_coverage(), detector_phase_security(), diff --git a/desloppify/languages/cxx/detectors/security.py b/desloppify/languages/cxx/detectors/security.py index b2c10b9e..2d457085 100644 --- a/desloppify/languages/cxx/detectors/security.py +++ b/desloppify/languages/cxx/detectors/security.py @@ -659,7 +659,13 @@ def detect_cxx_security( tool_results.append(_run_clang_tidy(scan_root, scoped_files)) tool_results.append(_run_cppcheck(scan_root, scoped_files)) - tool_entries = [entry for result in tool_results for entry in result.entries] + scoped_file_set = {str(Path(filepath).resolve()) for filepath in scoped_files} + tool_entries = [ + entry + for result in tool_results + for entry in result.entries + if str(Path(str(entry.get("file", ""))).resolve()) in scoped_file_set + ] covered_files = { filepath for result in tool_results diff --git a/desloppify/languages/cxx/test_coverage.py b/desloppify/languages/cxx/test_coverage.py index e36e6149..653086c0 100644 --- a/desloppify/languages/cxx/test_coverage.py +++ b/desloppify/languages/cxx/test_coverage.py @@ -15,10 +15,17 @@ BARREL_BASENAMES: set[str] = set() _INCLUDE_RE = re.compile(r'(?m)^\s*#include\s*[<"]([^>"]+)[>"]') _SOURCE_EXTENSIONS = (".c", ".cc", ".cpp", ".cxx") +_HEADER_EXTENSIONS = (".h", ".hh", ".hpp") +_CMAKE_COMMENT_RE = re.compile(r"(?m)#.*$") +_CMAKE_COMMAND_RE = re.compile(r"\b(?:add_executable|add_library|target_sources)\s*\(", re.IGNORECASE) +_CMAKE_SOURCE_SPEC_RE = re.compile( + r'"([^"\n]+\.(?:cpp|cxx|cc|c|hpp|hh|h))"|([^\s()"]+\.(?:cpp|cxx|cc|c|hpp|hh|h))', + re.IGNORECASE, +) _TESTABLE_LOGIC_RE = re.compile( r"\b(?:class|struct|enum|namespace)\b|^\s*(?:inline\s+|static\s+)?[A-Za-z_]\w*(?:[\s*&:<>]+[A-Za-z_]\w*)*\s+\w+\s*\(", re.MULTILINE, - ) +) def has_testable_logic(filepath: str, content: str) -> bool: @@ -31,6 +38,7 @@ def has_testable_logic(filepath: str, content: str) -> bool: return bool(_TESTABLE_LOGIC_RE.search(content)) + def _match_candidate(candidate: Path, production_files: set[str]) -> str | None: resolved = str(candidate.resolve()) normalized = {str(Path(path).resolve()): path for path in production_files} @@ -39,6 +47,7 @@ def _match_candidate(candidate: Path, production_files: set[str]) -> str | None: return None + def resolve_import_spec( spec: str, test_path: str, @@ -67,15 +76,74 @@ def resolve_import_spec( return None + def resolve_barrel_reexports(filepath: str, production_files: set[str]) -> set[str]: """C/C++ has no barrel-file re-export expansion.""" del filepath, production_files return set() + +def _unique_preserving_order(specs: list[str]) -> list[str]: + seen: set[str] = set() + ordered: list[str] = [] + for spec in specs: + cleaned = (spec or "").strip() + if not cleaned or cleaned in seen: + continue + seen.add(cleaned) + ordered.append(cleaned) + return ordered + + + +def _parse_cmake_source_specs(content: str) -> list[str]: + if not _CMAKE_COMMAND_RE.search(content): + return [] + stripped = _CMAKE_COMMENT_RE.sub("", content) + specs: list[str] = [] + for quoted, bare in _CMAKE_SOURCE_SPEC_RE.findall(stripped): + spec = quoted or bare + if spec: + specs.append(spec) + return _unique_preserving_order(specs) + + + def parse_test_import_specs(content: str) -> list[str]: - """Return include-like specs from test content.""" - return [match.group(1).strip() for match in _INCLUDE_RE.finditer(content)] + """Return include-like specs from test content and test build files.""" + include_specs = [match.group(1).strip() for match in _INCLUDE_RE.finditer(content)] + cmake_specs = _parse_cmake_source_specs(content) + return _unique_preserving_order(include_specs + cmake_specs) + + + +def _iter_test_tree_ancestors(test_file: Path) -> list[Path]: + ancestors = [test_file.parent, *test_file.parents] + stop_at: int | None = None + for index, ancestor in enumerate(ancestors): + if ancestor.name.lower() in {"tests", "test"}: + stop_at = index + break + if stop_at is None: + return [] + return ancestors[: stop_at + 1] + + + +def discover_test_mapping_files(test_files: set[str], production_files: set[str]) -> set[str]: + """Find CMake/Make build files that define test target sources within test trees.""" + del production_files + discovered: set[str] = set() + for test_path in sorted(test_files): + test_file = Path(test_path).resolve() + for ancestor in _iter_test_tree_ancestors(test_file): + for build_file in ("CMakeLists.txt", "Makefile"): + candidate = ancestor / build_file + if candidate.is_file(): + discovered.add(str(candidate.resolve())) + return discovered + def map_test_to_source(test_path: str, production_set: set[str]) -> str | None: @@ -104,6 +172,7 @@ def map_test_to_source(test_path: str, production_set: set[str]) -> str | None: return None + def strip_test_markers(basename: str) -> str | None: """Strip common C/C++ test-name markers to derive source basename.""" stem, ext = os.path.splitext(basename) @@ -120,6 +189,7 @@ def strip_test_markers(basename: str) -> str | None: return None + def strip_comments(content: str) -> str: """Strip C-style comments while preserving string literals.""" return strip_c_style_comments(content) diff --git a/desloppify/languages/cxx/tests/test_coverage.py b/desloppify/languages/cxx/tests/test_coverage.py index e4ab2a29..e5909d4e 100644 --- a/desloppify/languages/cxx/tests/test_coverage.py +++ b/desloppify/languages/cxx/tests/test_coverage.py @@ -1,6 +1,24 @@ from __future__ import annotations +from pathlib import Path + import desloppify.languages.cxx.test_coverage as cxx_cov +from desloppify.engine.detectors.test_coverage.detector import detect_test_coverage +from desloppify.engine.policy.zones import FileZoneMap, Zone, ZoneRule + + +def _make_zone_map(file_list: list[str]) -> FileZoneMap: + rules = [ + ZoneRule(Zone.TEST, ["test_", ".test.", ".spec.", "/tests/", "\\tests\\", "/__tests__/", "\\__tests__\\"]), + ] + return FileZoneMap(file_list, rules) + + +def _write(tmp_path: Path, rel_path: str, content: str) -> str: + target = tmp_path / rel_path + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text(content, encoding="utf-8") + return str(target) def test_strip_test_markers_for_cxx(): @@ -14,6 +32,21 @@ def test_parse_test_import_specs_extracts_includes(): assert cxx_cov.parse_test_import_specs(content) == ["widget.hpp", "gtest/gtest.h"] +def test_parse_test_import_specs_extracts_cmake_sources(): + content = """ +add_executable(WidgetBehaviorTest + widget_behavior.cpp + ../src/widget.cpp + ../src/widget.hpp +) +""" + assert cxx_cov.parse_test_import_specs(content) == [ + "widget_behavior.cpp", + "../src/widget.cpp", + "../src/widget.hpp", + ] + + def test_has_testable_logic_accepts_function_definitions_without_regex_crash(): assert cxx_cov.has_testable_logic("widget.cpp", "int widget() { return 1; }\n") is True assert cxx_cov.has_testable_logic("widget_test.cpp", "int widget() { return 1; }\n") is False @@ -30,9 +63,9 @@ def test_map_test_to_source_and_resolve_import_spec(tmp_path): source.parent.mkdir(parents=True) test_file.parent.mkdir(parents=True) - source.write_text("int widget() { return 1; }\n") - header.write_text("int widget();\n") - test_file.write_text('#include "../src/widget.hpp"\n') + source.write_text("int widget() { return 1; }\n", encoding="utf-8") + header.write_text("int widget();\n", encoding="utf-8") + test_file.write_text('#include "../src/widget.hpp"\n', encoding="utf-8") production = {str(source.resolve()), str(header.resolve())} @@ -41,3 +74,50 @@ def test_map_test_to_source_and_resolve_import_spec(tmp_path): cxx_cov.resolve_import_spec("../src/widget.hpp", str(test_file), production) == str(header.resolve()) ) + + +def test_discover_test_mapping_files_finds_cmakelists_within_test_tree(tmp_path): + test_file = tmp_path / "tests" / "kernel_parity" / "widget_behavior.cpp" + cmake_file = tmp_path / "tests" / "CMakeLists.txt" + nested_cmake = tmp_path / "tests" / "kernel_parity" / "CMakeLists.txt" + test_file.parent.mkdir(parents=True) + test_file.write_text("// test\n", encoding="utf-8") + cmake_file.write_text("add_executable(WidgetBehaviorTest widget_behavior.cpp ../src/widget.cpp)\n", encoding="utf-8") + nested_cmake.write_text("add_library(ParityHelpers ../src/widget.hpp)\n", encoding="utf-8") + + discovered = cxx_cov.discover_test_mapping_files({str(test_file.resolve())}, set()) + + assert discovered == {str(cmake_file.resolve()), str(nested_cmake.resolve())} + + +def test_detect_test_coverage_uses_cmake_test_sources_for_direct_mapping(tmp_path): + prod = _write(tmp_path, "src/widget.cpp", "int widget() { return 1; }\n" * 12) + test_file = _write( + tmp_path, + "tests/widget_behavior.cpp", + '#include <gtest/gtest.h>\n\nTEST(WidgetBehavior, Smoke) {\n EXPECT_EQ(1, 1);\n}\n', + ) + _write( + tmp_path, + "tests/CMakeLists.txt", + "add_executable(WidgetBehaviorTest\n" + " widget_behavior.cpp\n" + " ../src/widget.cpp\n" + ")\n", + ) + + zone_map = _make_zone_map([prod, test_file]) + graph = { + prod: {"imports": set(), "importer_count": 0}, + test_file: {"imports": set(), "importer_count": 0}, + } + + entries, potential = detect_test_coverage(graph, zone_map, "cxx") + + assert potential > 0 + untested = [ + entry + for entry in entries + if entry["file"] == prod and entry["detail"]["kind"] in {"untested_module", "untested_critical"} + ] + assert untested == [] diff --git a/desloppify/languages/cxx/tests/test_init.py b/desloppify/languages/cxx/tests/test_init.py index 66393f0f..ee242290 100644 --- a/desloppify/languages/cxx/tests/test_init.py +++ b/desloppify/languages/cxx/tests/test_init.py @@ -38,3 +38,9 @@ def fake_all_treesitter_phases(spec_name: str): assert captured["spec_name"] == "cpp" assert "Tree-sitter sentinel" in labels + + +def test_cxx_excludes_unused_imports_phase(): + cfg = cxx_mod.CxxConfig() + labels = {phase.label for phase in cfg.phases} + assert "Unused imports" not in labels diff --git a/desloppify/languages/cxx/tests/test_security.py b/desloppify/languages/cxx/tests/test_security.py index 2c52f1e4..d18aa408 100644 --- a/desloppify/languages/cxx/tests/test_security.py +++ b/desloppify/languages/cxx/tests/test_security.py @@ -500,15 +500,15 @@ def _fake_run_tool_result(cmd, path, parser, **_kwargs): } -def test_normalize_tool_entries_ignores_cppcheck_syntax_error_with_fontsystem_name(): +def test_normalize_tool_entries_ignores_cppcheck_syntax_error_with_projectish_name(): entries = security_mod._normalize_tool_entries( [ { - "file": r"D:/repo/FontSystem.h", + "file": r"D:/repo/WidgetCatalog.h", "line": 9, "severity": "error", "check_id": "syntaxError", - "message": "Code 'namespaceFontSystem{' is invalid C code.", + "message": "Code 'namespaceWidgetCatalog{' is invalid C code.", "source": "cppcheck", } ] @@ -568,3 +568,46 @@ def test_cxx_config_security_hook_returns_lang_result(tmp_path): assert result.files_scanned == 1 assert result.entries assert result.entries[0]["detail"]["kind"] == "command_injection" + + +def test_detect_cxx_security_ignores_findings_outside_scoped_files( + tmp_path, + monkeypatch, + ): + source = tmp_path / "src" / "unsafe.cpp" + source.parent.mkdir(parents=True) + source.write_text("int main() { return 0; }\n") + (tmp_path / "compile_commands.json").write_text("[]\n") + + external_header = tmp_path / "vendor" / "external.hpp" + + def _fake_which(cmd: str) -> str | None: + return "C:/tools/clang-tidy.exe" if cmd == "clang-tidy" else None + + def _fake_run_tool_result(cmd, path, parser, **_kwargs): + assert str(path.resolve()) == str(tmp_path.resolve()) + output = ( + f"{source}:4:5: warning: call to 'strcpy' is insecure because it can overflow " + "[clang-analyzer-security.insecureAPI.strcpy]\n" + f"{external_header}:18:3: warning: declaration uses reserved identifier " + "[cert-dcl37-c]\n" + ) + return ToolRunResult(entries=parser(output, path), status="ok", returncode=1) + + monkeypatch.setattr( + security_mod, + "shutil", + SimpleNamespace(which=_fake_which), + raising=False, + ) + monkeypatch.setattr( + security_mod, + "run_tool_result", + _fake_run_tool_result, + raising=False, + ) + + result = detect_cxx_security([str(source.resolve())], zone_map=None) + + assert len(result.entries) == 1 + assert result.entries[0]["file"] == str(source.resolve()) diff --git a/desloppify/tests/lang/common/test_treesitter_analysis_direct.py b/desloppify/tests/lang/common/test_treesitter_analysis_direct.py index eccdfee2..c06e2e2a 100644 --- a/desloppify/tests/lang/common/test_treesitter_analysis_direct.py +++ b/desloppify/tests/lang/common/test_treesitter_analysis_direct.py @@ -186,6 +186,8 @@ def test_unused_import_helpers_and_detection(monkeypatch) -> None: assert unused_imports_mod._extract_alias(go_alias) == "pkg" assert unused_imports_mod._extract_import_name("pkg/module") == "module" assert unused_imports_mod._extract_import_name("crate::Thing") == "Thing" + assert unused_imports_mod._extract_import_name("WidgetCatalog.hpp") == "WidgetCatalog" + assert unused_imports_mod._extract_import_name("vendor/json.hpp") == "json" import_node = FakeNode( "import_statement", From 7ce7e283300a7d8726a14d9a3997fbb8e42b3435 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 19:53:13 +0100 Subject: [PATCH 12/15] docs: add .desloppify/ gitignore reminder to setup instructions Closes #416. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index db3dadd0..8efe293c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ Run ALL of the following (requires Python 3.11+): pip install --upgrade "desloppify[full]" desloppify update-skill claude # installs the full workflow guide — pick yours: claude, cursor, codex, copilot, windsurf, gemini +Add .desloppify/ to your .gitignore — it contains local state that shouldn't be committed. + Before scanning, check for directories that should be excluded (vendor, build output, generated code, worktrees, etc.) and exclude obvious ones with `desloppify exclude <path>`. Share any questionable candidates with me before excluding. From 355bc052a84227ecdd6d33b28af9fa62cd94c4c3 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 20:03:06 +0100 Subject: [PATCH 13/15] chore: bump version to 0.9.9, update scorecard Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --- assets/scorecard.png | Bin 91353 -> 88958 bytes pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scorecard.png b/assets/scorecard.png index 0c72abed72e2bf681d1f2b4411812ba72eeea6f1..a5eb76c86ff4b28ec12aa63a1d40dad79808e968 100644 GIT binary patch literal 88958 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%0A3+EdjZvardvawkI8X8dV3=H8PWw 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 literal 91353 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 diff --git a/pyproject.toml b/pyproject.toml index e27d6e6d..f5d4ebe2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "desloppify" -version = "0.9.8" +version = "0.9.9" description = "Multi-language codebase health scanner and technical debt tracker" readme = "README.md" requires-python = ">=3.11" From 47f2e0e5ba6c7de2d98feabf070df8ca051b7600 Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 20:19:49 +0100 Subject: [PATCH 14/15] fix: stub requests module in tweet release tests The tests load tweet_release.py which imports requests at module level. Without a stub, all 7 tests fail with ModuleNotFoundError since requests is a CI script dependency, not a project dependency. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --- .../tests/workflows/test_tweet_release_script.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/desloppify/tests/workflows/test_tweet_release_script.py b/desloppify/tests/workflows/test_tweet_release_script.py index 06687ce5..ca3cfdea 100644 --- a/desloppify/tests/workflows/test_tweet_release_script.py +++ b/desloppify/tests/workflows/test_tweet_release_script.py @@ -26,8 +26,19 @@ def _load_tweet_release_module(monkeypatch: pytest.MonkeyPatch): Client=lambda **kwargs: None, errors=SimpleNamespace(TwitterServerError=RuntimeError), ) + _RequestException = type("RequestException", (OSError,), {}) + requests_stub = SimpleNamespace( + get=lambda *args, **kwargs: None, + post=lambda *args, **kwargs: None, + RequestException=_RequestException, + ConnectionError=type("ConnectionError", (_RequestException,), {}), + Timeout=type("Timeout", (_RequestException,), {}), + HTTPError=type("HTTPError", (_RequestException,), {}), + exceptions=SimpleNamespace(RequestException=_RequestException), + ) monkeypatch.setitem(sys.modules, "anthropic", anthropic_stub) monkeypatch.setitem(sys.modules, "tweepy", tweepy_stub) + monkeypatch.setitem(sys.modules, "requests", requests_stub) module_name = f"tweet_release_test_{uuid4().hex}" spec = importlib.util.spec_from_file_location(module_name, SCRIPT_PATH) From 97b0e6fa9f2cb0a42b8e8f76ecd50dc3e91feafb Mon Sep 17 00:00:00 2001 From: POM <peter@omalley.io> Date: Fri, 13 Mar 2026 20:23:16 +0100 Subject: [PATCH 15/15] ci: retrigger checks after branch protection update