agentic-devtools 0.2.415__py3-none-any.whl → 0.2.416__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.2.415'
22
- __version_tuple__ = version_tuple = (0, 2, 415)
21
+ __version__ = version = '0.2.416'
22
+ __version_tuple__ = version_tuple = (0, 2, 416)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -106,7 +106,7 @@ def _list_prior_actionable_copilot_reviews(snapshot: PRStateSnapshot) -> list[Re
106
106
  HEAD move alone (e.g. ``squash``/``takeover``) cannot change the selection.
107
107
  """
108
108
  verdict = snapshot.copilot_gate_verdict
109
- verdict_review_id = verdict.review_id if verdict is not None else 0
109
+ verdict_review_id = verdict.review_id if verdict is not None and verdict.review_id > 0 else None
110
110
  return select_prior_actionable_reviews(snapshot.reviews, verdict_review_id)
111
111
 
112
112
 
@@ -111,7 +111,7 @@ class ResolveThreadsAction:
111
111
  from agentic_devtools.cli.ci.pipeline.gate_verdict import select_prior_actionable_reviews
112
112
 
113
113
  verdict = snapshot.copilot_gate_verdict
114
- verdict_review_id = verdict.review_id if verdict is not None else 0
114
+ verdict_review_id = verdict.review_id if verdict is not None and verdict.review_id > 0 else None
115
115
  prior_reviews = select_prior_actionable_reviews(snapshot.reviews, verdict_review_id)
116
116
 
117
117
  if not prior_reviews:
@@ -175,8 +175,12 @@ class ResolveThreadsAction:
175
175
  # same source the snapshot uses. The provider's thread-signals cache is
176
176
  # invalidated by the resolve/unresolve mutations, so this observes the
177
177
  # post-resolution state.
178
- requeried, degraded = count_unresolved_prior_threads(
179
- provider, snapshot.pr_number, snapshot.reviews, verdict_review_id
178
+ requeried, degraded, unknown_provenance = count_unresolved_prior_threads(
179
+ provider,
180
+ snapshot.pr_number,
181
+ snapshot.reviews,
182
+ verdict_review_id,
183
+ verdict=verdict,
180
184
  )
181
185
  if degraded:
182
186
  # Thread state is unavailable — fail closed with the conservative
@@ -186,12 +190,13 @@ class ResolveThreadsAction:
186
190
  else:
187
191
  unresolved_total = requeried
188
192
  derived.set("unresolved_threads", unresolved_total)
189
- # Propagate the re-query's degraded status so downstream actions
190
- # (approve, merge) know whether the thread count is authoritative.
193
+ # Propagate the re-query's degraded and unknown_provenance status so downstream
194
+ # actions (approve, merge) know whether the thread count is authoritative.
191
195
  # A failed re-query after a healthy snapshot must mark state as degraded
192
196
  # (not leave the snapshot's False in place); a successful re-query
193
197
  # replaces whatever the snapshot held.
194
198
  derived.set("unresolved_threads_degraded", degraded)
199
+ derived.set("unresolved_threads_unknown_provenance", unknown_provenance)
195
200
 
196
201
  details = f"Resolved {resolved} thread(s), {unresolved_total} left open"
197
202
  if suppressed:
@@ -503,7 +503,7 @@ def copilot_review_gate_passed(
503
503
  )
504
504
 
505
505
 
506
- def select_prior_actionable_reviews(reviews: list[ReviewInfo], verdict_review_id: int) -> list[ReviewInfo]:
506
+ def select_prior_actionable_reviews(reviews: list[ReviewInfo], verdict_review_id: int | None) -> list[ReviewInfo]:
507
507
  """Return actionable Copilot/synthetic reviews not already owned by the gate verdict.
508
508
 
509
509
  This is the **single** definition of the "which reviews count as prior" predicate.
@@ -520,11 +520,11 @@ def select_prior_actionable_reviews(reviews: list[ReviewInfo], verdict_review_id
520
520
  thread (e.g. ``squash``/``takeover`` minting a new commit SHA) does not change
521
521
  the selection, unlike a HEAD-commit-SHA comparison.
522
522
 
523
- Fails closed: when *verdict_review_id* is ``<= 0`` (no verdict evaluated, or
524
- evaluation failed), every actionable review is treated as prior — i.e. this
525
- degenerates to counting all of them, never fewer. Input order is preserved.
523
+ Fails closed: when provenance is unknown (``verdict_review_id`` is ``None`` or
524
+ ``<= 0``) every actionable review is treated as prior — i.e. this degenerates
525
+ to counting all of them, never fewer. Input order is preserved.
526
526
  """
527
- if verdict_review_id <= 0:
527
+ if verdict_review_id is None or verdict_review_id <= 0:
528
528
  return [r for r in reviews if is_copilot_or_synthetic_review(r) and r.state in _ACTIONABLE_PRIOR_REVIEW_STATES]
529
529
  return [
530
530
  r
@@ -61,6 +61,13 @@ class PRStateSnapshot:
61
61
  mapping omitted selected comments, or a review's comments could not be
62
62
  listed), so ``unresolved_threads`` is unknown. The gate fails closed on this signal and
63
63
  the run summary reports "degraded / unknown" instead of a fabricated integer.
64
+ unresolved_threads_unknown_provenance: Whether the gate-verdict review ID could not be
65
+ resolved when ``unresolved_threads`` was computed, so the count covers *all*
66
+ actionable reviews (the conservative count-all floor) rather than being scoped
67
+ to reviews whose ID differs from the verdict's owner. The count is still
68
+ authoritative — it is the maximum possible value — but consumers can use this
69
+ flag to emit extra diagnostics. No additional gate blocking is required: the
70
+ count-all strategy is already the most conservative possible reading.
64
71
  labels: List of labels on the PR.
65
72
  is_draft: Whether the PR is a draft.
66
73
  mergeable: Whether the PR is mergeable (None if unknown).
@@ -134,6 +141,7 @@ class PRStateSnapshot:
134
141
  copilot_review_pending: bool = False
135
142
  unresolved_threads: int = 0
136
143
  unresolved_threads_degraded: bool = False
144
+ unresolved_threads_unknown_provenance: bool = False
137
145
  labels: list[str] = field(default_factory=list)
138
146
  is_draft: bool = False
139
147
  mergeable: bool | None = None
@@ -333,11 +341,22 @@ def build_pr_state_snapshot(
333
341
  # previously) because provenance is now scoped to the verdict's effective
334
342
  # review_id rather than to HEAD's commit SHA — a HEAD move alone (e.g.
335
343
  # squash/takeover minting a new commit) must not change which reviews count
336
- # as "prior". When the verdict evaluation above failed closed, its review_id
337
- # defaults to 0, so this degrades explicitly to count-all — the same
338
- # fail-closed direction the verdict itself takes on exception.
339
- unresolved_threads, unresolved_threads_degraded = count_unresolved_prior_threads(
340
- provider, pr_number, reviews, copilot_gate_verdict.review_id
344
+ # as "prior". When the verdict evaluation above failed closed, ``review_id``
345
+ # remains 0 and the helper's ``None`` provenance signal degrades explicitly to
346
+ # count-all instead of pretending the owner is review 0.
347
+ effective_verdict_review_id = (
348
+ copilot_gate_verdict.review_id
349
+ if copilot_gate_verdict is not None and copilot_gate_verdict.review_id > 0
350
+ else None
351
+ )
352
+ unresolved_threads, unresolved_threads_degraded, unresolved_threads_unknown_provenance = (
353
+ count_unresolved_prior_threads(
354
+ provider,
355
+ pr_number,
356
+ reviews,
357
+ effective_verdict_review_id,
358
+ verdict=copilot_gate_verdict,
359
+ )
341
360
  )
342
361
 
343
362
  # Whether the Copilot review actually evaluated by the gate still matches HEAD.
@@ -404,6 +423,7 @@ def build_pr_state_snapshot(
404
423
  copilot_review_pending=copilot_review_pending,
405
424
  unresolved_threads=unresolved_threads,
406
425
  unresolved_threads_degraded=unresolved_threads_degraded,
426
+ unresolved_threads_unknown_provenance=unresolved_threads_unknown_provenance,
407
427
  labels=list(pr_meta.labels),
408
428
  is_draft=pr_meta.is_draft,
409
429
  mergeable=pr_meta.mergeable,
@@ -472,38 +492,84 @@ def _is_copilot_review_pending(requested_reviewers: list[str]) -> bool:
472
492
  return any(is_copilot_login(reviewer) for reviewer in requested_reviewers)
473
493
 
474
494
 
495
+ def _effective_thread_owner_verdict_id(
496
+ verdict_review_id: int | None,
497
+ verdict: CopilotGateVerdict | None,
498
+ ) -> int | None:
499
+ """Resolve the effective thread-owner review ID for merge-gate provenance.
500
+
501
+ ``None`` represents unknown provenance, which is the fail-closed signal for
502
+ the count-all path. When a verdict object is present it is authoritative:
503
+ a positive ``verdict.review_id`` is used, otherwise provenance remains
504
+ unknown. The legacy integer is used only when no verdict object is supplied.
505
+ """
506
+ if verdict is not None:
507
+ if verdict.review_id > 0:
508
+ return verdict.review_id
509
+ return None
510
+ if verdict_review_id is not None and verdict_review_id > 0:
511
+ return verdict_review_id
512
+ return None
513
+
514
+
475
515
  def count_unresolved_prior_threads(
476
516
  provider: CIPlatformProvider,
477
517
  pr_number: int,
478
518
  reviews: list[ReviewInfo],
479
- verdict_review_id: int,
480
- ) -> tuple[int, bool]:
519
+ verdict_review_id: int | None,
520
+ *,
521
+ verdict: CopilotGateVerdict | None = None,
522
+ ) -> tuple[int, bool, bool]:
481
523
  """Count unresolved Copilot or trusted synthetic review threads not owned by the gate verdict.
482
524
 
483
- Returns a ``(count, degraded)`` pair. ``count`` is the number of distinct
484
- review threads from genuine Copilot or trusted synthetic reviews — other than
485
- the one the gate verdict already accounts for (``verdict_review_id``) — whose
486
- provider-reported state is unresolved.
525
+ Returns a ``(count, degraded, unknown_provenance)`` triple.
526
+
527
+ ``count`` is the number of distinct review threads from genuine Copilot or
528
+ trusted synthetic reviews — other than the one the gate verdict already accounts for
529
+ (``verdict_review_id`` or ``verdict.review_id``) — whose provider-reported state is
530
+ unresolved.
531
+
532
+ ``unknown_provenance`` is ``True`` when the effective verdict review ID could not be
533
+ resolved (no verdict evaluated, or the verdict's ``review_id`` is ``<= 0``). In that
534
+ case the count is computed over *all* actionable reviews (the conservative count-all
535
+ floor). The count is still authoritative — it is the maximum possible value — but
536
+ downstream consumers can use this flag to log extra diagnostics or distinguish a
537
+ "perfect-provenance" zero from a "conservative-floor" zero. Consumer action logic
538
+ does **not** need to change: a count-all result is already the most conservative
539
+ possible reading, so treating ``unknown_provenance=True`` as a hard block is
540
+ unnecessary and would double-penalise an already-conservative measurement.
487
541
 
488
- Provenance is scoped to ``verdict_review_id``, not to HEAD's commit SHA: this
542
+ Provenance is scoped to the effective verdict review_id, not to HEAD's commit SHA: this
489
543
  keeps the count HEAD-independent, so a HEAD move that touches no review or
490
544
  thread (e.g. ``squash``/``takeover`` minting a new commit) cannot change it.
491
- When ``verdict_review_id <= 0`` (no verdict evaluated, or evaluation failed
492
- closed), this explicitly degenerates to counting every actionable review —
493
- the same fail-closed direction the verdict itself takes.
494
-
495
- When the provider cannot report review-thread state (the capability is
496
- missing, the lookup failed, the returned mapping omits selected comments, or
497
- a review's comments could not be listed), ``degraded`` is True: the count
498
- falls back to the minimum blocking floor of ``1`` so a capability-less
499
- provider can never present as "0 unresolved threads" and silently open the
500
- merge gate. Every such degradation is logged, so no thread is ever dropped
501
- from the count without a diagnostic.
545
+ When the effective review_id is unknown (``None`` or ``<= 0``, meaning no verdict
546
+ evaluated or evaluation failed closed), this explicitly degenerates to counting every
547
+ actionable review — the same fail-closed direction the verdict itself takes. The
548
+ resulting count is still authoritative: ``degraded`` remains ``False`` because the
549
+ count-all strategy is the conservative floor, not an estimate.
550
+
551
+ ``degraded`` is ``True`` **only** when the provider cannot report review-thread state
552
+ (the capability is missing, the lookup failed, the returned mapping omits selected
553
+ comments, or a review's comments could not be listed). In that case the count falls
554
+ back to the minimum blocking floor of ``1`` so a capability-less provider can never
555
+ present as "0 unresolved threads" and silently open the merge gate. Every such
556
+ degradation is logged, so no thread is ever dropped from the count without a
557
+ diagnostic.
502
558
  """
503
- prior_copilot_reviews = select_prior_actionable_reviews(reviews, verdict_review_id)
559
+ effective_review_id = _effective_thread_owner_verdict_id(verdict_review_id, verdict)
560
+ unknown_provenance = effective_review_id is None
561
+ if unknown_provenance:
562
+ logger.warning(
563
+ "PR #%d: no concrete thread-owner provenance for prior actionable reviews; "
564
+ "falling back to count-all (conservative floor — not a query failure)",
565
+ pr_number,
566
+ )
567
+ prior_copilot_reviews = select_prior_actionable_reviews(reviews, None)
568
+ else:
569
+ prior_copilot_reviews = select_prior_actionable_reviews(reviews, effective_review_id)
504
570
  if not prior_copilot_reviews:
505
571
  # Nothing to report on — no capability was needed, so this is not degraded.
506
- return 0, False
572
+ return 0, False, unknown_provenance
507
573
 
508
574
  thread_lookup = getattr(provider, "list_review_threads_by_thread_id", None)
509
575
  if not callable(thread_lookup):
@@ -512,7 +578,7 @@ def count_unresolved_prior_threads(
512
578
  " — failing closed with an unknown-thread count",
513
579
  pr_number,
514
580
  )
515
- return 1, True
581
+ return 1, True, unknown_provenance
516
582
 
517
583
  try:
518
584
  thread_states = thread_lookup(pr_number)
@@ -522,14 +588,14 @@ def count_unresolved_prior_threads(
522
588
  " — failing closed with an unknown-thread count",
523
589
  pr_number,
524
590
  )
525
- return 1, True
591
+ return 1, True, unknown_provenance
526
592
  except Exception as exc:
527
593
  logger.warning(
528
594
  "PR #%d: review-thread state unavailable (%s) — failing closed with an unknown-thread count",
529
595
  pr_number,
530
596
  str(exc)[:200],
531
597
  )
532
- return 1, True
598
+ return 1, True, unknown_provenance
533
599
 
534
600
  if not isinstance(thread_states, dict):
535
601
  logger.warning(
@@ -539,7 +605,7 @@ def count_unresolved_prior_threads(
539
605
  pr_number,
540
606
  type(thread_states).__name__,
541
607
  )
542
- return 1, True
608
+ return 1, True, unknown_provenance
543
609
 
544
610
  comment_to_thread: dict[int, str] = {}
545
611
  for thread_key, state in thread_states.items():
@@ -552,7 +618,7 @@ def count_unresolved_prior_threads(
552
618
  pr_number,
553
619
  thread_key,
554
620
  )
555
- return 1, True
621
+ return 1, True, unknown_provenance
556
622
  if not isinstance(state, tuple) or len(state) != 2 or type(state[0]) is not bool:
557
623
  logger.warning(
558
624
  "PR #%d: review-thread state unavailable "
@@ -563,7 +629,7 @@ def count_unresolved_prior_threads(
563
629
  thread_key,
564
630
  state,
565
631
  )
566
- return 1, True
632
+ return 1, True, unknown_provenance
567
633
  comment_ids = state[1]
568
634
  if not isinstance(comment_ids, tuple):
569
635
  logger.warning(
@@ -572,7 +638,7 @@ def count_unresolved_prior_threads(
572
638
  " — failing closed with an unknown-thread count",
573
639
  pr_number,
574
640
  )
575
- return 1, True
641
+ return 1, True, unknown_provenance
576
642
  for comment_id in comment_ids:
577
643
  if type(comment_id) is not int:
578
644
  logger.warning(
@@ -584,7 +650,7 @@ def count_unresolved_prior_threads(
584
650
  thread_key,
585
651
  comment_id,
586
652
  )
587
- return 1, True
653
+ return 1, True, unknown_provenance
588
654
  mapped_thread = comment_to_thread.get(comment_id)
589
655
  if mapped_thread is not None and mapped_thread != thread_key:
590
656
  logger.warning(
@@ -597,7 +663,7 @@ def count_unresolved_prior_threads(
597
663
  mapped_thread,
598
664
  thread_key,
599
665
  )
600
- return 1, True
666
+ return 1, True, unknown_provenance
601
667
  comment_to_thread[comment_id] = thread_key
602
668
 
603
669
  total_unresolved = 0
@@ -636,7 +702,7 @@ def count_unresolved_prior_threads(
636
702
  comments_unavailable = True
637
703
 
638
704
  if missing_thread_state:
639
- return max(total_unresolved, 1), True
705
+ return max(total_unresolved, 1), True, unknown_provenance
640
706
  if comments_unavailable:
641
707
  if total_unresolved == 0:
642
708
  logger.warning(
@@ -644,9 +710,9 @@ def count_unresolved_prior_threads(
644
710
  " — applying the blocking floor of 1 unresolved thread",
645
711
  pr_number,
646
712
  )
647
- return 1, True
648
- return total_unresolved, True
649
- return total_unresolved, False
713
+ return 1, True, unknown_provenance
714
+ return total_unresolved, True, unknown_provenance
715
+ return total_unresolved, False, unknown_provenance
650
716
 
651
717
 
652
718
  def _count_commits(provider: CIPlatformProvider, *, base_branch: str, head_sha: str) -> int:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentic-devtools
3
- Version: 0.2.415
3
+ Version: 0.2.416
4
4
  Summary: Agentic devtools integrate Jira, DevOps & more
5
5
  Author: ayaiayorg
6
6
  License-Expression: MIT
@@ -1,5 +1,5 @@
1
1
  agentic_devtools/__init__.py,sha256=J_Zw_vWKghk-cLmqI83hXQmSiS8zMhGIHM5WPLDkZuo,242
2
- agentic_devtools/_version.py,sha256=yIi8ocqIsuh2cqu1EnYhgjeImc0-nP0OgjnFW9ZTHzw,524
2
+ agentic_devtools/_version.py,sha256=8vuxsd01j_scUQpIgCieYJk6yeMwK5bE_y9JOfqA3uk,524
3
3
  agentic_devtools/agdt_gitignore.py,sha256=aBPBQe7M0GLH8NIp1NsyN9ZiO80fNGOi46IcT5A4SK4,1569
4
4
  agentic_devtools/background_tasks.py,sha256=IVC1XJKQzPBP8wCRNCZX_iZCg9FJY_GBUzddSJj7xqw,17473
5
5
  agentic_devtools/config.py,sha256=DEVxTVZhsQbVQwO9qdB_1h19aBpjMzF6xJY_ePYLGLs,15629
@@ -169,11 +169,11 @@ agentic_devtools/cli/ci/pipeline/command.py,sha256=RJ_QUhQjSyEobqDUQnPuVMl0-rBWK
169
169
  agentic_devtools/cli/ci/pipeline/deferral.py,sha256=Dga-CQevmTe1PYeUpvptZxbvD3g8jl7Q5kqgZSAY2dg,18305
170
170
  agentic_devtools/cli/ci/pipeline/exceptions.py,sha256=4UXy2weeQZex_lp4sILNxlYfGjetxbR-tjms2ReT4iw,451
171
171
  agentic_devtools/cli/ci/pipeline/exclusion.py,sha256=mrOG5G1-m3U-GM4YgtMTuzmoj02TXB6GbNxemRoLtV4,931
172
- agentic_devtools/cli/ci/pipeline/gate_verdict.py,sha256=LbjuLnb9-EchE-lIFx2g5FYg_kwEPqUJSFMlHadGntw,43993
172
+ agentic_devtools/cli/ci/pipeline/gate_verdict.py,sha256=stMgkDzVmn4Tr0yoyfPs7RXe7BpAWkecWFbY1baXEQg,44021
173
173
  agentic_devtools/cli/ci/pipeline/models.py,sha256=GVhAXMbIEhkuECYUdk6WgZ7-lOOb5sCFn9MfG50iSqY,2456
174
174
  agentic_devtools/cli/ci/pipeline/runner.py,sha256=YfK9QBFQg0ri0kCvYBek3LiQm7Mxv4pXPxiaC5PmIjk,13805
175
175
  agentic_devtools/cli/ci/pipeline/session_detector.py,sha256=dWJyZIv7NcJNUl7TIsYqNfzNmZu3vAxHaQp1wMqe70o,8926
176
- agentic_devtools/cli/ci/pipeline/snapshot.py,sha256=MgW38vpAQhWmYnBUvbMFjaeWAxr9Bo_C8SAbyCrqj-Q,33686
176
+ agentic_devtools/cli/ci/pipeline/snapshot.py,sha256=Ek9sh9UTU5mg0Kps80jv9sPYHTmnS3AbSjx17T9HXYc,37442
177
177
  agentic_devtools/cli/ci/pipeline/suggestions.py,sha256=nM4w1hfDFkT5_DAMMJMDZnFIvKhcvK1ainxcnAU_FkM,26777
178
178
  agentic_devtools/cli/ci/pipeline/summary.py,sha256=ILCNHE845oiqGM6CA8NjaVKBVyxLNu5xTG8GXdhOy_U,13321
179
179
  agentic_devtools/cli/ci/pipeline/actions/__init__.py,sha256=rY6e3yk5ybMINMSdtWvcwZI8I9GGxQAQ90J_dSjipr8,1577
@@ -181,13 +181,13 @@ agentic_devtools/cli/ci/pipeline/actions/apply_suggestions.py,sha256=WCtCoJE6795
181
181
  agentic_devtools/cli/ci/pipeline/actions/approve.py,sha256=AHTm8Mf1kMaQcrS303ZalMaKzpEfYrtMdWDrisWT6kQ,9080
182
182
  agentic_devtools/cli/ci/pipeline/actions/defer_suppressed.py,sha256=EZZMXyopk6oBQCjTRi769EsFGfTUeCqwfzBNNgeREHA,16178
183
183
  agentic_devtools/cli/ci/pipeline/actions/dispatch_conflict_resolution.py,sha256=Dl6EoagioHq74bLURRB_5Mi36Od6JHkbRuG5_za_goc,13754
184
- agentic_devtools/cli/ci/pipeline/actions/dispatch_repair.py,sha256=g9pMNrTc18ays-pRih4sLPI6rj5UTky1t1dA9jnwOA4,21521
184
+ agentic_devtools/cli/ci/pipeline/actions/dispatch_repair.py,sha256=6lSPjoO_5OHy34vrrXLA-3hshTj6GjZ5rtoZn0Xy2hQ,21550
185
185
  agentic_devtools/cli/ci/pipeline/actions/guards.py,sha256=UIkTgv5_aKqSVNRFlvl_JiAdFswm1uV5VJJfgu5FmFc,4101
186
186
  agentic_devtools/cli/ci/pipeline/actions/merge.py,sha256=MPQxTMaDWpeZBzge2tx8htCNCjYDpF_bV5A0AofllBc,16778
187
187
  agentic_devtools/cli/ci/pipeline/actions/publish.py,sha256=A00Lk-vZKnhOCN2O5mkks0tayr7NA5eZfUA95CUP7gs,3990
188
188
  agentic_devtools/cli/ci/pipeline/actions/rebase.py,sha256=FGykjl5xi9Bg8nq2AE6IB7skdmKJ7Z4iOT4bd2K3B2U,5256
189
189
  agentic_devtools/cli/ci/pipeline/actions/request_review.py,sha256=-BInEFbX7rHY_wKna-ksa5cQV_Arxi7w1Jg1kNdBltE,9173
190
- agentic_devtools/cli/ci/pipeline/actions/resolve_threads.py,sha256=orY7RsqrMsvOmGDa7R-Z96itSFj9N5DICertZdekwOo,9687
190
+ agentic_devtools/cli/ci/pipeline/actions/resolve_threads.py,sha256=mJ6tnuazxmTls8_rpA_omwSPFi7JSyEFOViXdchNiUI,9906
191
191
  agentic_devtools/cli/ci/pipeline/actions/squash.py,sha256=woloutgBoaEkZMO6HcLoChCV3S-yeD7T22ygePciRx0,10894
192
192
  agentic_devtools/cli/ci/pipeline/actions/takeover.py,sha256=ms0coVGuT7peZ3XKbYzqzwrAwqwyyvfPzCsPXLPXKws,6394
193
193
  agentic_devtools/cli/ci/pipeline/discovery/__init__.py,sha256=QNdOYvl_wK6qcWOvNJR-wm8EtWD_DPn4barKF5RSmfU,752
@@ -949,8 +949,8 @@ agentic_devtools/_bundled_skills/prompts/speckit.plan.prompt.md,sha256=IJja5r2Sd
949
949
  agentic_devtools/_bundled_skills/prompts/speckit.specify.prompt.md,sha256=eyzE3GRi2hyW30a6xPYOU7q6MJf0skrD-baEGURYqpg,31
950
950
  agentic_devtools/_bundled_skills/prompts/speckit.tasks.prompt.md,sha256=iPxXwon5nV6dNcJV8-JoP3PssKUVXctNiG-C9SsRhB8,29
951
951
  agentic_devtools/_bundled_skills/prompts/speckit.taskstoissues.prompt.md,sha256=L5Y21PMSoUcPAAdHy2Jnf-wGVdi04jV_pPvyOJZfpm0,37
952
- agentic_devtools-0.2.415.dist-info/METADATA,sha256=0YFc2rqKU6aEqndgc0b1TPrbskguyu3vIIraNawyBCg,33466
953
- agentic_devtools-0.2.415.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
954
- agentic_devtools-0.2.415.dist-info/entry_points.txt,sha256=1xH6yqltFD5Gs3qbHN9zpKwwG3nXpWoC7x0w1Ip7LCw,11726
955
- agentic_devtools-0.2.415.dist-info/licenses/LICENSE,sha256=yBEDdICksxhBYLWoERKp9MTqwGnUF6Ryj9BTLwXTc6k,1082
956
- agentic_devtools-0.2.415.dist-info/RECORD,,
952
+ agentic_devtools-0.2.416.dist-info/METADATA,sha256=6RJsmJ3zrR_WjT810f797DvhhGhLGEZ_CC7DhIpgPdY,33466
953
+ agentic_devtools-0.2.416.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
954
+ agentic_devtools-0.2.416.dist-info/entry_points.txt,sha256=1xH6yqltFD5Gs3qbHN9zpKwwG3nXpWoC7x0w1Ip7LCw,11726
955
+ agentic_devtools-0.2.416.dist-info/licenses/LICENSE,sha256=yBEDdICksxhBYLWoERKp9MTqwGnUF6Ryj9BTLwXTc6k,1082
956
+ agentic_devtools-0.2.416.dist-info/RECORD,,