alissa-tools-github-orcloop 0.4.2__tar.gz → 0.4.3__tar.gz
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.
- {alissa_tools_github_orcloop-0.4.2/src/main/alissa_tools_github_orcloop.egg-info → alissa_tools_github_orcloop-0.4.3}/PKG-INFO +1 -1
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/loop.py +19 -5
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/state.py +8 -2
- alissa_tools_github_orcloop-0.4.3/src/main/alissa/tools/github/orcloop/version +1 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3/src/main/alissa_tools_github_orcloop.egg-info}/PKG-INFO +1 -1
- alissa_tools_github_orcloop-0.4.2/src/main/alissa/tools/github/orcloop/version +0 -1
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/LICENSE +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/MANIFEST.in +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/NOTICE +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/README.md +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/requirements.txt +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/setup.cfg +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/setup.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/__init__.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/__main__.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/alissa_client.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/config.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/console.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/ghclient.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/markers.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/proc.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/version.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/workplan.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa/tools/github/orcloop/workplan_html.py +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa_tools_github_orcloop.egg-info/SOURCES.txt +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa_tools_github_orcloop.egg-info/dependency_links.txt +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa_tools_github_orcloop.egg-info/entry_points.txt +0 -0
- {alissa_tools_github_orcloop-0.4.2 → alissa_tools_github_orcloop-0.4.3}/src/main/alissa_tools_github_orcloop.egg-info/top_level.txt +0 -0
|
@@ -583,6 +583,19 @@ ORIGIN_MISSING_MAX_ATTEMPTS = 3
|
|
|
583
583
|
# is written by the loop itself, before anything can refuse it -- a counter
|
|
584
584
|
# whose advance depends on a remote write is not a counter.
|
|
585
585
|
#
|
|
586
|
+
# THE FAMILY PREFIX, TRAILING COLON INCLUDED -- not the bare stem, which is what
|
|
587
|
+
# the `_PREFIX` in the name is there to say. Its siblings a few hundred lines up
|
|
588
|
+
# (`ESCALATION_CLOSELOOP_FAILED`, `ESCALATION_CLOSELOOP_TERMINAL`) are bare stems
|
|
589
|
+
# whose call sites append the separator; this one carries it, and the name is the
|
|
590
|
+
# only thing that tells the next author which of the two shapes they are holding.
|
|
591
|
+
# Every reader and the clear pass this one string, so the two sides are the same
|
|
592
|
+
# expression
|
|
593
|
+
# rather than two literals that happen to agree: with the colon left to the call
|
|
594
|
+
# sites, the reads scanned `marker:origin-missing:%` while `CLEARABLE_KINDS`
|
|
595
|
+
# forced the clear to `marker:origin-missing%`, and a future sibling kind --
|
|
596
|
+
# `marker:origin-missing-since`, exactly the clock shape dedupe and context both
|
|
597
|
+
# grew -- would have been swept by a clear meant only for the attempts.
|
|
598
|
+
#
|
|
586
599
|
# `marker:` for the reason the other markers carry it: `escalations_matching` is
|
|
587
600
|
# a prefix reader, and these rows must stay out of every prefix read of a page
|
|
588
601
|
# kind.
|
|
@@ -600,7 +613,7 @@ ORIGIN_MISSING_MAX_ATTEMPTS = 3
|
|
|
600
613
|
# the same argument applies to `marker:dedupe-unreadable`, which is cleared for
|
|
601
614
|
# exactly this reason (a blip that clears must not make the next outage look
|
|
602
615
|
# days old).
|
|
603
|
-
|
|
616
|
+
ORIGIN_MISSING_ATTEMPT_PREFIX = "marker:origin-missing:"
|
|
604
617
|
|
|
605
618
|
# The close edge could not write its evidence AT ALL -- not the enriched
|
|
606
619
|
# delivery record, not the bare confirmation line -- for longer than the
|
|
@@ -788,7 +801,7 @@ def origin_missing_attempt_kind(attempt: int) -> str:
|
|
|
788
801
|
`closeloop_failed_kind`, so the row count IS the attempt number under the
|
|
789
802
|
ledger's idempotent (task, kind) insert -- two writes of the same attempt
|
|
790
803
|
can never inflate it, and a restart cannot reset it."""
|
|
791
|
-
return f"{
|
|
804
|
+
return f"{ORIGIN_MISSING_ATTEMPT_PREFIX}a{attempt}"
|
|
792
805
|
|
|
793
806
|
|
|
794
807
|
# --- escalation copy -------------------------------------------------------
|
|
@@ -4289,10 +4302,11 @@ class Orchestrator:
|
|
|
4289
4302
|
`_origin_missing` at all (`_close_loop` returns before the read), so
|
|
4290
4303
|
there are no rows for it to clear and no side effect to suppress. The
|
|
4291
4304
|
guard below means it does not even query."""
|
|
4292
|
-
if not self.state.escalations_matching(task_number,
|
|
4305
|
+
if not self.state.escalations_matching(task_number, ORIGIN_MISSING_ATTEMPT_PREFIX):
|
|
4293
4306
|
return
|
|
4307
|
+
# The SAME string the read above scans with -- see the constant.
|
|
4294
4308
|
cleared = self.state.clear_escalations_matching(
|
|
4295
|
-
task_number,
|
|
4309
|
+
task_number, ORIGIN_MISSING_ATTEMPT_PREFIX
|
|
4296
4310
|
)
|
|
4297
4311
|
log.info(
|
|
4298
4312
|
"%s: the origin task reads again — clearing %d unreadable-attempt "
|
|
@@ -4368,7 +4382,7 @@ class Orchestrator:
|
|
|
4368
4382
|
What is NOT done here: the trigger label is not touched (parking stays
|
|
4369
4383
|
the operator's call, the rule the park path holds), the issue is not
|
|
4370
4384
|
closed or re-opened, and no Alissa write of any kind is attempted."""
|
|
4371
|
-
prior = self.state.escalations_matching(task_number,
|
|
4385
|
+
prior = self.state.escalations_matching(task_number, ORIGIN_MISSING_ATTEMPT_PREFIX)
|
|
4372
4386
|
if len(prior) >= ORIGIN_MISSING_MAX_ATTEMPTS:
|
|
4373
4387
|
last_at = max(int(row["escalated_at"]) for row in prior)
|
|
4374
4388
|
waited = self._now() - last_at
|
|
@@ -74,14 +74,20 @@ CREATE TABLE IF NOT EXISTS meta (
|
|
|
74
74
|
# imported from `loop`, which imports this module; `test_loop` pins that the
|
|
75
75
|
# loop's constants and this set stay the same five strings.
|
|
76
76
|
#
|
|
77
|
-
# `marker:origin-missing
|
|
77
|
+
# `marker:origin-missing:` is the one entry that names a PREFIX rather than a
|
|
78
78
|
# whole kind: its rows are `marker:origin-missing:a<j>`, one per poll, and they
|
|
79
79
|
# are cleared as a family by `clear_escalations_matching` -- a counter of
|
|
80
80
|
# CONSECUTIVE failures is only consecutive if a success resets it.
|
|
81
|
+
#
|
|
82
|
+
# Its TRAILING COLON is load-bearing, and is the entry's whole job: the allowlist
|
|
83
|
+
# is what forces the prefix the clear may use, so the bare stem would have
|
|
84
|
+
# licensed a DELETE of `marker:origin-missing%` -- sweeping any future sibling
|
|
85
|
+
# kind (`marker:origin-missing-since`, say) along with the attempts. Narrower
|
|
86
|
+
# here means narrower everywhere, since the loop reads with this same string.
|
|
81
87
|
CLEARABLE_KINDS = frozenset({
|
|
82
88
|
"marker:dedupe-unreadable", "dedupe-unreadable",
|
|
83
89
|
"marker:context-unreadable", "context-unreadable",
|
|
84
|
-
"marker:origin-missing",
|
|
90
|
+
"marker:origin-missing:",
|
|
85
91
|
})
|
|
86
92
|
|
|
87
93
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.4.3
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.4.2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|