cctally 1.117.2 → 1.118.0

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +7 -3
  3. package/bin/_cctally_cache.py +2783 -175
  4. package/bin/_cctally_completion.py +106 -33
  5. package/bin/_cctally_core.py +69 -4
  6. package/bin/_cctally_dashboard.py +188 -13
  7. package/bin/_cctally_dashboard_conversation.py +5 -1
  8. package/bin/_cctally_dashboard_envelope.py +50 -19
  9. package/bin/_cctally_dashboard_sources.py +23 -1
  10. package/bin/_cctally_db.py +193 -153
  11. package/bin/_cctally_diagnosis_sources.py +63 -7
  12. package/bin/_cctally_doctor.py +865 -93
  13. package/bin/_cctally_five_hour.py +67 -50
  14. package/bin/_cctally_forecast.py +35 -13
  15. package/bin/_cctally_journal.py +186 -18
  16. package/bin/_cctally_milestone_history.py +859 -62
  17. package/bin/_cctally_oauth_samples.py +286 -15
  18. package/bin/_cctally_parser.py +2 -2
  19. package/bin/_cctally_quota.py +104 -12
  20. package/bin/_cctally_record.py +153 -29
  21. package/bin/_cctally_rederive.py +608 -68
  22. package/bin/_cctally_statusline.py +108 -81
  23. package/bin/_cctally_store.py +179 -38
  24. package/bin/_cctally_tui.py +892 -181
  25. package/bin/_cctally_update.py +32 -13
  26. package/bin/_lib_codex_conversation_query.py +52 -14
  27. package/bin/_lib_codex_drain_admission.py +224 -6
  28. package/bin/_lib_codex_metadata.py +39 -0
  29. package/bin/_lib_conversation_anon.py +15 -8
  30. package/bin/_lib_conversation_dispatch.py +7 -0
  31. package/bin/_lib_conversation_query.py +289 -70
  32. package/bin/_lib_dashboard_sources.py +37 -1
  33. package/bin/_lib_detector_access_registry.py +497 -26
  34. package/bin/_lib_doctor.py +85 -20
  35. package/bin/_lib_doctor_scan_index.py +321 -0
  36. package/bin/_lib_ingest_frontier.py +20 -1
  37. package/bin/_lib_oauth_samples.py +23 -7
  38. package/bin/_lib_pricing.py +146 -16
  39. package/bin/_lib_quota.py +19 -0
  40. package/bin/_lib_rederive.py +11 -6
  41. package/bin/_lib_retained_records.py +516 -0
  42. package/bin/_lib_snapshot_cache.py +10 -0
  43. package/bin/_lib_stale_proof.py +272 -43
  44. package/bin/_lib_stats_content_revision.py +831 -0
  45. package/bin/_lib_write_io.py +11 -4
  46. package/bin/cctally +4 -1
  47. package/dashboard/static/assets/ConversationsView-D4Iv4ku0.js +72 -0
  48. package/dashboard/static/assets/{DoctorModal-B0DnU9d9.js → DoctorModal-D4QSq6uz.js} +1 -1
  49. package/dashboard/static/assets/ModalRoot-C9F5dhZi.js +1 -0
  50. package/dashboard/static/assets/{ProjectsDrillPanel-DSxXQSa-.js → ProjectsDrillPanel-WxAdRDMt.js} +1 -1
  51. package/dashboard/static/assets/{SourceDetailModal-BleDpQqG.js → SourceDetailModal-NyyEfXmc.js} +1 -1
  52. package/dashboard/static/assets/{UpdateModal-CMqaAkSK.js → UpdateModal-CFLq9pT1.js} +1 -1
  53. package/dashboard/static/assets/{index-BjQV-0-D.js → index-BKTWH9JE.js} +2 -2
  54. package/dashboard/static/assets/{outlineNavigation-CO-VWBm7.js → outlineNavigation-BnGUwCS3.js} +3 -3
  55. package/dashboard/static/dashboard.html +1 -1
  56. package/package.json +4 -1
  57. package/dashboard/static/assets/ConversationsView-oqNsWzWV.js +0 -72
  58. package/dashboard/static/assets/ModalRoot-CYua2wP_.js +0 -1
@@ -679,15 +679,16 @@ RESIDUAL_COUNT_KEYS = ("failed", "unpublishedDeferred", "obligations",
679
679
  "containerPending", "keysDeferred")
680
680
  #: The Codex conversation counts that are part of a pass's residual.
681
681
  _RESIDUAL_COUNT_FIELDS = ("container_pending", "container_reads_held",
682
- "barrier_keys_deferred", "files_deferred_torn",
683
- "prune_refused")
682
+ "barrier_keys_deferred", "barrier_keys_terminal",
683
+ "files_deferred_torn", "prune_refused")
684
684
 
685
685
 
686
686
  def conversation_residual(stats) -> tuple:
687
687
  """One provider pass's residual as canonical ``(name, value)`` pairs.
688
688
 
689
689
  The failed paths, the deferrals no unit of the same pass published (with
690
- the keys each named), the causes of ``barrier_retry``, the existing
690
+ the keys each named), the causes of ``barrier_retry``, the terminal
691
+ deferrals (each terminal file with its keys, #1052), the existing
691
692
  leftover counts, and the pass's deferred reason and maintenance failure
692
693
  (a refusal that repeats identically settles; one that changes restarts the
693
694
  chain). ``()`` when the pass left nothing unfinished."""
@@ -703,8 +704,14 @@ def conversation_residual(stats) -> tuple:
703
704
  (str(path), tuple(sorted(keys))) for path, keys in deferred.items()
704
705
  if str(path) not in published))
705
706
  causes = tuple(sorted(getattr(stats, "barrier_retry_causes", None) or ()))
707
+ # #1052: each terminal file with the keys it holds back. No certificate
708
+ # revision: a re-seal that leaves the same file terminal for the same keys
709
+ # is the same residual, and a changed key is a different one.
710
+ terminal = tuple(sorted(
711
+ (str(path), tuple(sorted(keys))) for path, keys in
712
+ (getattr(stats, "barrier_terminal_keys", None) or {}).items()))
706
713
  items = [("failed_paths", failed), ("unpublished_deferred", unpublished),
707
- ("barrier_retry_causes", causes)]
714
+ ("barrier_retry_causes", causes), ("barrier_terminal", terminal)]
708
715
  items += [(name, getattr(stats, name, 0) or 0)
709
716
  for name in _RESIDUAL_COUNT_FIELDS]
710
717
  items += [("deferred_reason", str(reason) if reason else None),
package/bin/cctally CHANGED
@@ -1106,6 +1106,9 @@ cmd_stats_epoch_rebuild_internal = (
1106
1106
  cmd_stats_corruption_heal_internal = (
1107
1107
  _cctally_store.cmd_stats_corruption_heal_internal
1108
1108
  )
1109
+ # #932: the dashboard publisher classifies a maintenance-busy open under a
1110
+ # running detached recovery through this one store-side predicate.
1111
+ active_stats_recovery_deferral = _cctally_store.active_stats_recovery_deferral
1109
1112
  # #496 S6: the retained-artifact reclamation worker and `cctally db prune`
1110
1113
  # share one sweep implementation, so both resolve through the same sibling.
1111
1114
  _cctally_retention = _load_sibling("_cctally_retention")
@@ -1651,7 +1654,7 @@ _build_statusline_injections = _cctally_statusline._build_statusline_injections
1651
1654
  # resolve them.
1652
1655
  _statusline_persist = _cctally_statusline._statusline_persist
1653
1656
  _statusline_oauth_tick = _cctally_statusline._statusline_oauth_tick
1654
- _fork_persist = _cctally_statusline._fork_persist
1657
+ _dispatch_render_worker = _cctally_statusline._dispatch_render_worker
1655
1658
  _record_args = _cctally_statusline._record_args
1656
1659
  _try_acquire_persist_lock = _cctally_statusline._try_acquire_persist_lock
1657
1660
  _release_persist_lock = _cctally_statusline._release_persist_lock