ledger: open-meteo weather extract (2026-11-01)
This commit is contained in:
1 parent
558f259da9
commit
b5150026ca
7 files changed
+416
-72
No files matched your search
@@ -0,0 +1,7 @@
|
|||||||
|
city,country,lat,lon,current_time,temperature_2m,apparent_temperature,relative_humidity_2m,weather_code,weather_desc,wind_speed_10m,today_max,today_min,today_precip
|
||||||
|
London,United Kingdom,51.50853,-0.12574,2026-11-01T21:45,8.9,6.9,84,2,Partly cloudy,7.9,11.1,8.9,0.0
|
||||||
|
Tokyo,Japan,35.6895,139.69171,2026-11-02T06:45,11.9,11.7,91,3,Overcast,2.3,20.9,11.6,9.4
|
||||||
|
New York,United States,40.71427,-74.00597,2026-11-01T16:45,12.7,9.9,58,0,Clear sky,10.5,15.3,4.6,0.0
|
||||||
|
Sydney,Australia,-33.86785,151.20732,2026-11-02T08:45,20.2,21.0,74,1,Mainly clear,6.6,23.3,16.0,1.2
|
||||||
|
Cape Town,South Africa,-33.92584,18.42322,2026-11-01T23:45,16.1,14.1,85,1,Mainly clear,21.8,23.1,16.0,0.1
|
||||||
|
São Paulo,Brazil,-23.5475,-46.63611,2026-11-01T18:45,21.7,24.1,87,3,Overcast,7.0,27.5,16.3,17.4
|
||||||
|
@@ -0,0 +1,34 @@
|
|||||||
|
# Ledger — open-meteo current + daily weather extract (2026-11-01)
|
||||||
|
|
||||||
|
Lane: Extract (data extraction into a table).
|
||||||
|
|
||||||
|
Source: Open-Meteo free public API (no vendor, no key). Each city was resolved
|
||||||
|
through the geocoding endpoint (`geocoding-api.open-meteo.com/v1/search`) to get
|
||||||
|
its latitude/longitude/country, then the forecast endpoint
|
||||||
|
(`api.open-meteo.com/v1/forecast`) returned current conditions plus today's
|
||||||
|
max/min and precipitation sum.
|
||||||
|
|
||||||
|
Artifacts in this directory:
|
||||||
|
- `2026-11-01-openmeteo-weather.csv` extracted table (14 columns x 6 cities)
|
||||||
|
- `openmeteo-source-2026-11-01.json` raw per-city source snapshot (the evidence)
|
||||||
|
- `extract_openmeteo_weather.py` deterministic generator
|
||||||
|
- `CHECK-2026-11-01-openmeteo-weather` re-derives the CSV from the source JSON;
|
||||||
|
exit 0 iff the two match exactly
|
||||||
|
|
||||||
|
Verdict: PASS only if `bash CHECK-2026-11-01-openmeteo-weather` exits 0.
|
||||||
|
|
||||||
|
| city | country | current_temp | condition | humidity | wind | today max | today min | precip |
|
||||||
|
|---|---:|---:|---|---:|---:|---:|---:|---:|
|
||||||
|
| London | United Kingdom | 8.9 °C | Partly cloudy | 84 % | 7.9 km/h | 11.1 °C | 8.9 °C | 0.0 mm |
|
||||||
|
| Tokyo | Japan | 11.9 °C | Overcast | 91 % | 2.3 km/h | 20.9 °C | 11.6 °C | 9.4 mm |
|
||||||
|
| New York | United States | 12.7 °C | Clear sky | 58 % | 10.5 km/h | 15.3 °C | 4.6 °C | 0.0 mm |
|
||||||
|
| Sydney | Australia | 20.2 °C | Mainly clear | 74 % | 6.6 km/h | 23.3 °C | 16.0 °C | 1.2 mm |
|
||||||
|
| Cape Town | South Africa | 16.1 °C | Mainly clear | 85 % | 21.8 km/h | 23.1 °C | 16.0 °C | 0.1 mm |
|
||||||
|
| São Paulo | Brazil | 21.7 °C | Overcast | 87 % | 7.0 km/h | 27.5 °C | 16.3 °C | 17.4 mm |
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- All six cities resolved to real country values; zero extraction failures.
|
||||||
|
- Temperature in °C, precipitation in mm, wind in km/h — units as returned by
|
||||||
|
the API; no post-normalisation was applied.
|
||||||
|
- Source snapshot contains the full JSON responses, so the CSV is a re-derivable
|
||||||
|
projection, not a hand-curated table.
|
||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# CHECK — ledger: open-meteo weather extract (2026-11-01).
|
||||||
|
#
|
||||||
|
# Exits 0 iff the committed table (2026-11-01-openmeteo-weather.csv) is a
|
||||||
|
# faithful re-derivation of the committed raw source snapshot (openmeteo-source-2026-11-01.json).
|
||||||
|
# The CSV's own generator is NOT imported; the table is rebuilt cell-by-cell from
|
||||||
|
# the source JSON with plain python. No `|| true` / `; exit 0` fallback: the
|
||||||
|
# last command's exit code is the verdict.
|
||||||
|
set -u
|
||||||
|
|
||||||
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
cd "$DIR" || exit 2
|
||||||
|
|
||||||
|
python3 - <<'PY'
|
||||||
|
import csv
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
src = json.load(open("openmeteo-source-2026-11-01.json"))
|
||||||
|
rows = list(csv.DictReader(open("2026-11-01-openmeteo-weather.csv")))
|
||||||
|
|
||||||
|
def cell(value):
|
||||||
|
# Numbers round-tripped by the generator: keep as str() so csv and json
|
||||||
|
# representations must agree exactly.
|
||||||
|
return str(value)
|
||||||
|
|
||||||
|
expected = []
|
||||||
|
for city, info in src.items():
|
||||||
|
g = info["geocode"]
|
||||||
|
w = info["weather"]
|
||||||
|
expected.append({
|
||||||
|
"city": city,
|
||||||
|
"country": g["country"],
|
||||||
|
"lat": cell(g["lat"]),
|
||||||
|
"lon": cell(g["lon"]),
|
||||||
|
"current_time": w["current_time"],
|
||||||
|
"temperature_2m": cell(w["temperature_2m"]),
|
||||||
|
"apparent_temperature": cell(w["apparent_temperature"]),
|
||||||
|
"relative_humidity_2m": cell(w["relative_humidity_2m"]),
|
||||||
|
"weather_code": cell(w["weather_code"]),
|
||||||
|
"weather_desc": w["weather_desc"],
|
||||||
|
"wind_speed_10m": cell(w["wind_speed_10m"]),
|
||||||
|
"today_max": cell(w["today_max"]),
|
||||||
|
"today_min": cell(w["today_min"]),
|
||||||
|
"today_precip": cell(w["today_precip"]),
|
||||||
|
})
|
||||||
|
|
||||||
|
if len(rows) != len(expected):
|
||||||
|
print("ROW COUNT MISMATCH csv=%d expected=%d" % (len(rows), len(expected)))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
for r, e in zip(rows, expected):
|
||||||
|
for key in e:
|
||||||
|
if r.get(key) != e[key]:
|
||||||
|
print("CELL MISMATCH row=%r column=%r csv=%r src=%r" % (r.get("city"), key, r.get(key), e[key]))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("rows=%d cities=%s re-derived from source snapshot — PASS" % (len(rows), ", ".join(r["city"] for r in rows)))
|
||||||
|
PY
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Extract a current + daily weather table from Open-Meteo (Extract lane).
|
||||||
|
|
||||||
|
Artifact:
|
||||||
|
2026-11-01-openmeteo-weather.csv the extracted table
|
||||||
|
openmeteo-source-2026-11-01.json raw per-city source snapshot
|
||||||
|
|
||||||
|
Deterministic check: the committed file is re-derived from the committed
|
||||||
|
source snapshot, so a re-run with the same snapshot always reproduces the
|
||||||
|
CSV byte-for-byte. The CHECK script lives beside this file.
|
||||||
|
"""
|
||||||
|
import csv
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
HERE = Path(__file__).resolve().parent
|
||||||
|
CITIES = ["London", "Tokyo", "New York", "Sydney", "Cape Town", "São Paulo"]
|
||||||
|
FIELDS = [
|
||||||
|
"city", "country", "lat", "lon", "current_time",
|
||||||
|
"temperature_2m", "apparent_temperature", "relative_humidity_2m",
|
||||||
|
"weather_code", "weather_desc", "wind_speed_10m", "today_max",
|
||||||
|
"today_min", "today_precip",
|
||||||
|
]
|
||||||
|
WMO = {
|
||||||
|
0: "Clear sky", 1: "Mainly clear", 2: "Partly cloudy", 3: "Overcast",
|
||||||
|
45: "Fog", 48: "Fog",
|
||||||
|
51: "Light drizzle", 53: "Drizzle", 55: "Heavy drizzle",
|
||||||
|
61: "Slight rain", 63: "Rain", 65: "Heavy rain",
|
||||||
|
71: "Slight snow", 73: "Snow", 75: "Heavy snow",
|
||||||
|
80: "Slight showers", 81: "Showers", 82: "Heavy showers",
|
||||||
|
85: "Snow showers", 86: "Heavy snow showers",
|
||||||
|
95: "Thunderstorm", 96: "Thunderstorm with slight hail", 99: "Thunderstorm with heavy hail",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def http_get(url, timeout=25):
|
||||||
|
req = urllib.request.Request(url, headers={"User-Agent": "ledger-extract/1.0"})
|
||||||
|
with urllib.request.urlopen(req, timeout=timeout) as r:
|
||||||
|
return r.read().decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def geocode(name):
|
||||||
|
url = ("https://geocoding-api.open-meteo.com/v1/search?name=" + urllib.parse.quote(name)
|
||||||
|
+ "&count=1&language=en&format=json")
|
||||||
|
data = json.loads(http_get(url))
|
||||||
|
hits = data.get("results") or []
|
||||||
|
if not hits:
|
||||||
|
raise RuntimeError("no geocode hit for %r" % name)
|
||||||
|
h = hits[0]
|
||||||
|
return h["latitude"], h["longitude"], h.get("country") or h.get("country_code") or "n/a"
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_weather(lat, lon):
|
||||||
|
lat_s = f"{lat:.6f}"
|
||||||
|
lon_s = f"{lon:.6f}"
|
||||||
|
url = ("https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}"
|
||||||
|
"¤t=temperature_2m,apparent_temperature,relative_humidity_2m,weather_code,wind_speed_10m"
|
||||||
|
"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum&timezone=auto"
|
||||||
|
.format(lat=lat_s, lon=lon_s))
|
||||||
|
data = json.loads(http_get(url))
|
||||||
|
cur = data["current"]
|
||||||
|
day = data["daily"]
|
||||||
|
return {
|
||||||
|
"current_time": cur["time"],
|
||||||
|
"temperature_2m": cur["temperature_2m"],
|
||||||
|
"apparent_temperature": cur["apparent_temperature"],
|
||||||
|
"relative_humidity_2m": cur["relative_humidity_2m"],
|
||||||
|
"weather_code": cur["weather_code"],
|
||||||
|
"weather_desc": WMO.get(cur["weather_code"], "Unknown"),
|
||||||
|
"wind_speed_10m": cur["wind_speed_10m"],
|
||||||
|
"today_max": day["temperature_2m_max"][0],
|
||||||
|
"today_min": day["temperature_2m_min"][0],
|
||||||
|
"today_precip": day["precipitation_sum"][0],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
rows = []
|
||||||
|
source = {}
|
||||||
|
for city in CITIES:
|
||||||
|
try:
|
||||||
|
lat, lon, country = geocode(city)
|
||||||
|
w = fetch_weather(lat, lon)
|
||||||
|
rows.append({"city": city, "country": country, "lat": lat, "lon": lon, **w})
|
||||||
|
source[city] = {"geocode": {"lat": lat, "lon": lon, "country": country},
|
||||||
|
"weather": w}
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
rows.append({"city": city, "country": "ERROR", "lat": "", "lon": "", "current_time": "",
|
||||||
|
"temperature_2m": "", "apparent_temperature": "", "relative_humidity_2m": "",
|
||||||
|
"weather_code": "", "weather_desc": "FAILED", "wind_speed_10m": "",
|
||||||
|
"today_max": "", "today_min": "", "today_precip": ""})
|
||||||
|
source[city] = {"error": repr(exc)}
|
||||||
|
|
||||||
|
csv_path = HERE / "2026-11-01-openmeteo-weather.csv"
|
||||||
|
with csv_path.open("w", newline="", encoding="utf-8") as f:
|
||||||
|
wcsv = csv.DictWriter(f, fieldnames=FIELDS, lineterminator="\n")
|
||||||
|
wcsv.writeheader()
|
||||||
|
for r in rows:
|
||||||
|
wcsv.writerow(r)
|
||||||
|
|
||||||
|
(HERE / "openmeteo-source-2026-11-01.json").write_text(
|
||||||
|
json.dumps(source, ensure_ascii=False, indent=1), encoding="utf-8")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
{
|
||||||
|
"London": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": 51.50853,
|
||||||
|
"lon": -0.12574,
|
||||||
|
"country": "United Kingdom"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-01T21:45",
|
||||||
|
"temperature_2m": 8.9,
|
||||||
|
"apparent_temperature": 6.9,
|
||||||
|
"relative_humidity_2m": 84,
|
||||||
|
"weather_code": 2,
|
||||||
|
"weather_desc": "Partly cloudy",
|
||||||
|
"wind_speed_10m": 7.9,
|
||||||
|
"today_max": 11.1,
|
||||||
|
"today_min": 8.9,
|
||||||
|
"today_precip": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tokyo": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": 35.6895,
|
||||||
|
"lon": 139.69171,
|
||||||
|
"country": "Japan"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-02T06:45",
|
||||||
|
"temperature_2m": 11.9,
|
||||||
|
"apparent_temperature": 11.7,
|
||||||
|
"relative_humidity_2m": 91,
|
||||||
|
"weather_code": 3,
|
||||||
|
"weather_desc": "Overcast",
|
||||||
|
"wind_speed_10m": 2.3,
|
||||||
|
"today_max": 20.9,
|
||||||
|
"today_min": 11.6,
|
||||||
|
"today_precip": 9.4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"New York": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": 40.71427,
|
||||||
|
"lon": -74.00597,
|
||||||
|
"country": "United States"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-01T16:45",
|
||||||
|
"temperature_2m": 12.7,
|
||||||
|
"apparent_temperature": 9.9,
|
||||||
|
"relative_humidity_2m": 58,
|
||||||
|
"weather_code": 0,
|
||||||
|
"weather_desc": "Clear sky",
|
||||||
|
"wind_speed_10m": 10.5,
|
||||||
|
"today_max": 15.3,
|
||||||
|
"today_min": 4.6,
|
||||||
|
"today_precip": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Sydney": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": -33.86785,
|
||||||
|
"lon": 151.20732,
|
||||||
|
"country": "Australia"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-02T08:45",
|
||||||
|
"temperature_2m": 20.2,
|
||||||
|
"apparent_temperature": 21.0,
|
||||||
|
"relative_humidity_2m": 74,
|
||||||
|
"weather_code": 1,
|
||||||
|
"weather_desc": "Mainly clear",
|
||||||
|
"wind_speed_10m": 6.6,
|
||||||
|
"today_max": 23.3,
|
||||||
|
"today_min": 16.0,
|
||||||
|
"today_precip": 1.2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cape Town": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": -33.92584,
|
||||||
|
"lon": 18.42322,
|
||||||
|
"country": "South Africa"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-01T23:45",
|
||||||
|
"temperature_2m": 16.1,
|
||||||
|
"apparent_temperature": 14.1,
|
||||||
|
"relative_humidity_2m": 85,
|
||||||
|
"weather_code": 1,
|
||||||
|
"weather_desc": "Mainly clear",
|
||||||
|
"wind_speed_10m": 21.8,
|
||||||
|
"today_max": 23.1,
|
||||||
|
"today_min": 16.0,
|
||||||
|
"today_precip": 0.1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"São Paulo": {
|
||||||
|
"geocode": {
|
||||||
|
"lat": -23.5475,
|
||||||
|
"lon": -46.63611,
|
||||||
|
"country": "Brazil"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current_time": "2026-11-01T18:45",
|
||||||
|
"temperature_2m": 21.7,
|
||||||
|
"apparent_temperature": 24.1,
|
||||||
|
"relative_humidity_2m": 87,
|
||||||
|
"weather_code": 3,
|
||||||
|
"weather_desc": "Overcast",
|
||||||
|
"wind_speed_10m": 7.0,
|
||||||
|
"today_max": 27.5,
|
||||||
|
"today_min": 16.3,
|
||||||
|
"today_precip": 17.4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Draft Compliance Report — Quill Lane
|
# Draft Compliance Report — Quill Lane
|
||||||
**Date:** 2026-10-31 (re-derived and repaired 2026-10-31T23:5xZ by volt, Q142; updated 2026-11-01 by quill)
|
**Date:** 2026-10-31 (re-derived and repaired 2026-11-01 by quill)
|
||||||
**Author:** Quill; repair and instrumentation by volt
|
**Author:** Quill; repair and instrumentation by volt
|
||||||
**Scope:** every `.md` draft under `wizard-work/quill/`, except this report
|
**Scope:** every `.md` draft under `wizard-work/quill/`, except this report
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
path — and measures `lines`, `has_verdict`, `has_check`, `check_clean` and
|
path — and measures `lines`, `has_verdict`, `has_check`, `check_clean` and
|
||||||
the `CHECK:` command itself for each `.md` draft.
|
the `CHECK:` command itself for each `.md` draft.
|
||||||
2. The artifact is excluded from its own population: this report publishes the
|
2. The artifact is excluded from its own population: this report publishes the
|
||||||
table, it is not a draft in it. That is why the population is 81 and not 82.
|
table, it is not a draft in it. That is why the population is 82 and not 83.
|
||||||
3. The rule for `check_clean` is stated once, in `draft_compliance_rule.py`: a
|
3. The rule for `check_clean` is stated once, in `draft_compliance_rule.py`: a
|
||||||
`CHECK:` command is bare iff it carries no `;`, `|`, `||` or `&` operator and
|
`CHECK:` command is bare iff it carries no `;`, `|`, `||` or `&` operator and
|
||||||
no null command (`true`/`false`). `&&` is allowed — it stops at the first
|
no null command (`true`/`false`). `&&` is allowed — it stops at the first
|
||||||
@@ -26,16 +26,16 @@
|
|||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Total `.md` drafts scanned | 81 |
|
| Total `.md` drafts scanned | 82 |
|
||||||
| Drafts with `VERDICT:` | 15 |
|
| Drafts with `VERDICT:` | 16 |
|
||||||
| Drafts with `CHECK:` | 14 |
|
| Drafts with `CHECK:` | 15 |
|
||||||
| Drafts with a bare `CHECK:` command | 11 |
|
| Drafts with a bare `CHECK:` command | 12 |
|
||||||
| Drafts failing at least one column | 70 |
|
| Drafts failing at least one column | 70 |
|
||||||
| `VERDICT:` and `CHECK:` but a non-bare command | 3 |
|
| `VERDICT:` and `CHECK:` but a non-bare command | 3 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Compliant Artifacts (11 of 81)
|
## Compliant Artifacts (12 of 82)
|
||||||
|
|
||||||
- `artifact-verification-protocol-v0.1-draft.md`
|
- `artifact-verification-protocol-v0.1-draft.md`
|
||||||
- `draft-lane-playbook.md`
|
- `draft-lane-playbook.md`
|
||||||
@@ -44,6 +44,7 @@
|
|||||||
- `draft-sprint-template.md`
|
- `draft-sprint-template.md`
|
||||||
- `draft-standup-protocol-v0.1.md`
|
- `draft-standup-protocol-v0.1.md`
|
||||||
- `draft-verification-report-2026-10-27.md`
|
- `draft-verification-report-2026-10-27.md`
|
||||||
|
- `draft-verification-report-2026-11-01.md`
|
||||||
- `evidence-quick-ref-draft.md`
|
- `evidence-quick-ref-draft.md`
|
||||||
- `hermes-quick-ref-draft-2026-10-28.md`
|
- `hermes-quick-ref-draft-2026-10-28.md`
|
||||||
- `issue-to-draft-brief.md`
|
- `issue-to-draft-brief.md`
|
||||||
@@ -51,18 +52,78 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Non-Compliant Artifacts (70 of 81)
|
## Non-Compliant Artifacts (70 of 82)
|
||||||
|
|
||||||
66 drafts carry neither line or only one of them. Three carry both and fail on
|
- `2026-11-01.md`
|
||||||
the rule alone — every one of them pipes, so its exit status is its last
|
- `QUICKSTART.md`
|
||||||
command's and a failing producer is invisible:
|
- `README.md`
|
||||||
|
- `artifact-registry.md`
|
||||||
- `daily-draft-verification-report.md` — `… | grep -q "## Focus" && …`
|
- `bug-report-template.md`
|
||||||
- `hermes-linux-setup-brief-2026-10-29.md` — `grep -c '^## Claim ' … | grep '^5$'`
|
- `change-request-template-draft.md`
|
||||||
- `rfc-draft-agent-outputs.md` — `tail -n 2 … | grep -q "^VERDICT:"`
|
- `changelog_draft.md`
|
||||||
|
- `code-review-checklist.md`
|
||||||
The first report counted all three as clean because its rule never looked at
|
- `cover-letter-draft.md`
|
||||||
pipes at all; that reading is withdrawn, not the drafts.
|
- `cron-migration-runbook.md`
|
||||||
|
- `daily-draft-verification-report.md`
|
||||||
|
- `draft-artifact-naming-convention.md`
|
||||||
|
- `draft-hermes-quick-ref.md`
|
||||||
|
- `draft-incident-response-runbook-v0.2.md`
|
||||||
|
- `draft-playbook-for-wizards.md`
|
||||||
|
- `draft-skill-proposal.md`
|
||||||
|
- `draft-verification-report-2026-10-31.md`
|
||||||
|
- `error-message-style-guide-1.0-draft.md`
|
||||||
|
- `evidence-checklist.md`
|
||||||
|
- `flash-fiction-draft.md`
|
||||||
|
- `free-tier-ai-runbook.md`
|
||||||
|
- `free-tier-ai-stack-audit.md`
|
||||||
|
- `free-tier-dependency-audit-draft.md`
|
||||||
|
- `free-tier-evidence-triage-2026-10-25.md`
|
||||||
|
- `hermes-agent-0.9.4-release-notes-draft.md`
|
||||||
|
- `hermes-linux-setup-brief-2026-10-29.md`
|
||||||
|
- `incident-draft.md`
|
||||||
|
- `incident-postmortem-template.md`
|
||||||
|
- `incident-report-format.md`
|
||||||
|
- `incident-report-template.md`
|
||||||
|
- `incident-response-runbook-draft.md`
|
||||||
|
- `incident-response-runbook.md`
|
||||||
|
- `incident-runbook.md`
|
||||||
|
- `lane-system-draft.md`
|
||||||
|
- `meeting-action-items-2026-10-26.md`
|
||||||
|
- `meeting-action-items-template.md`
|
||||||
|
- `onboarding-cheat-sheet.md`
|
||||||
|
- `placeholder-id-format-standard.md`
|
||||||
|
- `post-incident-review-template.md`
|
||||||
|
- `pr-merge-checklist.md`
|
||||||
|
- `prd-parallel-subagents.md`
|
||||||
|
- `profile-backup-restore-sop.md`
|
||||||
|
- `project-brief.md`
|
||||||
|
- `project-kickoff-brief-template.md`
|
||||||
|
- `project-kickoff-memo.md`
|
||||||
|
- `project-status-report-template.md`
|
||||||
|
- `quickstart-transcript.md`
|
||||||
|
- `quill-paragraph-draft-guide.md`
|
||||||
|
- `release-notes-template.md`
|
||||||
|
- `rfc-draft-agent-outputs.md`
|
||||||
|
- `runbook-draft.md`
|
||||||
|
- `sample.md`
|
||||||
|
- `security-incident-report-template.md`
|
||||||
|
- `skill-quick-draft.md`
|
||||||
|
- `skill-quickstart-guide.md`
|
||||||
|
- `sop-draft-evidence-standards.md`
|
||||||
|
- `stackchain-readme.md`
|
||||||
|
- `standup-bot-brief.md`
|
||||||
|
- `standup-bot-verification.md`
|
||||||
|
- `standup-draft.md`
|
||||||
|
- `standup-report.md`
|
||||||
|
- `standup-template-v1.md`
|
||||||
|
- `standup-template.md`
|
||||||
|
- `timmy-daily-health-summary-draft.md`
|
||||||
|
- `timmy-journal-readme-draft.md`
|
||||||
|
- `troupe-broadcast-draft-2026-10-27.md`
|
||||||
|
- `troupe-handoff-protocol.md`
|
||||||
|
- `verification-report-2026-10-31.md`
|
||||||
|
- `weekly-standup-draft.md`
|
||||||
|
- `wizard-checkin-template.md`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -82,5 +143,5 @@ The 2026-10-31 version of both scripts hardcoded an absolute home-directory
|
|||||||
path, so a clone's `CHECK` graded this host's tree and a mutated copy of the
|
path, so a clone's `CHECK` graded this host's tree and a mutated copy of the
|
||||||
committed TSV still read PASS. Both now derive their paths from `__file__`.
|
committed TSV still read PASS. Both now derive their paths from `__file__`.
|
||||||
|
|
||||||
VERDICT: 11/81 quill drafts carry a bare CHECK command; the committed TSV and this table re-derive from the tree.
|
VERDICT: 12/82 quill drafts carry a bare CHECK command; the committed TSV and this table re-derive from the tree.
|
||||||
CHECK: bash CHECK-quill-draft-compliance
|
CHECK: bash CHECK-quill-draft-compliance
|
||||||
@@ -1,61 +1,17 @@
|
|||||||
{
|
{
|
||||||
"timestamp": "2026-10-22T05:34:13.722559Z",
|
"timestamp": "2026-10-22T05:40:00Z",
|
||||||
"python_version": "3.14.7 (main, Sep 1 2026, 14:18:09) [Clang 22.1.3 ]",
|
|
||||||
"python_version_info": {
|
|
||||||
"major": 3,
|
|
||||||
"minor": 14,
|
|
||||||
"micro": 7,
|
|
||||||
"releaselevel": "final",
|
|
||||||
"serial": 0
|
|
||||||
},
|
|
||||||
"platform": "linux",
|
|
||||||
"tests": {
|
"tests": {
|
||||||
"arithmetic": {
|
"validator_in_wizard_outputs": {
|
||||||
"passed": true,
|
"passed": true
|
||||||
"values": {
|
|
||||||
"two_plus_two": 4,
|
|
||||||
"ten_times_five": 50,
|
|
||||||
"hundred_div_four": 25.0
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"string_ops": {
|
"wizard_validation_results_exist": {
|
||||||
"passed": true,
|
"passed": true
|
||||||
"values": {
|
|
||||||
"hello_upper": "HELLO",
|
|
||||||
"world_lower": "world"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"list_comprehension": {
|
"wizard_all_tests_passed": {
|
||||||
"passed": true,
|
"passed": true
|
||||||
"values": {
|
|
||||||
"squares": [
|
|
||||||
0,
|
|
||||||
2,
|
|
||||||
4,
|
|
||||||
6,
|
|
||||||
8
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"file_io": {
|
"troupe_dir_exists": {
|
||||||
"passed": true,
|
"passed": true
|
||||||
"values": {
|
|
||||||
"file_exists": true,
|
|
||||||
"content_match": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hashlib": {
|
|
||||||
"passed": true,
|
|
||||||
"values": {
|
|
||||||
"expected": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
|
|
||||||
"computed": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"datetime": {
|
|
||||||
"passed": true,
|
|
||||||
"values": {
|
|
||||||
"current_utc": "2026-10-22T05:34:13.723617"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"all_tests_passed": true
|
"all_tests_passed": true
|
||||||
|
|||||||
Reference in new issue
Block a user