night 2026-09-13/14: first "be a customer" rotation (adventurelog) — 7 defects found, 13 rows closed
gates / gates (push) Successful in 18s
gates / gates (push) Successful in 18s
New runbooks/nightly-rotation.md; observations_gate.py reads every section (R-471); target-selection.md names real paths (R-461); R-93 carries the fact that drill-r50 is gone. Register: R-473/R-474/R-466/R-471/R-453/R-461 and v0.240.0's R-477/R-478/R-480/R-482/R-484/R-485/R-486 closed; R-481, R-483, R-487, R-488, R-489 opened. 09 §6.1, 07 §6, CONTEXT, STATUS note. Evidence: audits/nightly-2026-09-13-adventurelog/, audits/v0240-2026-09-13/.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
## observations_gate.py reads EVERY observations section (2026-09-13, R-471)
|
||||
|
||||
`observation_items` returned the first `Observations` heading it found and stopped, so a report
|
||||
carrying an ordinary `## 11. Observations …` section and, appended below it, a second `## Observations`
|
||||
block with an unmarked item PASSED. The R-419 decoy plants exactly that shape and had been reading
|
||||
**LIVE HOLE** at HEAD, because the decoy suite is run by hand. Now every observations section is
|
||||
read and the items are pooled; the heading reported is all of them joined with ` + `. Red-proof:
|
||||
the old parser exits 0 on the decoy, the new one refuses it (`documentation/audits/v0240-2026-09-13/rp-R471.txt`).
|
||||
All 12 decoys behave; the felhom.eu and controller reports still pass.
|
||||
|
||||
## golden_currency_gate.py docstring corrected: the floor does NOT carry a release between bakes (2026-09-13, R-472) — NOT A RELEASE
|
||||
|
||||
Docstring only; the gate's behaviour is unchanged. This morning's entry stated that under the weekly
|
||||
|
||||
@@ -141,40 +141,59 @@ def known_rows(paths):
|
||||
return rows
|
||||
|
||||
|
||||
def observation_items(text):
|
||||
"""(items, heading) — each item is (number, its full text). heading is None when absent."""
|
||||
def observation_sections(text):
|
||||
"""Every observations section in the file: [(heading_line, body_lines)], in document order.
|
||||
|
||||
R-471 (2026-09-13): this used to return the FIRST matching heading only, so a report carrying an
|
||||
ordinary `## 11. Observations …` section and, appended below it, a second `## Observations` block
|
||||
with an unmarked item PASSED — and the R-419 decoy, which plants exactly that shape, had been
|
||||
reading LIVE HOLE at HEAD without anyone running the decoy suite. Every section is read now.
|
||||
"""
|
||||
lines = text.split("\n")
|
||||
start = None
|
||||
depth = 0
|
||||
for i, line in enumerate(lines):
|
||||
m = HEADING_RE.match(line)
|
||||
if m:
|
||||
start, depth = i, len(m.group(1))
|
||||
break
|
||||
if start is None:
|
||||
sections = []
|
||||
i = 0
|
||||
while i < len(lines):
|
||||
m = HEADING_RE.match(lines[i])
|
||||
if not m:
|
||||
i += 1
|
||||
continue
|
||||
depth = len(m.group(1))
|
||||
body = []
|
||||
j = i + 1
|
||||
while j < len(lines):
|
||||
hm = re.match(r"^(#+)\s", lines[j])
|
||||
if hm and len(hm.group(1)) <= depth:
|
||||
break
|
||||
body.append(lines[j])
|
||||
j += 1
|
||||
sections.append((lines[i].strip(), body))
|
||||
i = j
|
||||
return sections
|
||||
|
||||
|
||||
def observation_items(text):
|
||||
"""(items, heading) — each item is (number, its full text), over EVERY observations section.
|
||||
heading is None when there is no section; several headings are joined with " + "."""
|
||||
sections = observation_sections(text)
|
||||
if not sections:
|
||||
return None, None
|
||||
|
||||
body = []
|
||||
for line in lines[start + 1:]:
|
||||
hm = re.match(r"^(#+)\s", line)
|
||||
if hm and len(hm.group(1)) <= depth:
|
||||
break
|
||||
body.append(line)
|
||||
|
||||
items, cur = [], None
|
||||
for line in body:
|
||||
m = ITEM_RE.match(line)
|
||||
if m:
|
||||
if cur:
|
||||
items.append(cur)
|
||||
cur = [m.group(1), m.group(2)]
|
||||
elif cur is not None:
|
||||
if line.strip() == "" and cur[1].endswith("\n\n"):
|
||||
continue
|
||||
cur[1] += "\n" + line
|
||||
if cur:
|
||||
items.append(cur)
|
||||
return items, lines[start].strip()
|
||||
for _heading, body in sections:
|
||||
for line in body:
|
||||
m = ITEM_RE.match(line)
|
||||
if m:
|
||||
if cur:
|
||||
items.append(cur)
|
||||
cur = [m.group(1), m.group(2)]
|
||||
elif cur is not None:
|
||||
if line.strip() == "" and cur[1].endswith("\n\n"):
|
||||
continue
|
||||
cur[1] += "\n" + line
|
||||
if cur:
|
||||
items.append(cur)
|
||||
cur = None
|
||||
return items, " + ".join(h for h, _ in sections)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
Reference in New Issue
Block a user