Files
boshu2__agentops/docs/convergence/operationalized/scripts/extract-kernel.py
Bo cfee2b078a docs(convergence): first-class Convergence section — The Reading + Ledger + Google SRE map (ag-4hf7 #google-sre-convergence) (#650)
## What

Establishes a first-class **`docs/convergence/`** section: the record of
the industry independently arriving at the structure AgentOps already
runs — kept distinct from the competitor map. Three surfaces:

1. **`the-reading.md`** — the *living thesis*. The argument (with
mechanism, firm-vs-forming consensus table, honest moat-risk, and a "how
to read a new signal" rubric) that the industry is converging and
**why**.
2. **`ledger.md`** — the dated *receipts* table (who/when/which
invariant). Seeded with Google SRE 2026.
3. **`google-sre.md`** — the per-party *encoding map*: 11 convergence
points → real AgentOps loci (8 encoded · 2 partial · 1 gap).
4. **`index.md`** — section hub framing the three.

## Why first-class, not under comparisons/

A vindication record is the *inverse* of a competitor grid — wrong to
parent it under "vs the competition." Radar = competitors in our lane;
Convergence = independents arriving from outside it. Promoted to its own
top-level nav section (`git mv`, history preserved; permalinks updated;
cross-links rewired both ways).

## Gaps surfaced (filed as beads)

| Bead | Point | Work |
|---|---|---|
| `ag-fjbu` | #3 | Adopt Bronze/Silver/Gold eval-tiering +
True-vs-Observed-Precision naming |
| `ag-wrom` | #8 | Formalize an L0–L4-style autonomy ladder for AgentOps
dispatch |
| `ag-7278` | #11 | Council: does coherent-arc need a fix-forward escape
hatch? (Google is ahead) |

## Verification

- All relative links across the convergence section + comparisons
pointers resolve.
- mkdocs nav + documentation-index updated; renames preserve history.

Closes-scenario: ag-4hf7#google-sre-convergence
Bounded-context: BC1-Corpus
Evidence: docs/convergence/the-reading.md
2026-05-31 18:48:45 +00:00

50 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""Extract the marker-bounded triangulated kernel; validate markers + minimum counts.
Prints the kernel body to stdout on success. Exit non-zero if markers absent or counts below minimum.
"""
from __future__ import annotations
import re
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
KERNEL = ROOT / "corpus" / "specs" / "triangulated_kernel.md"
MIN_AXIOMS = 10
MIN_OPERATORS = 8
def main() -> int:
if not KERNEL.is_file():
print("FAIL: missing triangulated_kernel.md", file=sys.stderr)
return 1
text = KERNEL.read_text(encoding="utf-8")
m = re.search(
r"<!--\s*TRIANGULATED_KERNEL_START\s+(v\d+\.\d+)\s*-->(.*?)<!--\s*TRIANGULATED_KERNEL_END\s+(v\d+\.\d+)\s*-->",
text, re.S,
)
if not m:
print("FAIL: kernel START/END markers absent or malformed", file=sys.stderr)
return 1
vstart, body, vend = m.group(1), m.group(2), m.group(3)
if vstart != vend:
print(f"FAIL: version mismatch {vstart} != {vend}", file=sys.stderr)
return 1
axioms = re.findall(r"^\s*-\s*\*\*A\d+\s*—", body, re.M)
operators = re.findall(r"`[A-Z][A-Za-z-]+`\s*\(A", body)
if len(axioms) < MIN_AXIOMS:
print(f"FAIL: only {len(axioms)} axioms (min {MIN_AXIOMS})", file=sys.stderr)
return 1
if len(operators) < MIN_OPERATORS:
print(f"FAIL: only {len(operators)} operators (min {MIN_OPERATORS})", file=sys.stderr)
return 1
sys.stderr.write(f"OK kernel {vstart}: {len(axioms)} axioms, {len(operators)} operators\n")
sys.stdout.write(body.strip() + "\n")
return 0
if __name__ == "__main__":
sys.exit(main())