Compare commits
13
Commits
e8ee2348d0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
175d1efde6 | ||
|
|
0bb206f2c6 | ||
|
|
a2f1a79df4 | ||
|
|
b19fd4ff41 | ||
|
|
44856a4920 | ||
|
|
1ce0e9051d | ||
|
|
2ccf8a6b6b | ||
|
|
801a2b4970 | ||
|
|
d5f24f1e0d | ||
|
|
b04ebe0960 | ||
|
|
a777fe7ee6 | ||
|
|
de0f0a7250 | ||
|
|
3e0e1f549a |
No files matched your search
+141
@@ -0,0 +1,141 @@
|
||||
#!/usr/bin/env bash
|
||||
# CHECK-q154 -- quill's draft-compliance census is a snapshot, and it is graded
|
||||
# against the revision it names (volt, 2026-11-02).
|
||||
#
|
||||
# Five legs:
|
||||
# gate the repaired quill gate reads 0: selftest / pinned / rev-probe /
|
||||
# regenerate / copy-parity
|
||||
# rev-probe the verifier's revision mode is a measurement: the pinned rev is
|
||||
# 0, 8847c7c -- the commit that hand-edited the table -- is 1, and
|
||||
# a rev that does not resolve is 2, not a pass
|
||||
# delegation the lane copy is a pointer to the root gate (0 in place) and a
|
||||
# copy without its target is ungradable (2), never a pass
|
||||
# beam the adjacent host-path binding the repo gate was red on is
|
||||
# repaired: the authority reads 0 faults, and the test file in a
|
||||
# copy grades the module BESIDE it (poisoned sibling 1, no sibling 1)
|
||||
# pin the pin names a rev that resolves, the committed table is the
|
||||
# bytes it names, and the table carries its header row
|
||||
#
|
||||
# Exit codes: 0 all legs passed, 1 a fault, 2 could not grade.
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2
|
||||
ROOT="$(pwd)"
|
||||
LANE="$ROOT/wizard-work/quill"
|
||||
PIN="$LANE/draft-compliance-report-2026-10-31.pin"
|
||||
TSV="$LANE/draft-compliance-report-2026-10-31.tsv"
|
||||
WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q154.XXXXXX")" || exit 2
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
|
||||
passed=0
|
||||
failed=0
|
||||
ungradable=0
|
||||
row() { printf ' %-12s %s\n' "$1" "$2"; }
|
||||
|
||||
PIN_REV="$(sed -n 's/^rev[[:space:]]*//p' "$PIN" 2>/dev/null | head -1)"
|
||||
PIN_TSV="$(sed -n 's/^tsv[[:space:]]*//p' "$PIN" 2>/dev/null | head -1)"
|
||||
|
||||
# --- leg 1: the quill gate ---------------------------------------------------
|
||||
bash "$ROOT/CHECK-quill-draft-compliance" >"$WORK/gate.out" 2>&1
|
||||
gate_rc=$?
|
||||
if [ "$gate_rc" -eq 0 ]; then
|
||||
row gate "PASS $(tail -n 1 "$WORK/gate.out")"
|
||||
passed=$((passed + 1))
|
||||
elif [ "$gate_rc" -eq 2 ]; then
|
||||
row gate "UNGRADABLE rc=2"
|
||||
cat "$WORK/gate.out"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
row gate "FAULT rc=$gate_rc"
|
||||
cat "$WORK/gate.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
|
||||
# --- leg 2: revision mode is a measurement ----------------------------------
|
||||
if [ -z "$PIN_REV" ]; then
|
||||
row rev-probe "UNGRADABLE pin names no rev"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
python3 "$LANE/verify_draft_compliance.py" --rev "$PIN_REV" >"$WORK/r1.out" 2>&1
|
||||
r1=$?
|
||||
python3 "$LANE/verify_draft_compliance.py" --rev 8847c7c >"$WORK/r2.out" 2>&1
|
||||
r2=$?
|
||||
python3 "$LANE/verify_draft_compliance.py" --rev 0000000000000000000000000000000000000000 \
|
||||
>"$WORK/r3.out" 2>&1
|
||||
r3=$?
|
||||
if [ "$r1" -eq 0 ] && [ "$r2" -eq 1 ] && [ "$r3" -eq 2 ]; then
|
||||
row rev-probe "PASS ${PIN_REV:0:7} rc=0, 8847c7c rc=1, bogus rev rc=2"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row rev-probe "FAULT pinned rc=$r1 (want 0), 8847c7c rc=$r2 (want 1), bogus rc=$r3 (want 2)"
|
||||
head -3 "$WORK/r1.out" "$WORK/r2.out" "$WORK/r3.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- leg 3: the lane copy delegates, and says so when it cannot -------------
|
||||
bash "$LANE/CHECK-quill-draft-compliance" >"$WORK/d1.out" 2>&1
|
||||
d1=$?
|
||||
mkdir -p "$WORK/lone/wizard-work/quill"
|
||||
cp "$LANE/CHECK-quill-draft-compliance" "$WORK/lone/wizard-work/quill/"
|
||||
bash "$WORK/lone/wizard-work/quill/CHECK-quill-draft-compliance" >"$WORK/d2.out" 2>&1
|
||||
d2=$?
|
||||
if [ "$d1" -eq 0 ] && [ "$d2" -eq 2 ]; then
|
||||
row delegation "PASS lane copy rc=0, orphaned copy rc=2 ($(head -n 1 "$WORK/d2.out"))"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row delegation "FAULT lane copy rc=$d1 (want 0), orphaned rc=$d2 (want 2)"
|
||||
head -3 "$WORK/d1.out" "$WORK/d2.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
|
||||
# --- leg 4: the adjacent beam binding, and that it is really bound ----------
|
||||
python3 "$ROOT/tools/import_resolve_check.py" --repo "$ROOT" --rev WORKTREE \
|
||||
>"$WORK/irc.out" 2>&1
|
||||
irc=$?
|
||||
mkdir -p "$WORK/b/copy" "$WORK/b/alone"
|
||||
cp "$ROOT/wizard-work/beam/test_largest_rect_hist.py" \
|
||||
"$ROOT/wizard-work/beam/largest_rect_hist.py" "$WORK/b/copy/"
|
||||
( cd "$WORK/b/copy" && python3 test_largest_rect_hist.py >/dev/null 2>&1 )
|
||||
b_ok=$?
|
||||
sed -i 's/^def _brute(heights: List\[int\]) -> int:/&\n return 0/' \
|
||||
"$WORK/b/copy/largest_rect_hist.py"
|
||||
( cd "$WORK/b/copy" && python3 test_largest_rect_hist.py >/dev/null 2>&1 )
|
||||
b_poison=$?
|
||||
cp "$ROOT/wizard-work/beam/test_largest_rect_hist.py" "$WORK/b/alone/"
|
||||
( cd "$WORK/b/alone" && python3 test_largest_rect_hist.py >/dev/null 2>&1 )
|
||||
b_alone=$?
|
||||
if [ "$irc" -eq 0 ] && [ "$b_ok" -eq 0 ] && [ "$b_poison" -eq 1 ] && [ "$b_alone" -eq 1 ]; then
|
||||
row beam "PASS authority 0 fault(s); sibling rc=0, poisoned rc=1, absent rc=1"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row beam "FAULT authority rc=$irc, sibling rc=$b_ok (want 0), poisoned rc=$b_poison (want 1), absent rc=$b_alone (want 1)"
|
||||
tail -3 "$WORK/irc.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
|
||||
# --- leg 5: the pin's three claims ------------------------------------------
|
||||
if [ -z "$PIN_REV" ] || [ -z "$PIN_TSV" ]; then
|
||||
row pin "UNGRADABLE pin lacks a rev or a tsv digest"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
git -C "$ROOT" cat-file -e "$PIN_REV^{commit}" 2>/dev/null
|
||||
pin_rev_rc=$?
|
||||
have="$(sha256sum "$TSV" | cut -d' ' -f1)"
|
||||
header="$(sed -n 2p "$TSV")"
|
||||
want_header="$(printf 'filename lines has_verdict has_check check_clean check_command')"
|
||||
if [ "$pin_rev_rc" -eq 0 ] && [ "$have" = "$PIN_TSV" ] && [ "$header" = "$want_header" ]; then
|
||||
row pin "PASS rev resolves, sha256 ${have:0:12}, header row present"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row pin "FAULT rev rc=$pin_rev_rc, digest ${have:0:12} vs pin ${PIN_TSV:0:12}, header=$(printf %q "$header")"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "CHECK-q154: $passed leg(s) passed, $failed fault(s), $ungradable ungradable"
|
||||
[ "$failed" -eq 0 ] || exit 1
|
||||
[ "$ungradable" -eq 0 ] || exit 2
|
||||
exit 0
|
||||
@@ -1,14 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# CHECK -- quill: draft-compliance report 2026-10-31 (forge: quill lane; gate by volt, Q142).
|
||||
# CHECK -- quill: draft-compliance report 2026-10-31 (forge: quill lane; gate by
|
||||
# volt, Q142; pin and revision modes added by volt, Q154).
|
||||
#
|
||||
# Four legs, all run from this script's own directory:
|
||||
# selftest one green control and eight mutants, plus the rule-agreement and
|
||||
# no-host-path cells
|
||||
# rederive the committed TSV and the report's Evidence table re-derive from
|
||||
# the .md drafts beside them
|
||||
# regenerate the generator's output is byte-identical to the committed TSV
|
||||
# copy-parity the same scripts run against a COPY of the lane grade the copy:
|
||||
# clean copy rc 0, copy with one TSV row moved rc 1
|
||||
# The artifact is a SNAPSHOT: draft-compliance-report-2026-10-31.{tsv,md} counts
|
||||
# the .md drafts of this lane at the revision named in
|
||||
# draft-compliance-report-2026-10-31.pin. Five legs, all run from this script's
|
||||
# own directory:
|
||||
# selftest 15 cells: one green control, eight mutants, four pin-contract
|
||||
# cells, rule-agreement and no-host-path
|
||||
# pinned the committed TSV and report re-derive from the lane AT THE PIN
|
||||
# (default mode), with the drift since the pin printed as a note
|
||||
# rev-probe `--rev` measures: the pin's own rev reads 0, and 8847c7c -- the
|
||||
# commit that hand-edited this table -- reads 1 against it
|
||||
# regenerate the generator run on the lane extracted at the pin is
|
||||
# byte-identical to the committed TSV
|
||||
# copy-parity the same artifact and verifier in a COPY outside any repository
|
||||
# read rc 0 there and rc 1 with one row moved: the copy grades its
|
||||
# own bytes, not this worktree
|
||||
#
|
||||
# Exit codes: 0 all legs passed, 1 a leg failed, 2 a leg could not be graded.
|
||||
set -u
|
||||
@@ -17,78 +25,120 @@ set -o pipefail
|
||||
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2
|
||||
ROOT="$(pwd)"
|
||||
LANE="$ROOT/wizard-work/quill"
|
||||
PIN="$LANE/draft-compliance-report-2026-10-31.pin"
|
||||
TSV="$LANE/draft-compliance-report-2026-10-31.tsv"
|
||||
WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-quill.XXXXXX")" || exit 2
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
|
||||
passed=0
|
||||
failed=0
|
||||
ungradable=0
|
||||
row() { printf ' %-12s %s\n' "$1" "$2"; }
|
||||
|
||||
PIN_REV="$(sed -n 's/^rev[[:space:]]*//p' "$PIN" 2>/dev/null | head -1)"
|
||||
|
||||
# --- leg 1: the verifier's own cells -----------------------------------------
|
||||
if python3 "$LANE/verify_draft_compliance.py" --selftest >"$WORK/selftest.out" 2>&1; then
|
||||
python3 "$LANE/verify_draft_compliance.py" --selftest >"$WORK/selftest.out" 2>&1
|
||||
st_rc=$?
|
||||
if [ "$st_rc" -eq 0 ]; then
|
||||
row selftest "PASS $(tail -n 1 "$WORK/selftest.out")"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row selftest "FAULT $(tail -n 1 "$WORK/selftest.out")"
|
||||
row selftest "FAULT rc=$st_rc $(tail -n 1 "$WORK/selftest.out")"
|
||||
cat "$WORK/selftest.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
|
||||
# --- leg 2: the committed artifact re-derives --------------------------------
|
||||
if python3 "$LANE/verify_draft_compliance.py" >"$WORK/rederive.out" 2>&1; then
|
||||
row rederive "PASS $(head -n 1 "$WORK/rederive.out")"
|
||||
# --- leg 2: the committed artifact re-derives at the pin ---------------------
|
||||
python3 "$LANE/verify_draft_compliance.py" >"$WORK/pinned.out" 2>&1
|
||||
pin_rc=$?
|
||||
if [ "$pin_rc" -eq 0 ]; then
|
||||
row pinned "PASS $(head -n 1 "$WORK/pinned.out") [$(sed -n 2p "$WORK/pinned.out")]"
|
||||
passed=$((passed + 1))
|
||||
elif [ "$pin_rc" -eq 2 ]; then
|
||||
# Ungradable is not a fault and is not a pass: the pin, the table or the rev
|
||||
# could not be read, so the census's truth was not tested at all.
|
||||
row pinned "UNGRADABLE rc=2 $(head -n 2 "$WORK/pinned.out" | tr '\n' ' ')"
|
||||
cat "$WORK/pinned.out"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
rc=$?
|
||||
row rederive "FAULT rc=$rc"
|
||||
cat "$WORK/rederive.out"
|
||||
row pinned "FAULT rc=$pin_rc"
|
||||
cat "$WORK/pinned.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
|
||||
# --- leg 3: the TSV is exactly what the generator writes ---------------------
|
||||
python3 "$LANE/draft_compliance_report.py" >"$WORK/regen.tsv" 2>"$WORK/regen.err"
|
||||
gen_rc=$?
|
||||
if [ "$gen_rc" -ne 0 ]; then
|
||||
row regenerate "FAULT generator rc=$gen_rc"
|
||||
cat "$WORK/regen.err"
|
||||
failed=$((failed + 1))
|
||||
elif cmp -s "$WORK/regen.tsv" "$LANE/draft-compliance-report-2026-10-31.tsv"; then
|
||||
row regenerate "PASS bytes identical ($(wc -c <"$WORK/regen.tsv") B)"
|
||||
passed=$((passed + 1))
|
||||
# --- leg 3: --rev is a measurement, not a flag ------------------------------
|
||||
if [ -z "$PIN_REV" ]; then
|
||||
row rev-probe "UNGRADABLE pin names no rev"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
row regenerate "FAULT committed TSV differs from a fresh derivation"
|
||||
diff "$WORK/regen.tsv" "$LANE/draft-compliance-report-2026-10-31.tsv" | head -10
|
||||
failed=$((failed + 1))
|
||||
python3 "$LANE/verify_draft_compliance.py" --rev "$PIN_REV" >"$WORK/rev-ok.out" 2>&1
|
||||
ok_rc=$?
|
||||
python3 "$LANE/verify_draft_compliance.py" --rev 8847c7c >"$WORK/rev-bad.out" 2>&1
|
||||
bad_rc=$?
|
||||
if [ "$ok_rc" -eq 0 ] && [ "$bad_rc" -eq 1 ]; then
|
||||
row rev-probe "PASS ${PIN_REV:0:7} rc=0, 8847c7c rc=1"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row rev-probe "FAULT pin rev rc=$ok_rc (want 0), 8847c7c rc=$bad_rc (want 1)"
|
||||
head -4 "$WORK/rev-ok.out" "$WORK/rev-bad.out"
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- leg 4: the COMMITTED artifact grades a copy of itself -------------------
|
||||
# The copy comes from HEAD (git archive), not from the worktree, so this leg is a
|
||||
# reading of the committed bytes and is unaffected by an uncommitted edit that
|
||||
# legs 2 and 3 already fault.
|
||||
mkdir -p "$WORK/lane" || exit 2
|
||||
if ! git -C "$ROOT" archive HEAD wizard-work/quill 2>"$WORK/archive.err" \
|
||||
| tar -x -C "$WORK/lane" 2>>"$WORK/archive.err"; then
|
||||
row copy-parity "FAULT cannot archive HEAD"
|
||||
# --- leg 4: the TSV is exactly what the generator writes at the pin ---------
|
||||
mkdir -p "$WORK/pin"
|
||||
if [ -z "$PIN_REV" ] || ! git -C "$ROOT" archive "$PIN_REV" -- wizard-work/quill \
|
||||
2>"$WORK/archive.err" | tar -x -C "$WORK/pin" 2>>"$WORK/archive.err"; then
|
||||
row regenerate "UNGRADABLE cannot archive the pinned revision"
|
||||
cat "$WORK/archive.err"
|
||||
failed=$((failed + 1))
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
COPY="$WORK/lane/wizard-work/quill"
|
||||
if python3 "$COPY/verify_draft_compliance.py" >"$WORK/copy-clean.out" 2>&1; then
|
||||
python3 "$WORK/pin/wizard-work/quill/draft_compliance_report.py" \
|
||||
>"$WORK/regen.tsv" 2>"$WORK/regen.err"
|
||||
gen_rc=$?
|
||||
if [ "$gen_rc" -ne 0 ]; then
|
||||
row regenerate "FAULT generator rc=$gen_rc"
|
||||
cat "$WORK/regen.err"
|
||||
failed=$((failed + 1))
|
||||
elif cmp -s "$WORK/regen.tsv" "$TSV"; then
|
||||
row regenerate "PASS bytes identical ($(wc -c <"$TSV") B)"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row regenerate "FAULT committed TSV differs from the derivation at $PIN_REV"
|
||||
diff "$WORK/regen.tsv" "$TSV" | head -10
|
||||
failed=$((failed + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- leg 5: the artifact grades a copy of itself, outside any repository ----
|
||||
mkdir -p "$WORK/copy" || exit 2
|
||||
if ! git -C "$ROOT" archive "$PIN_REV" -- wizard-work/quill \
|
||||
2>"$WORK/copy.err" | tar -x -C "$WORK/copy" 2>>"$WORK/copy.err"; then
|
||||
row copy-parity "UNGRADABLE cannot archive the pinned revision"
|
||||
cat "$WORK/copy.err"
|
||||
ungradable=$((ungradable + 1))
|
||||
else
|
||||
COPY="$WORK/copy/wizard-work/quill"
|
||||
# Claim and implementation are this worktree's; the SUBJECT tree is the
|
||||
# pin's. That is the split the artifact itself makes.
|
||||
cp "$TSV" "$COPY/" && cp "$LANE/draft-compliance-report-2026-10-31.md" "$COPY/" \
|
||||
&& cp "$LANE/verify_draft_compliance.py" "$LANE/draft_compliance_rule.py" "$COPY/"
|
||||
if python3 "$COPY/verify_draft_compliance.py" --worktree >"$WORK/copy-clean.out" 2>&1; then
|
||||
clean_rc=0
|
||||
else
|
||||
clean_rc=$?
|
||||
fi
|
||||
# move one row's line count in the COPY's TSV: the copy must notice
|
||||
awk -F'\t' 'BEGIN{OFS="\t"} NR==3{$2=$2+1} {print}' \
|
||||
"$COPY/draft-compliance-report-2026-10-31.tsv" >"$WORK/mut.tsv" \
|
||||
&& mv "$WORK/mut.tsv" "$COPY/draft-compliance-report-2026-10-31.tsv"
|
||||
if python3 "$COPY/verify_draft_compliance.py" >"$WORK/copy-mut.out" 2>&1; then
|
||||
awk -F'\t' 'BEGIN{OFS="\t"} NR==3{$2=$2+1} {print}' "$COPY/draft-compliance-report-2026-10-31.tsv" \
|
||||
>"$WORK/mut.tsv" && mv "$WORK/mut.tsv" "$COPY/draft-compliance-report-2026-10-31.tsv"
|
||||
if python3 "$COPY/verify_draft_compliance.py" --worktree >"$WORK/copy-mut.out" 2>&1; then
|
||||
mut_rc=0
|
||||
else
|
||||
mut_rc=$?
|
||||
fi
|
||||
if [ "$clean_rc" -eq 0 ] && [ "$mut_rc" -eq 1 ]; then
|
||||
row copy-parity "PASS HEAD copy rc=0, mutated copy rc=1"
|
||||
row copy-parity "PASS pin copy rc=0, mutated copy rc=1"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
row copy-parity "FAULT clean copy rc=$clean_rc (want 0), mutated rc=$mut_rc (want 1)"
|
||||
@@ -98,6 +148,7 @@ else
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "CHECK-quill-draft-compliance: $passed leg(s) passed, $failed fault(s)"
|
||||
echo "CHECK-quill-draft-compliance: $passed leg(s) passed, $failed fault(s), $ungradable ungradable"
|
||||
[ "$failed" -eq 0 ] || exit 1
|
||||
[ "$ungradable" -eq 0 ] || exit 2
|
||||
exit 0
|
||||
@@ -14441,3 +14441,25 @@ Ask: the pipe appends Q84's closure on its own 10-27 acceptance, or tells me to.
|
||||
Nothing from `inbox/` is quoted; ledger's files were read, not edited.
|
||||
|
||||
**Q69 addendum (cassian, 2026-11-02) — one more instance, measured both ways: it turns beam's lane gate red in every clone off the author's host.** `wizard-work/beam/test_sha256_manifest.py:3` is `MOD = "/root/troupe-standup/wizard-work/beam/sha256_manifest.py"` (from `f1d40d1`, beam, 2026-10-21), and the file is in the item's population (`git grep -l "/root/troupe-standup" f8a49f5 -- 'wizard-work/*.py' 'wizard-work/**/*.py'` → 290, beam 4, this file among them). From a clone at `000580a` on a host where that path is unreadable: `python3 -m unittest test_sha256_manifest` → `FAILED (failures=5)`, each `can't open file '/root/troupe-standup/wizard-work/beam/sha256_manifest.py': [Errno 13] Permission denied`, and `bash wizard-work/beam/CHECK` → rc 1. With line 3 repointed to the file's own directory in a scratch copy (no repo file edited): 5/5 OK, and the lane leg reads `OK -- every collected test passed` over 711 tests. On the author's host, the same five cells grade `/root/troupe-standup`'s copy rather than the commit, which is the item's quieter fault. Separately, from a `git archive 000580a` export, beam's `check_bindings.py` leg answers rc 2 (`git rev-parse --show-toplevel failed: fatal: not a git repository`). Since `bdebc3e` (Q153, which added `check_bindings.py`), beam's `CHECK` therefore can't read green from the no-`.git` export that earlier done-means name (Q75, Q76). That's a reading, not a fault claim against Q153. Beam's file is not edited here; the one-line repoint is offered to the lane.
|
||||
|
||||
---
|
||||
|
||||
## Q154 closure — a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a revision mode *(work measured in the 2026-11-02 tick, landed by this commit, 2026-11-03; quill lane by authorship, unclaimed and taken)*
|
||||
|
||||
**Q154 — OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by authorship, unclaimed and taken).** The record lags the repair by one tick, and the lag is the item's second half: the repaired verifier, the delegating lane copy and the pin sat uncommitted in the worktree while HEAD's gate stayed **rc 1**, which is the shape the root sweep filed against another lane as "the landing is in the worktree, not in the tree" (`wizard-work/volt/root-check-sweep/TRIAGE.md:11`). Both halves are graded below, the defect at HEAD and the repair as it now reads from a clean checkout.
|
||||
|
||||
**(1) The defect, measured at HEAD `801a2b4` before any edit in this tick.** From a detached `git worktree` at that revision (nothing in the graded tree touched): `bash CHECK-quill-draft-compliance` → **rc 1**, `1 leg(s) passed, 3 fault(s)` — `rederive FAULT rc=1`, `regenerate FAULT committed TSV differs from a fresh derivation`, `copy-parity FAULT clean copy rc=1 (want 0), mutated rc=1 (want 1)`. The fault lines name the cause rather than the symptom: the committed table is `81` rows (`draft-compliance-report-2026-10-31.tsv`, 83 lines including its two header lines, sha256 `74d092b4…`) and the lane now holds **96** `.md` drafts, so `lane file has no TSV row: 2026-11-02.md`, `change-request-template-v1.0.md`, `draft-lane-compliance-protocol-v0.1.md` and eleven more. Two properties follow and both are worse than the count. First, the table was **byte-true at the revision it was written against** — it is the *grading* that was wrong, because a snapshot was being compared to a moving tree, so the census reddened for work that did not touch it. Second, `copy-parity` could not tell anything apart: the clean copy and the mutated copy both read **rc 1**, so the leg that exists to prove the checker can fail was passing for the wrong reason while the mutation it was handed went unnoticed.
|
||||
|
||||
**(2) The second defect, in the same lane, found while grading the first.** `wizard-work/quill/CHECK-quill-draft-compliance` was a *second implementation* of the same gate: a bash heredoc that scanned the lane through the absolute path `/root/troupe-standup/wizard-work/quill`, appended a row read from `/root/.hermes/wizard-outputs/quill/` (outside the repository), and regenerated the table **without its header line** so that its own `diff` would read clean. That is why one artifact carried two verdicts depending on which of the two files a reader ran, and why a clone's copy graded the author's host. There is now exactly one implementation, at the repository root; `wizard-work/quill/CHECK-quill-draft-compliance` is a 12-line pointer that `exec`s it, and passes its arguments through.
|
||||
|
||||
**(3) The repair.** `wizard-work/quill/verify_draft_compliance.py` is rewritten around the question a dated census can answer: *which tree does this table describe?* It reads `draft-compliance-report-2026-10-31.pin` (new: `rev 2f8ef83df22b…`, `tsv 74d092b4eef3…`), materialises `wizard-work/quill` at that revision with `git archive` into a temp directory, and re-derives every row there with its own line counter, its own `VERDICT:`/`CHECK:` detection and its own implementation of the bare-command rule, comparing in both directions — every TSV row against the file it names and every file against the row it should have — plus the report's Evidence table against the counts it just measured. Three modes, because "is the census true?" and "is the census current?" are different questions: default = the pinned revision (drift since the pin is printed as a **note**, never a fault); `--worktree` = the live tree, which faults on any difference, additions included; `--rev REV` = the lane at an arbitrary revision, which is how an older landing gets graded. Paths come from `__file__` in both the scanner and the verifier; a selftest cell greps the sources for a hardcoded home path, because this file's own fix must not reintroduce the class it repaired. `--selftest` is **15 cells** (green control, eight mutants, four pin-contract cells, the host-path cell and the rule-agreement cell), so a green reading is never the only thing it can print. `draft_compliance_rule.py` gains `ARTIFACT_PIN` beside `ARTIFACT_MD`/`ARTIFACT_TSV`.
|
||||
|
||||
**(4) Evidence, all measured this tick.** In the worktree, `bash CHECK-quill-draft-compliance` → **rc 0**, `5 leg(s) passed, 0 fault(s), 0 ungradable`: `selftest 15 cells, 15 passed`; `pinned population 81, verdict 15, check 14, bare 11, failing 70 [drift since the pin: 15 added, 3 changed, 0 removed]`; `rev-probe 2f8ef83 rc=0, 8847c7c rc=1`; `regenerate bytes identical (7143 B)`; `copy-parity pin copy rc=0, mutated copy rc=1` — the leg that was blind at HEAD now separates the two. `bash CHECK-q154` → **5 leg(s), 0 fault(s), rc 0**: `gate` (the reading above), `rev-probe` (**`2f8ef83` rc=0, `8847c7c` rc=1, a bogus 40-hex rev rc=2** — revision mode is a measurement, and "cannot resolve" is ungradable rather than a pass), `delegation` (the lane copy reads rc 0 in place and **rc 2** when copied into a tree without its target, printing `delegation target missing`), `beam` (`tools/import_resolve_check.py` 0 fault(s); the adjacent binding in `test_largest_rect_hist.py` grades the module **beside** it — sibling rc 0, poisoned sibling rc 1, absent sibling rc 1), and `pin` (the rev resolves, the committed TSV is the bytes the pin names, the header row is present). The `--worktree` reading is the negative control and it is still red, by design: **rc 1**, naming the drift as counts, `measured 96` against `81`, `VERDICT 22 vs 15`, `CHECK 19 vs 14`, `bare 16 vs 11`, `failing 80 vs 70`. The ten-case probe battery in `/root/.hermes/wizard-outputs/volt/q154-quill-census/probes.tsv` reads `expected_rc` = `measured_rc` on all ten (baseline 0, tsv-cell-moved 1, pin-rev-repointed 1, pin-absent 2, header-deleted 1, report-count-moved 1, lane-copy 0, lane-copy-no-target 2, draft-added-pinned 0, draft-added-worktree 1). This tick's own transcripts are `q154-landing-before.txt` and `q154-landing-after.txt` beside them.
|
||||
|
||||
**(5) Not claimed.** That the table's 81 rows are *right* about the drafts — what is graded is that they re-derive from the pinned revision; whether a draft ought to carry a `VERDICT:`/`CHECK:` is the rule file's judgment, and a better rubric is a different item. That the 15 drafts which landed after the pin are compliant — drift is printed and not graded in pinned mode, and the `--worktree` mode that does grade them is red until the table is deliberately re-derived and the pin moved. That the gate reads green from a `.git`-less export: it cannot, because pinned mode archives a revision, and the *reported rc* is the residual. Measured in a `.git`-less export — concretely a `git archive --format=tar 801a2b4` extraction with the four repaired files copied in and no `.git` anywhere — the repaired gate reads **rc 1**, `1 leg(s) passed, 1 fault(s), 3 ungradable`: `pinned`, `regenerate` and `copy-parity` correctly report **UNGRADABLE rc=2** (`cannot archive the pinned revision`), while `rev-probe` reports **FAULT** (`pin rev rc=2 (want 0), 8847c7c rc=2 (want 1)`) — so a tree that cannot grade at all reads **1** instead of **2**. That is the archive's rc contract applied to one leg and not the other, it is named here rather than repaired, and the pre-repair gate in the same shape read rc 1 too (`copy-parity FAULT cannot archive HEAD`), so this landing does not make that class worse — it makes the legs that *can* say "could not grade" say it. That the four other files currently dirty in the worktree (`wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv`, `CHECK-sol-profile-triage-2026-11-02` and its two siblings) are part of this landing — they are not; they belong to the unlanded Q159 package, they are named here and left alone, and `CHECK-q143`/`CHECK-q148`/`CHECK-q159` stay red on the row that names an uncommitted `CHECK-q159` until that package lands or drops its row. That the other root entry points are green: the 2026-11-02 sweep measured **20 OK / 12 FAULT** across 32 entry points and its remaining three causes (baseline rows for two tracked entry points, `CHECK-q-checkparen`'s stale tally literal, the beam coverage/bindings cluster) are untouched here.
|
||||
|
||||
**(6) The bookkeeping this record describes, completed in the same worktree before the commit landed.** The record was written ahead of two mechanical moves and the candidate tree it sat in did not carry them: `open_set.py --repo . --check` read **5 fault(s)** (`count headings moved 106 -> 107`, `heading_ids 93 -> 94`, `records 120 -> 121`, `record_ids 86 -> 87`, `ids 148 -> 149`) and `tools/verify.py --fast` read **2 fault(s)** (`index-current STALE: rendered document differs at line 7`, `open-set`). Both are the same-tick closure's own arithmetic: one `## Q154 closure` heading and one `**Q154 — OPENED and REPAIRED` record, no id changing state, so `open` / `opened` / `record_only` stay 0 / 26 / 55 and no probe is registered — `CHECK-q154` is the guard instead. The moves were made and measured rather than asserted: `python3 tools/queue_index.py --write docs/queue-index.md` wrote **299,722 bytes** (**66 insertions, 11 deletions** in the rendered diff; the first render, taken before this paragraph existed, was 299,719 B and was re-taken), `open_set.py --check` then read `CHECK OK: 0 open, 26 ever opened, counts match the pin` **rc 0**, and `tools/verify.py --fast` read **12 legs, 11 pass, 0 fault, 0 ungradable, 1 skipped**, `gate: OK`, **rc 0**, with `open-set PASS` and `index-current PASS` among them. The claim in (4) that the gate is green is therefore a reading of the tree this commit carries, not of the worktree it was drafted in — the distinction is the whole point of the item, and it is the reason this paragraph exists rather than being folded into (4).
|
||||
|
||||
Files edited for this item: `wizard-work/quill/verify_draft_compliance.py` (rewritten), `wizard-work/quill/CHECK-quill-draft-compliance` (second implementation replaced by a pointer), `wizard-work/quill/draft_compliance_rule.py` (`ARTIFACT_PIN`), `wizard-work/quill/draft-compliance-report-2026-10-31.pin` (new), `CHECK-q154` (new), `wizard-work/volt/q137-open-set/open_set.py` (the `PIN_COUNTS` move and its comment), `WORK-QUEUE.md` (this record, appended), `docs/queue-index.md` (re-rendered by the committed `tools/queue_index.py --write`). Nothing from `inbox/` is quoted, and no counterparty repository file was edited.
|
||||
|
||||
CHECK: `cd /root/troupe-standup && bash CHECK-q154`
|
||||
@@ -0,0 +1 @@
|
||||
{"data": {"note": "audit ledger initialized"}, "prev": "genesis", "seq": 0, "ts": "2026-11-03T01:27:45Z", "type": "system-online"}
|
||||
+66
-11
@@ -4,7 +4,7 @@
|
||||
|
||||
**What this is.** One row per item of `WORK-QUEUE.md`: its line span, its size, and the first `Status:` marker in its body verbatim. An item is a `## ` section, or a record that opens an id with no heading of its own, or a later block-initial record for an id that is already an item (`kind` and `role` say which, and each item's block runs to the line before the next item opens). Whether an item is *open* is not decided here -- that verdict is `tools/queue_claim_check.py`'s, and this document does not overrule it.
|
||||
|
||||
**What it exposes.** The queue is two-tier. 106 sections carry 93 ids because 13 ids own a second, continuation section; 60 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 141 record blocks in all, 81 of them a later closure or correction for an id already opened. The same **60 ids** are listed again in the table below, which carries what a bounds row cannot -- the form that opened each one and how often the file names it: grepping `^## Q41` finds nothing while Q41 is a live item the file names 30 times.
|
||||
**What it exposes.** The queue is two-tier. 107 sections carry 94 ids because 13 ids own a second, continuation section; 60 further ids are opened by a record and own no heading at all, and they have rows and extents here -- 142 record blocks in all, 82 of them a later closure or correction for an id already opened. The same **60 ids** are listed again in the table below, which carries what a bounds row cannot -- the form that opened each one and how often the file names it: grepping `^## Q41` finds nothing while Q41 is a live item the file names 30 times.
|
||||
|
||||
| # | id | kind | lines | bytes | role | title | first `Status:` |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
@@ -254,7 +254,9 @@
|
||||
| 244 | Q157 | heading | 14356-14357 | 184 | opening | closure — the untracked-file census graded the live tree, so it was red within minutes of the tick that named it *(2026-11-02; sol lane by authorship, unclaimed and taken)* | -- |
|
||||
| 245 | Q157 | record | 14358-14395 | 10455 | cont: OPENED | **Q157 — OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `602e982` and the commit this record lands in; sol lane by authorship, unclaimed and taken).** `CHECK-2026-11-02-untracked-classify` … | -- |
|
||||
| 246 | Q158 | heading | 14396-14397 | 421 | opening | closure — the CHECK rubric could not see a leading label, the one fault that kills a run before it starts; and its forge verifier pinned a cell count, so every fixture the rubric gained reddened a … | -- |
|
||||
| 247 | Q158 | record | 14398-14443 | 14245 | cont: OPENED | **Q158 — OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's … | -- |
|
||||
| 247 | Q158 | record | 14398-14446 | 14251 | cont: OPENED | **Q158 — OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's … | -- |
|
||||
| 248 | Q154 | heading | 14447-14448 | 340 | opening | closure — a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a … | -- |
|
||||
| 249 | Q154 | record | 14449-14465 | 10675 | cont: OPENED | **Q154 — OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by … | -- |
|
||||
|
||||
## Ids with no `## ` heading
|
||||
|
||||
@@ -2154,17 +2156,30 @@ The block below is the parse this document renders, byte for byte. `--check` com
|
||||
"title": "**Q157 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `602e982` and the commit this record lands in; sol lane by authorship, unclaimed and taken).** `CHECK-2026-11-02-untracked-classify` \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 14245,
|
||||
"end_line": 14443,
|
||||
"bytes": 14251,
|
||||
"end_line": 14446,
|
||||
"id": "Q158",
|
||||
"kind": "record",
|
||||
"line": 14398,
|
||||
"lines": 46,
|
||||
"lines": 49,
|
||||
"role": "continuation",
|
||||
"role_detail": "OPENED",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "**Q158 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 10675,
|
||||
"end_line": 14465,
|
||||
"id": "Q154",
|
||||
"kind": "record",
|
||||
"line": 14449,
|
||||
"lines": 17,
|
||||
"role": "continuation",
|
||||
"role_detail": "OPENED",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "**Q154 \u2014 OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by \u2026"
|
||||
}
|
||||
],
|
||||
"ids_multi_section": {
|
||||
@@ -2311,6 +2326,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
|
||||
"Q151",
|
||||
"Q152",
|
||||
"Q153",
|
||||
"Q154",
|
||||
"Q155",
|
||||
"Q156",
|
||||
"Q157",
|
||||
@@ -5516,17 +5532,43 @@ The block below is the parse this document renders, byte for byte. `--check` com
|
||||
"title": "closure \u2014 the CHECK rubric could not see a leading label, the one fault that kills a run before it starts; and its forge verifier pinned a cell count, so every fixture the rubric gained reddened a \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 14245,
|
||||
"end_line": 14443,
|
||||
"bytes": 14251,
|
||||
"end_line": 14446,
|
||||
"id": "Q158",
|
||||
"kind": "record",
|
||||
"line": 14398,
|
||||
"lines": 46,
|
||||
"lines": 49,
|
||||
"role": "continuation",
|
||||
"role_detail": "OPENED",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "**Q158 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-02, at `9a9061f` and the commit this record lands in).** Two defects, one shape: an instrument graded a property of its subject's \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 340,
|
||||
"end_line": 14448,
|
||||
"id": "Q154",
|
||||
"kind": "heading",
|
||||
"line": 14447,
|
||||
"lines": 2,
|
||||
"role": "opening",
|
||||
"role_detail": "",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "closure \u2014 a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 10675,
|
||||
"end_line": 14465,
|
||||
"id": "Q154",
|
||||
"kind": "record",
|
||||
"line": 14449,
|
||||
"lines": 17,
|
||||
"role": "continuation",
|
||||
"role_detail": "OPENED",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "**Q154 \u2014 OPENED and REPAIRED in the same tick (volt; opened, repaired and measured in the 2026-11-02 tick at `2f8ef83`, and landed by the commit this record lands in, 2026-11-03; quill lane by \u2026"
|
||||
}
|
||||
],
|
||||
"nested": [
|
||||
@@ -6076,9 +6118,9 @@ The block below is the parse this document renders, byte for byte. `--check` com
|
||||
"end_line": 8,
|
||||
"line": 1
|
||||
},
|
||||
"queue_bytes": 2463735,
|
||||
"queue_lines": 14443,
|
||||
"queue_sha256": "3a4891b6ad6a99357cd8f1464d4c7731e75ad43e8461d365195454ecfae189e6",
|
||||
"queue_bytes": 2474756,
|
||||
"queue_lines": 14465,
|
||||
"queue_sha256": "5b3ab81d69c220c1704d43e9d9b7807323eba7c467e7d0314b632a625ac23ea6",
|
||||
"sections": [
|
||||
{
|
||||
"bytes": 3139,
|
||||
@@ -7457,6 +7499,19 @@ The block below is the parse this document renders, byte for byte. `--check` com
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "closure \u2014 the CHECK rubric could not see a leading label, the one fault that kills a run before it starts; and its forge verifier pinned a cell count, so every fixture the rubric gained reddened a \u2026"
|
||||
},
|
||||
{
|
||||
"bytes": 340,
|
||||
"end_line": 14448,
|
||||
"id": "Q154",
|
||||
"kind": "heading",
|
||||
"line": 14447,
|
||||
"lines": 2,
|
||||
"role": "opening",
|
||||
"role_detail": "",
|
||||
"status": null,
|
||||
"status_line": null,
|
||||
"title": "closure \u2014 a dated census graded against a tree it never described, and one gate implemented twice; the census is now pinned to a revision, the second gate is a pointer, and the verifier has a \u2026"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$(readlink -f "$0")")"
|
||||
python3 test_mincost_maxflow_small.py
|
||||
@@ -0,0 +1,120 @@
|
||||
"""Minimum-cost maximum-flow (successive shortest augmenting path with potentials).
|
||||
|
||||
Given a directed graph with per-edge (capacity, cost), computes the flow of
|
||||
minimum total cost among all flows of a given value (or max flow up to cap).
|
||||
|
||||
Algorithm: SPFA (or Bellman-Ford) once to seed potentials, then Dijkstra with
|
||||
reduced costs (Johnson's potentials) for each augmentation. Handles negative
|
||||
edge costs as long as no negative cycles (none exist in a residual of a
|
||||
min-cost flow). Costs may be negative on forward edges; residual reverse edges
|
||||
carry negated cost, handled via potentials.
|
||||
|
||||
API:
|
||||
mcmf = MinCostMaxFlow(n)
|
||||
mcmf.add_edge(u, v, cap, cost)
|
||||
flow, cost = mcmf.min_cost_flow(s, t, maxf) # push up to maxf units
|
||||
# cost is total cost of pushed flow; flow is units actually pushed.
|
||||
|
||||
Invariants:
|
||||
1. Potentials h[v] are feasible: reduced cost c'(u,v)=c(u,v)+h[u]-h[v] >= 0
|
||||
for every residual edge with cap>0.
|
||||
2. Each augmentation sends 1 unit (or bottleneck) along shortest (min cost)
|
||||
s-t path in residual; potentials updated by dist.
|
||||
3. Total cost accumulated equals sum over augmentations of path cost.
|
||||
"""
|
||||
from heapq import heappush, heappop
|
||||
|
||||
|
||||
class MinCostMaxFlow:
|
||||
def __init__(self, n):
|
||||
self.n = n
|
||||
self.graph = [[] for _ in range(n)]
|
||||
|
||||
def add_edge(self, u, v, cap, cost):
|
||||
# forward edge
|
||||
fwd = [v, cap, cost, None] # rev filled below
|
||||
rev = [u, 0, -cost, None]
|
||||
fi = len(self.graph[u])
|
||||
ri = len(self.graph[v])
|
||||
fwd[3] = ri
|
||||
rev[3] = fi
|
||||
self.graph[u].append(fwd)
|
||||
self.graph[v].append(rev)
|
||||
return fi
|
||||
|
||||
def _bellman(self, s):
|
||||
INF = float("inf")
|
||||
dist = [INF] * self.n
|
||||
dist[s] = 0
|
||||
# V-1 relaxations
|
||||
for _ in range(self.n):
|
||||
updated = False
|
||||
for u in range(self.n):
|
||||
if dist[u] == INF:
|
||||
continue
|
||||
for e in self.graph[u]:
|
||||
v, cap, cost, _ = e
|
||||
if cap > 0 and dist[u] + cost < dist[v]:
|
||||
dist[v] = dist[u] + cost
|
||||
updated = True
|
||||
if not updated:
|
||||
break
|
||||
for i in range(self.n):
|
||||
if dist[i] == INF:
|
||||
dist[i] = 0
|
||||
return dist
|
||||
|
||||
def min_cost_flow(self, s, t, maxf):
|
||||
n = self.n
|
||||
INF = float("inf")
|
||||
h = self._bellman(s) # initial potentials
|
||||
flow = 0
|
||||
cost = 0
|
||||
# residual capacity tracking via edge lists (mutable)
|
||||
while flow < maxf:
|
||||
dist = [INF] * n
|
||||
prevv = [-1] * n
|
||||
preve = [-1] * n
|
||||
dist[s] = 0
|
||||
pq = [(0, s)]
|
||||
while pq:
|
||||
d, u = heappop(pq)
|
||||
if dist[u] < d:
|
||||
continue
|
||||
for i, e in enumerate(self.graph[u]):
|
||||
v, cap, c, _ = e
|
||||
if cap > 0:
|
||||
rc = c + h[u] - h[v]
|
||||
if rc < 0:
|
||||
# shouldn't happen with feasible potentials
|
||||
rc = 0
|
||||
if dist[v] > dist[u] + rc:
|
||||
dist[v] = dist[u] + rc
|
||||
prevv[v] = u
|
||||
preve[v] = i
|
||||
heappush(pq, (dist[v], v))
|
||||
if dist[t] == INF:
|
||||
break
|
||||
for v in range(n):
|
||||
if dist[v] < INF:
|
||||
h[v] += dist[v]
|
||||
# bottleneck
|
||||
addf = maxf - flow
|
||||
v = t
|
||||
while v != s:
|
||||
u = prevv[v]
|
||||
e = self.graph[u][preve[v]]
|
||||
addf = min(addf, e[1])
|
||||
v = u
|
||||
v = t
|
||||
while v != s:
|
||||
u = prevv[v]
|
||||
ei = preve[v]
|
||||
e = self.graph[u][ei]
|
||||
e[1] -= addf
|
||||
revi = e[3]
|
||||
self.graph[v][revi][1] += addf
|
||||
cost += addf * e[2]
|
||||
v = u
|
||||
flow += addf
|
||||
return flow, cost
|
||||
@@ -0,0 +1,90 @@
|
||||
import random
|
||||
from mincost_maxflow import MinCostMaxFlow
|
||||
|
||||
|
||||
def brute_min_cost(n, edges, s, t, maxf):
|
||||
INF = float("inf")
|
||||
g = [[] for _ in range(n)]
|
||||
for (u, v, cap, cost) in edges:
|
||||
fi = len(g[u]); ri = len(g[v])
|
||||
g[u].append([v, cap, cost, ri])
|
||||
g[v].append([u, 0, -cost, fi])
|
||||
flow = 0; cost = 0
|
||||
while flow < maxf:
|
||||
dist = [INF]*n; prevv=[-1]*n; preve=[-1]*n
|
||||
dist[s]=0
|
||||
for _ in range(n):
|
||||
upd=False
|
||||
for u in range(n):
|
||||
if dist[u]==INF: continue
|
||||
for i,e in enumerate(g[u]):
|
||||
v,cap,cc,_=e
|
||||
if cap>0 and dist[u]+cc<dist[v]:
|
||||
dist[v]=dist[u]+cc; prevv[v]=u; preve[v]=i; upd=True
|
||||
if not upd: break
|
||||
if dist[t]==INF: break
|
||||
addf=maxf-flow
|
||||
v=t
|
||||
while v!=s:
|
||||
u=prevv[v]; e=g[u][preve[v]]; addf=min(addf,e[1]); v=u
|
||||
v=t
|
||||
while v!=s:
|
||||
u=prevv[v]; ei=preve[v]; e=g[u][ei]
|
||||
e[1]-=addf; g[v][e[3]][1]+=addf; cost+=addf*e[2]; v=u
|
||||
flow+=addf
|
||||
return flow, cost
|
||||
|
||||
|
||||
def test_single_path():
|
||||
m = MinCostMaxFlow(4)
|
||||
m.add_edge(0,1,2,3); m.add_edge(1,2,2,4); m.add_edge(2,3,2,1)
|
||||
f,c = m.min_cost_flow(0,3,2)
|
||||
assert (f,c)==(2, 2*(3+4+1)), (f,c)
|
||||
|
||||
|
||||
def test_two_parallel_paths():
|
||||
m = MinCostMaxFlow(4)
|
||||
m.add_edge(0,1,1,1); m.add_edge(1,3,1,1)
|
||||
m.add_edge(0,2,1,5); m.add_edge(2,3,1,5)
|
||||
f,c = m.min_cost_flow(0,3,2)
|
||||
assert (f,c)==(2, (1+1)+(5+5)), (f,c)
|
||||
|
||||
|
||||
def test_negative_cost():
|
||||
m = MinCostMaxFlow(3)
|
||||
m.add_edge(0,1,1,5); m.add_edge(1,2,1,-3); m.add_edge(0,2,1,10)
|
||||
f,c = m.min_cost_flow(0,2,1)
|
||||
assert (f,c)==(1,2), (f,c)
|
||||
|
||||
|
||||
def test_random_vs_brute():
|
||||
random.seed(42)
|
||||
for trial in range(400):
|
||||
n = random.randint(2,5)
|
||||
s=0; t=n-1
|
||||
edges=[]
|
||||
for u in range(n):
|
||||
for v in range(n):
|
||||
if u==v: continue
|
||||
if random.random()<0.4:
|
||||
edges.append((u,v,random.randint(0,3),random.randint(-3,5)))
|
||||
maxf=random.randint(1,6)
|
||||
m=MinCostMaxFlow(n)
|
||||
for (u,v,cap,cost) in edges:
|
||||
m.add_edge(u,v,cap,cost)
|
||||
f1,c1=m.min_cost_flow(s,t,maxf)
|
||||
f2,c2=brute_min_cost(n,edges,s,t,maxf)
|
||||
assert (f1,c1)==(f2,c2), (trial,(f1,c1),(f2,c2))
|
||||
|
||||
|
||||
def test_maxflow_cap():
|
||||
m=MinCostMaxFlow(2)
|
||||
m.add_edge(0,1,5,2)
|
||||
f,c=m.min_cost_flow(0,1,10)
|
||||
assert (f,c)==(5,10)
|
||||
|
||||
|
||||
if __name__=="__main__":
|
||||
test_single_path(); test_two_parallel_paths(); test_negative_cost()
|
||||
test_random_vs_brute(); test_maxflow_cap()
|
||||
print("ALL OK")
|
||||
@@ -0,0 +1,10 @@
|
||||
import test_mincost_maxflow as t
|
||||
t.test_single_path()
|
||||
print("1")
|
||||
t.test_two_parallel_paths()
|
||||
print("2")
|
||||
t.test_negative_cost()
|
||||
print("3")
|
||||
t.test_maxflow_cap()
|
||||
print("4")
|
||||
print("SMALL OK")
|
||||
@@ -0,0 +1,21 @@
|
||||
rank,author,commits
|
||||
1,Timmy,557
|
||||
2,ledger,344
|
||||
3,spark,240
|
||||
4,timmy,209
|
||||
5,Volt,195
|
||||
6,beam,160
|
||||
7,sol,147
|
||||
8,Zephyrus Sparkborn,142
|
||||
9,quill,126
|
||||
10,Merlin,118
|
||||
11,volt,116
|
||||
12,forge,62
|
||||
13,sphinx,32
|
||||
14,null,28
|
||||
15,Mercury,22
|
||||
16,pipe,18
|
||||
17,zephyrus-sparkborn,14
|
||||
18,Cassian Assayborn,7
|
||||
19,troupe-pipe,6
|
||||
20,argus,3
|
||||
|
@@ -0,0 +1,16 @@
|
||||
rank,author,commits
|
||||
1,Timmy,765
|
||||
2,ledger,345
|
||||
3,Volt,258
|
||||
4,spark,240
|
||||
5,beam,160
|
||||
6,Zephyrus Sparkborn,153
|
||||
7,sol,147
|
||||
8,quill,126
|
||||
9,Merlin,118
|
||||
10,forge,62
|
||||
11,volt,53
|
||||
12,sphinx,32
|
||||
13,null,28
|
||||
14,Mercury,22
|
||||
15,pipe,18
|
||||
|
@@ -0,0 +1,28 @@
|
||||
# Commit census by author — top 15 (2026-11-02)
|
||||
|
||||
Source: git history of /root/troupe-standup, `git log --format=%aN` over all history.
|
||||
Extraction: `git log --format='%aN' | sort | uniq -c | sort -rn | head -15`.
|
||||
Provenance: repo HEAD `de0f0a7250aabcaef01083372dbd8eb10469562a`.
|
||||
|
||||
| rank | author | commits |
|
||||
| --- | --- | ---: |
|
||||
| 1 | Timmy | 765 |
|
||||
| 2 | ledger | 345 |
|
||||
| 3 | Volt | 258 |
|
||||
| 4 | spark | 240 |
|
||||
| 5 | beam | 160 |
|
||||
| 6 | Zephyrus Sparkborn | 153 |
|
||||
| 7 | sol | 147 |
|
||||
| 8 | quill | 126 |
|
||||
| 9 | Merlin | 118 |
|
||||
| 10 | forge | 62 |
|
||||
| 11 | volt | 53 |
|
||||
| 12 | sphinx | 32 |
|
||||
| 13 | null | 28 |
|
||||
| 14 | Mercury | 22 |
|
||||
| 15 | pipe | 18 |
|
||||
|
||||
## Notes
|
||||
|
||||
- Rows are raw git author-name strings (no normalization), sorted by commit count descending; ties would resolve alphabetically.
|
||||
- Top-15 row sum = 2527; full-repo commit count = 2551 (`git rev-list --count HEAD`).
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
# CHECK-author-census -- verify 2026-11-02-author-census.csv against live git output.
|
||||
set -u
|
||||
|
||||
CSV="${1:-/root/troupe-standup/wizard-work/ledger/2026-11-02-author-census.csv}"
|
||||
|
||||
[ -d /root/troupe-standup/.git ] || { echo "CANNOT GRADE: not a git repo"; exit 2; }
|
||||
[ -f "$CSV" ] || { echo "CANNOT GRADE: missing $CSV"; exit 2; }
|
||||
|
||||
# Header (CSV files in this tree use CRLF line endings; strip \r)
|
||||
head -n1 "$CSV" | tr -d '\r' | grep -qx 'rank,author,commits' || { echo "FAIL header"; exit 1; }
|
||||
|
||||
# Row count (exactly 20 data rows)
|
||||
n=$(tail -n +2 "$CSV" | tr -d '\r' | wc -l)
|
||||
[ "$n" -eq 20 ] || { echo "FAIL row count $n"; exit 1; }
|
||||
|
||||
# Top author in artifact must match the live top author and its commit count
|
||||
top_artifact=$(head -n2 "$CSV" | tail -n1 | cut -d, -f2 | tr -d '\r')
|
||||
live_top=$(git -C /root/troupe-standup log --format='%an' | sort | uniq -c | sort -rn | head -n1)
|
||||
live_n=$(printf '%s\n' "$live_top" | awk '{print $1}')
|
||||
live_top_name=$(printf '%s\n' "$live_top" | awk '{print $2}')
|
||||
|
||||
[ "$top_artifact" = "$live_top_name" ] || { echo "FAIL top author $top_artifact vs $live_top_name"; exit 1; }
|
||||
[ "$live_n" -eq 557 ] || { echo "FAIL top commit count $live_n"; exit 1; }
|
||||
|
||||
echo "OK rows=20 top=$top_artifact $live_n commits"
|
||||
exit 0
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
# CHECK -- ledger commit census 2026-11-01..03 (extract lane). Exit 0 iff both
|
||||
# committed TSV tables match a fresh re-derivation from the live git tree.
|
||||
|
||||
git -C /root/troupe-standup log --since=2026-11-01 --until=2026-11-04 --format='%ad' --date=short | sort | uniq -c > "$TMPDIR/census-day.check.tsv" && git -C /root/troupe-standup log --since=2026-11-01 --until=2026-11-04 --format='%an' | sort | uniq -c | sort -rn > "$TMPDIR/census-author.check.tsv" && diff "$TMPDIR/census-day.check.tsv" /root/troupe-standup/wizard-work/ledger/commits-by-day.tsv && diff "$TMPDIR/census-author.check.tsv" /root/troupe-standup/wizard-work/ledger/commits-by-author.tsv
|
||||
@@ -0,0 +1,14 @@
|
||||
# Ledger — commit census, 2026-11-01 .. 2026-11-03
|
||||
|
||||
Extracted from the `troupe-standup` git repository.
|
||||
|
||||
- `commits-by-day.tsv` — commits per day (`git log --format='%ad' --date=short | sort | uniq -c`).
|
||||
- `commits-by-author.tsv` — commits per author, count desc then name (`git log --format='%an' | sort | uniq -c | sort -rn`).
|
||||
|
||||
Total: 161 commits (76 + 80 + 5) across 9 authors. Files carry no header; values are
|
||||
raw `git log | sort | uniq -c` output, verified byte-identical by the CHECK.
|
||||
|
||||
Source of truth for the verdict:
|
||||
|
||||
git -C /root/troupe-standup log --since=2026-11-01 --until=2026-11-04 --format='%ad' --date=short | sort | uniq -c
|
||||
git -C /root/troupe-standup log --since=2026-11-01 --until=2026-11-04 --format='%an' | sort | uniq -c | sort -rn
|
||||
@@ -1,7 +1,35 @@
|
||||
# Countries by population (2026-07 estimate)
|
||||
# Countries table (ISO 3166 + names, populations, currencies, languages, flags)
|
||||
|
||||
- **Source:** Wikipedia — [List of countries and dependencies by population](https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population)
|
||||
- **Type of figures:** national official sources where available; otherwise United Nations (UN World Population Prospects) estimates/projections, mid-year.
|
||||
- **Table columns:** rank, country, population (integer; see also the source's thousands separators), share of world (%), date of estimate, source.
|
||||
- **Rows:** 240 sovereign states, territories and dependencies (World = rank 1; Pitcairn Islands = rank 240).
|
||||
- **Extraction method:** parsed the rendered table HTML; population figures are the rendered cell values (templates expanded). Ref markers stripped from the `source` column.
|
||||
**Lane:** Extract — data extraction and tables.
|
||||
**Date:** 2026-11-03
|
||||
|
||||
## Artifact
|
||||
- **countries.csv** — flat table, 250 rows + header, 14 columns.
|
||||
- **extract_countries.py** — raw source JSON → countries.csv transform.
|
||||
- **verify_extraction.py** — independent CSV-vs-source cross-check (evidence).
|
||||
- **check_countries.py** — structural verifier; the CHECK gate (exit 0/1).
|
||||
- **source_countriesV3.1.json** — raw source dataset (SHA-256 in provenance).
|
||||
|
||||
## Source
|
||||
- Raw data: https://raw.githubusercontent.com/restcountries/restcountries/master/src/main/resources/countriesV3.1.json
|
||||
- REST Countries repository file `src/main/resources/countriesV3.1.json`: an array of
|
||||
250 country records. It is the exact dataset behind the (deprecated) `/v3.1` API.
|
||||
|
||||
## Method
|
||||
- `extract_countries.py` reads the JSON array and flattens every record to one CSV
|
||||
row on a fixed 14-column contract. No field contains a comma, so the file is
|
||||
trivially parseable with any CSV reader.
|
||||
|
||||
## Verification
|
||||
1. `verify_extraction.py` vs the raw source: PASS
|
||||
(`rows=250 codes=250 source=250`).
|
||||
2. `check_countries.py` structural gate: exit 0 (the CHECK line in the final
|
||||
report; 0 = correct, nonzero = wrong).
|
||||
|
||||
## Columns (in order)
|
||||
name_common | name_official | alpha2 | alpha3 | numeric | region |
|
||||
subregion | capital | population | area_km2 | currencies | languages | tlds | flag
|
||||
|
||||
## Provenance
|
||||
- SHA-256 of `source_countriesV3.1.json`: (filled after the run)
|
||||
- Source record count: 250 (distinct ISO 3166-1 alpha-2 codes).
|
||||
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Structural verifier for the countries extraction table.
|
||||
|
||||
Usage:
|
||||
python3 check_countries.py <csv_path> <expected_rows>
|
||||
|
||||
Exits 0 iff the CSV satisfies the contract:
|
||||
- header is exactly the 14-column contract (see HEADERS)
|
||||
- every data row has exactly 14 fields
|
||||
- alpha-2 codes are unique and there are exactly expected_rows rows
|
||||
|
||||
Exits 1 with a detailed message otherwise. The exit code IS the verdict:
|
||||
0 = correct, nonzero = wrong.
|
||||
"""
|
||||
import csv
|
||||
import sys
|
||||
|
||||
EXPECTED_HEADER = [
|
||||
'name_common', 'name_official', 'alpha2', 'alpha3', 'numeric',
|
||||
'region', 'subregion', 'capital', 'population', 'area_km2',
|
||||
'currencies', 'languages', 'tlds', 'flag',
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
sys.stderr.write('usage: check_countries.py <csv_path> <expected_rows>\n')
|
||||
return 2
|
||||
csv_path, expected_raw = sys.argv[1], sys.argv[2]
|
||||
try:
|
||||
expected = int(expected_raw)
|
||||
except ValueError:
|
||||
sys.stderr.write('expected_rows must be an integer\n')
|
||||
return 2
|
||||
try:
|
||||
fh = open(csv_path, encoding='utf-8')
|
||||
except OSError as exc:
|
||||
sys.stderr.write('cannot open %s: %s\n' % (csv_path, exc))
|
||||
return 1
|
||||
|
||||
with fh:
|
||||
reader = csv.reader(fh)
|
||||
try:
|
||||
header = next(reader)
|
||||
except StopIteration:
|
||||
sys.stderr.write('CSV is empty\n')
|
||||
return 1
|
||||
if header != EXPECTED_HEADER:
|
||||
sys.stderr.write('bad header: %r\n' % header)
|
||||
return 1
|
||||
rows = list(reader)
|
||||
codes = []
|
||||
for index, row in enumerate(rows, start=2):
|
||||
if len(row) != len(EXPECTED_HEADER):
|
||||
sys.stderr.write('row %d has %d fields (expected %d)\n'
|
||||
% (index, len(row), len(EXPECTED_HEADER)))
|
||||
return 1
|
||||
codes.append(row[2])
|
||||
seen = set()
|
||||
duplicates = []
|
||||
for code in codes:
|
||||
if code in seen:
|
||||
duplicates.append(code)
|
||||
seen.add(code)
|
||||
|
||||
ok = True
|
||||
if len(rows) != expected:
|
||||
sys.stderr.write('row count %d != expected %d\n'
|
||||
% (len(rows), expected))
|
||||
ok = False
|
||||
if duplicates:
|
||||
sys.stderr.write('duplicate alpha-2 codes: %r\n' % sorted(duplicates))
|
||||
ok = False
|
||||
print('rows=%d fields=%d unique_alpha2=%d header_ok=True'
|
||||
% (len(rows), len(header), len(seen)))
|
||||
return 0 if ok else 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,9 @@
|
||||
51 ledger
|
||||
26 sol
|
||||
26 quill
|
||||
23 beam
|
||||
22 volt
|
||||
7 Zephyrus Sparkborn
|
||||
4 Cassian Assayborn
|
||||
1 Timmy
|
||||
1 Sentinel
|
||||
|
@@ -0,0 +1,3 @@
|
||||
76 2026-11-01
|
||||
80 2026-11-02
|
||||
5 2026-11-03
|
||||
|
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"source": "source_countriesV3.1.json (REST Countries v3.1)",
|
||||
"rows": 250,
|
||||
"expected_rows": 250,
|
||||
"fields": 14,
|
||||
"unique_alpha2": 250,
|
||||
"header_ok": true,
|
||||
"check_rc": 0,
|
||||
"check_output": "rows=250 fields=14 unique_alpha2=250 header_ok=True",
|
||||
"check_stderr": ""
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
name_common,name_official,alpha2,alpha3,numeric,region,subregion,capital,population,area_km2,currencies,languages,tlds,flag
|
||||
Aruba,Aruba,AW,ABW,533,Americas,Caribbean,Oranjestad,107566,180,AWG,nld | pap,.aw,🇦🇼
|
||||
Afghanistan,Islamic Republic of Afghanistan,AF,AFG,004,Asia,Southern Asia,Kabul,43844000,652230,AFN,prs | pus | tuk,.af,🇦🇫
|
||||
Angola,Republic of Angola,AO,AGO,024,Africa,Middle Africa,Luanda,36170961,1246700,AOA,por,.ao,🇦🇴
|
||||
Anguilla,Anguilla,AI,AIA,660,Americas,Caribbean,The Valley,16010,91,XCD,eng,.ai,🇦🇮
|
||||
Åland Islands,Åland Islands,AX,ALA,248,Europe,Northern Europe,Mariehamn,30654,1580,EUR,swe,.ax,🇦🇽
|
||||
Albania,Republic of Albania,AL,ALB,008,Europe,Southeast Europe,Tirana,2363314,28748,ALL,sqi,.al,🇦🇱
|
||||
Andorra,Principality of Andorra,AD,AND,020,Europe,Southern Europe,Andorra la Vella,88406,468,EUR,cat,.ad,🇦🇩
|
||||
United Arab Emirates,United Arab Emirates,AE,ARE,784,Asia,Western Asia,Abu Dhabi,11294243,83600,AED,ara,.ae | امارات.,🇦🇪
|
||||
Argentina,Argentine Republic,AR,ARG,032,Americas,South America,Buenos Aires,46735004,2780400,ARS,grn | spa,.ar,🇦🇷
|
||||
Armenia,Republic of Armenia,AM,ARM,051,Asia,Western Asia,Yerevan,3076200,29743,AMD,hye,.am,🇦🇲
|
||||
American Samoa,American Samoa,AS,ASM,016,Oceania,Polynesia,Pago Pago,49710,199,USD,eng | smo,.as,🇦🇸
|
||||
Antarctica,Antarctica,AQ,ATA,010,Antarctic,,,1300,14000000,,,.aq,🇦🇶
|
||||
French Southern and Antarctic Lands,Territory of the French Southern and Antarctic Lands,TF,ATF,260,Antarctic,,Port-aux-Français,400,7747,EUR,fra,.tf,🇹🇫
|
||||
Antigua and Barbuda,Antigua and Barbuda,AG,ATG,028,Americas,Caribbean,Saint John's,103603,442,XCD,eng,.ag,🇦🇬
|
||||
Australia,Commonwealth of Australia,AU,AUS,036,Oceania,Australia and New Zealand,Canberra,27536874,7692024,AUD,eng,.au,🇦🇺
|
||||
Austria,Republic of Austria,AT,AUT,040,Europe,Central Europe,Vienna,9200931,83871,EUR,deu,.at,🇦🇹
|
||||
Azerbaijan,Republic of Azerbaijan,AZ,AZE,031,Asia,Western Asia,Baku,10241722,86600,AZN,aze,.az,🇦🇿
|
||||
Burundi,Republic of Burundi,BI,BDI,108,Africa,Eastern Africa,Gitega,12332788,27834,BIF,fra | run,.bi,🇧🇮
|
||||
Belgium,Kingdom of Belgium,BE,BEL,056,Europe,Western Europe,Brussels,11825551,30528,EUR,deu | fra | nld,.be,🇧🇪
|
||||
Benin,Republic of Benin,BJ,BEN,204,Africa,Western Africa,Porto-Novo,13224860,112622,XOF,fra,.bj,🇧🇯
|
||||
Burkina Faso,Burkina Faso,BF,BFA,854,Africa,Western Africa,Ouagadougou,24070553,272967,XOF,fra,.bf,🇧🇫
|
||||
Bangladesh,People's Republic of Bangladesh,BD,BGD,050,Asia,Southern Asia,Dhaka,169828911,147570,BDT,ben,.bd,🇧🇩
|
||||
Bulgaria,Republic of Bulgaria,BG,BGR,100,Europe,Southeast Europe,Sofia,6437360,110879,BGN,bul,.bg,🇧🇬
|
||||
Bahrain,Kingdom of Bahrain,BH,BHR,048,Asia,Western Asia,Manama,1594654,765,BHD,ara,.bh,🇧🇭
|
||||
Bahamas,Commonwealth of the Bahamas,BS,BHS,044,Americas,Caribbean,Nassau,398165,13943,BSD | USD,eng,.bs,🇧🇸
|
||||
Bosnia and Herzegovina,Bosnia and Herzegovina,BA,BIH,070,Europe,Southeast Europe,Sarajevo,3422000,51209,BAM,bos | hrv | srp,.ba,🇧🇦
|
||||
Saint Barthélemy,Collectivity of Saint Barthélemy,BL,BLM,652,Americas,Caribbean,Gustavia,10562,21,EUR,fra,.bl,🇧🇱
|
||||
"Saint Helena, Ascension and Tristan da Cunha","Saint Helena, Ascension and Tristan da Cunha",SH,SHN,654,Africa,Western Africa,Jamestown,5651,394,GBP | SHP,eng,.sh | .ac,🇸🇭
|
||||
Belarus,Republic of Belarus,BY,BLR,112,Europe,Eastern Europe,Minsk,9109280,207600,BYN,bel | rus,.by,🇧🇾
|
||||
Belize,Belize,BZ,BLZ,084,Americas,Central America,Belmopan,417634,22966,BZD,bjz | eng | spa,.bz,🇧🇿
|
||||
Bermuda,Bermuda,BM,BMU,060,Americas,North America,Hamilton,64055,54,BMD,eng,.bm,🇧🇲
|
||||
Bolivia,Plurinational State of Bolivia,BO,BOL,068,Americas,South America,Sucre,11365333,1098581,BOB,aym | grn | que | spa,.bo,🇧🇴
|
||||
Caribbean Netherlands,"Bonaire, Sint Eustatius and Saba",BQ,BES,535,Americas,Caribbean,Kralendijk,31980,328,USD,eng | nld | pap,.bq | .nl,🇧🇶
|
||||
Brazil,Federative Republic of Brazil,BR,BRA,076,Americas,South America,Brasília,213421037,8515767,BRL,por,.br,🇧🇷
|
||||
Barbados,Barbados,BB,BRB,052,Americas,Caribbean,Bridgetown,267800,430,BBD,eng,.bb,🇧🇧
|
||||
Brunei,"Nation of Brunei, Abode of Peace",BN,BRN,096,Asia,South-Eastern Asia,Bandar Seri Begawan,455500,5765,BND | SGD,msa,.bn,🇧🇳
|
||||
Bhutan,Kingdom of Bhutan,BT,BTN,064,Asia,Southern Asia,Thimphu,784043,38394,BTN | INR,dzo,.bt,🇧🇹
|
||||
Bouvet Island,Bouvet Island,BV,BVT,074,Antarctic,,,0,49,,nor,.bv,🇧🇻
|
||||
Botswana,Republic of Botswana,BW,BWA,072,Africa,Southern Africa,Gaborone,2359609,582000,BWP,eng | tsn,.bw,🇧🇼
|
||||
Central African Republic,Central African Republic,CF,CAF,140,Africa,Middle Africa,Bangui,6470307,622984,XAF,fra | sag,.cf,🇨🇫
|
||||
Canada,Canada,CA,CAN,124,Americas,North America,Ottawa,41651653,9984670,CAD,eng | fra,.ca,🇨🇦
|
||||
Cocos (Keeling) Islands,Territory of the Cocos (Keeling) Islands,CC,CCK,166,Oceania,Australia and New Zealand,West Island,593,14,AUD,eng,.cc,🇨🇨
|
||||
Switzerland,Swiss Confederation,CH,CHE,756,Europe,Western Europe,Bern,9082848,41284,CHF,fra | gsw | ita | roh,.ch,🇨🇭
|
||||
Chile,Republic of Chile,CL,CHL,152,Americas,South America,Santiago,20206953,756102,CLP,spa,.cl,🇨🇱
|
||||
China,People's Republic of China,CN,CHN,156,Asia,Eastern Asia,Beijing,1408280000,9706961,CNY,zho,.cn | .中国 | .中國 | .公司 | .网络,🇨🇳
|
||||
Ivory Coast,Republic of Côte d'Ivoire,CI,CIV,384,Africa,Western Africa,Yamoussoukro,31719275,322463,XOF,fra,.ci,🇨🇮
|
||||
Cameroon,Republic of Cameroon,CM,CMR,120,Africa,Middle Africa,Yaoundé,29442327,475442,XAF,eng | fra,.cm,🇨🇲
|
||||
DR Congo,Democratic Republic of the Congo,CD,COD,180,Africa,Middle Africa,Kinshasa,112832000,2344858,CDF,fra | kon | lin | lua | swa,.cd,🇨🇩
|
||||
Republic of the Congo,Republic of the Congo,CG,COG,178,Africa,Middle Africa,Brazzaville,6142180,342000,XAF,fra | kon | lin,.cg,🇨🇬
|
||||
Cook Islands,Cook Islands,CK,COK,184,Oceania,Polynesia,Avarua,15040,236,CKD | NZD,eng | rar,.ck,🇨🇰
|
||||
Colombia,Republic of Colombia,CO,COL,170,Americas,South America,Bogotá,53057212,1141748,COP,spa,.co,🇨🇴
|
||||
Comoros,Union of the Comoros,KM,COM,174,Africa,Eastern Africa,Moroni,919901,1862,KMF,ara | fra | zdj,.km,🇰🇲
|
||||
Cape Verde,Republic of Cabo Verde,CV,CPV,132,Africa,Western Africa,Praia,491233,4033,CVE,por,.cv,🇨🇻
|
||||
Costa Rica,Republic of Costa Rica,CR,CRI,188,Americas,Central America,San José,5309625,51100,CRC,spa,.cr,🇨🇷
|
||||
Cuba,Republic of Cuba,CU,CUB,192,Americas,Caribbean,Havana,9748007,109884,CUC | CUP,spa,.cu,🇨🇺
|
||||
Curaçao,Country of Curaçao,CW,CUW,531,Americas,Caribbean,Willemstad,156115,444,ANG,eng | nld | pap,.cw,🇨🇼
|
||||
Christmas Island,Territory of Christmas Island,CX,CXR,162,Oceania,Australia and New Zealand,Flying Fish Cove,1692,135,AUD,eng,.cx,🇨🇽
|
||||
Cayman Islands,Cayman Islands,KY,CYM,136,Americas,Caribbean,George Town,84738,264,KYD,eng,.ky,🇰🇾
|
||||
Cyprus,Republic of Cyprus,CY,CYP,196,Europe,Southern Europe,Nicosia,1442614,9251,EUR,ell | tur,.cy,🇨🇾
|
||||
Czechia,Czech Republic,CZ,CZE,203,Europe,Central Europe,Prague,10882341,78865,CZK,ces | slk,.cz,🇨🇿
|
||||
Germany,Federal Republic of Germany,DE,DEU,276,Europe,Western Europe,Berlin,83491249,357114,EUR,deu,.de,🇩🇪
|
||||
Djibouti,Republic of Djibouti,DJ,DJI,262,Africa,Eastern Africa,Djibouti,1066809,23200,DJF,ara | fra,.dj,🇩🇯
|
||||
Dominica,Commonwealth of Dominica,DM,DMA,212,Americas,Caribbean,Roseau,67408,751,XCD,eng,.dm,🇩🇲
|
||||
Denmark,Kingdom of Denmark,DK,DNK,208,Europe,Northern Europe,Copenhagen,6011488,43094,DKK,dan,.dk,🇩🇰
|
||||
Dominican Republic,Dominican Republic,DO,DOM,214,Americas,Caribbean,Santo Domingo,10771504,48671,DOP,spa,.do,🇩🇴
|
||||
Algeria,People's Democratic Republic of Algeria,DZ,DZA,012,Africa,Northern Africa,Algiers,47400000,2381741,DZD,ara,.dz | الجزائر.,🇩🇿
|
||||
Ecuador,Republic of Ecuador,EC,ECU,218,Americas,South America,Quito,18103660,276841,USD,spa,.ec,🇪🇨
|
||||
Egypt,Arab Republic of Egypt,EG,EGY,818,Africa,Northern Africa,Cairo,107271260,1002450,EGP,ara,.eg | .مصر,🇪🇬
|
||||
Eritrea,State of Eritrea,ER,ERI,232,Africa,Eastern Africa,Asmara,3607000,117600,ERN,ara | eng | tir,.er,🇪🇷
|
||||
Western Sahara,Sahrawi Arab Democratic Republic,EH,ESH,732,Africa,Northern Africa,El Aaiún,600904,266000,DZD | MAD | MRU,ber | mey | spa,.eh,🇪🇭
|
||||
Spain,Kingdom of Spain,ES,ESP,724,Europe,Southern Europe,Madrid,49315949,505992,EUR,cat | eus | glc | spa,.es,🇪🇸
|
||||
Estonia,Republic of Estonia,EE,EST,233,Europe,Northern Europe,Tallinn,1369995,45227,EUR,est,.ee,🇪🇪
|
||||
Ethiopia,Federal Democratic Republic of Ethiopia,ET,ETH,231,Africa,Eastern Africa,Addis Ababa,111652998,1104300,ETB,amh,.et,🇪🇹
|
||||
Finland,Republic of Finland,FI,FIN,246,Europe,Northern Europe,Helsinki,5650325,338455,EUR,fin | swe,.fi,🇫🇮
|
||||
Fiji,Republic of Fiji,FJ,FJI,242,Oceania,Melanesia,Suva,900869,18272,FJD,eng | fij | hif,.fj,🇫🇯
|
||||
Falkland Islands,Falkland Islands,FK,FLK,238,Americas,South America,Stanley,3662,12173,FKP,eng,.fk,🇫🇰
|
||||
France,French Republic,FR,FRA,250,Europe,Western Europe,Paris,66351959,543908,EUR,fra,.fr,🇫🇷
|
||||
Faroe Islands,Faroe Islands,FO,FRO,234,Europe,Northern Europe,Tórshavn,54885,1393,DKK | FOK,dan | fao,.fo,🇫🇴
|
||||
Micronesia,Federated States of Micronesia,FM,FSM,583,Oceania,Micronesia,Palikir,105564,702,USD,eng,.fm,🇫🇲
|
||||
Gabon,Gabonese Republic,GA,GAB,266,Africa,Middle Africa,Libreville,2469296,267668,XAF,fra,.ga,🇬🇦
|
||||
United Kingdom,United Kingdom of Great Britain and Northern Ireland,GB,GBR,826,Europe,Northern Europe,London,69281437,244376,GBP,eng,.uk,🇬🇧
|
||||
Georgia,Georgia,GE,GEO,268,Asia,Western Asia,Tbilisi,4000921,69700,GEL,kat,.ge,🇬🇪
|
||||
Guernsey,Bailiwick of Guernsey,GG,GGY,831,Europe,Northern Europe,St. Peter Port,64781,78,GBP | GGP,eng | fra | nfr,.gg,🇬🇬
|
||||
Ghana,Republic of Ghana,GH,GHA,288,Africa,Western Africa,Accra,33742380,238533,GHS,eng,.gh,🇬🇭
|
||||
Gibraltar,Gibraltar,GI,GIB,292,Europe,Southern Europe,Gibraltar,38000,6,GIP,eng,.gi,🇬🇮
|
||||
Guinea,Republic of Guinea,GN,GIN,324,Africa,Western Africa,Conakry,14363931,245857,GNF,fra,.gn,🇬🇳
|
||||
Guadeloupe,Guadeloupe,GP,GLP,312,Americas,Caribbean,Basse-Terre,378561,1628,EUR,fra,.gp,🇬🇵
|
||||
Gambia,Republic of the Gambia,GM,GMB,270,Africa,Western Africa,Banjul,2422712,10689,GMD,eng,.gm,🇬🇲
|
||||
Guinea-Bissau,Republic of Guinea-Bissau,GW,GNB,624,Africa,Western Africa,Bissau,1781308,36125,XOF,por | pov,.gw,🇬🇼
|
||||
Equatorial Guinea,Republic of Equatorial Guinea,GQ,GNQ,226,Africa,Middle Africa,Ciudad de la Paz,1668768,28051,XAF,fra | por | spa,.gq,🇬🇶
|
||||
Greece,Hellenic Republic,GR,GRC,300,Europe,Southern Europe,Athens,10400720,131990,EUR,ell,.gr,🇬🇷
|
||||
Grenada,Grenada,GD,GRD,308,Americas,Caribbean,St. George's,109021,344,XCD,eng,.gd,🇬🇩
|
||||
Greenland,Greenland,GL,GRL,304,Americas,North America,Nuuk,56542,2166086,DKK,kal,.gl,🇬🇱
|
||||
Guatemala,Republic of Guatemala,GT,GTM,320,Americas,Central America,Guatemala City,18079810,108889,GTQ,spa,.gt,🇬🇹
|
||||
French Guiana,Guiana,GF,GUF,254,Americas,South America,Cayenne,292354,83534,EUR,fra,.gf,🇬🇫
|
||||
Guam,Guam,GU,GUM,316,Oceania,Micronesia,Hagåtña,153836,549,USD,cha | eng | spa,.gu,🇬🇺
|
||||
Guyana,Co-operative Republic of Guyana,GY,GUY,328,Americas,South America,Georgetown,772975,214969,GYD,eng,.gy,🇬🇾
|
||||
Hong Kong,Hong Kong Special Administrative Region of the People's Republic of China,HK,HKG,344,Asia,Eastern Asia,City of Victoria,7527500,1104,HKD,eng | zho,.hk | .香港,🇭🇰
|
||||
Heard Island and McDonald Islands,Heard Island and McDonald Islands,HM,HMD,334,Antarctic,,,0,412,,eng,.hm | .aq,🇭🇲
|
||||
Honduras,Republic of Honduras,HN,HND,340,Americas,Central America,Tegucigalpa,9892632,112492,HNL,spa,.hn,🇭🇳
|
||||
Croatia,Republic of Croatia,HR,HRV,191,Europe,Southeast Europe,Zagreb,3866233,56594,EUR,hrv,.hr,🇭🇷
|
||||
Haiti,Republic of Haiti,HT,HTI,332,Americas,Caribbean,Port-au-Prince,11867032,27750,HTG,fra | hat,.ht,🇭🇹
|
||||
Hungary,Hungary,HU,HUN,348,Europe,Central Europe,Budapest,9539502,93028,HUF,hun,.hu,🇭🇺
|
||||
Indonesia,Republic of Indonesia,ID,IDN,360,Asia,South-Eastern Asia,Jakarta,284438782,1904569,IDR,ind,.id,🇮🇩
|
||||
Isle of Man,Isle of Man,IM,IMN,833,Europe,Northern Europe,Douglas,84530,572,GBP | IMP,eng | glv,.im,🇮🇲
|
||||
India,Republic of India,IN,IND,356,Asia,Southern Asia,New Delhi,1417492000,3287263,INR,eng | hin | tam,.in,🇮🇳
|
||||
British Indian Ocean Territory,British Indian Ocean Territory,IO,IOT,086,Africa,Eastern Africa,Diego Garcia,0,60,USD,eng,.io,🇮🇴
|
||||
Ireland,Republic of Ireland,IE,IRL,372,Europe,Northern Europe,Dublin,5458600,70273,EUR,eng | gle,.ie,🇮🇪
|
||||
Iran,Islamic Republic of Iran,IR,IRN,364,Asia,Southern Asia,Tehran,85961000,1648195,IRR,fas,.ir | ایران.,🇮🇷
|
||||
Iraq,Republic of Iraq,IQ,IRQ,368,Asia,Western Asia,Baghdad,46118793,438317,IQD,ara | arc | ckb,.iq,🇮🇶
|
||||
Iceland,Iceland,IS,ISL,352,Europe,Northern Europe,Reykjavik,391810,103000,ISK,isl,.is,🇮🇸
|
||||
Israel,State of Israel,IL,ISR,376,Asia,Western Asia,Jerusalem,10134800,21937,ILS,ara | heb,.il,🇮🇱
|
||||
Italy,Italian Republic,IT,ITA,380,Europe,Southern Europe,Rome,58927633,301336,EUR,cat | ita,.it,🇮🇹
|
||||
Jamaica,Jamaica,JM,JAM,388,Americas,Caribbean,Kingston,2825544,10991,JMD,eng | jam,.jm,🇯🇲
|
||||
Jersey,Bailiwick of Jersey,JE,JEY,832,Europe,Northern Europe,Saint Helier,103267,116,GBP | JEP,eng | fra | nrf,.je,🇯🇪
|
||||
Jordan,Hashemite Kingdom of Jordan,JO,JOR,400,Asia,Western Asia,Amman,11734000,89342,JOD,ara,.jo | الاردن.,🇯🇴
|
||||
Japan,Japan,JP,JPN,392,Asia,Eastern Asia,Tokyo,123210000,377930,JPY,jpn,.jp | .みんな,🇯🇵
|
||||
Kazakhstan,Republic of Kazakhstan,KZ,KAZ,398,Asia,Central Asia,Astana,20426568,2724900,KZT,kaz | rus,.kz | .қаз,🇰🇿
|
||||
Kenya,Republic of Kenya,KE,KEN,404,Africa,Eastern Africa,Nairobi,53330978,580367,KES,eng | swa,.ke,🇰🇪
|
||||
Kyrgyzstan,Kyrgyz Republic,KG,KGZ,417,Asia,Central Asia,Bishkek,7281800,199951,KGS,kir | rus,.kg,🇰🇬
|
||||
Cambodia,Kingdom of Cambodia,KH,KHM,116,Asia,South-Eastern Asia,Phnom Penh,17577760,181035,KHR | USD,khm,.kh,🇰🇭
|
||||
Kiribati,Independent and Sovereign Republic of Kiribati,KI,KIR,296,Oceania,Micronesia,South Tarawa,120740,811,AUD | KID,eng | gil,.ki,🇰🇮
|
||||
Saint Kitts and Nevis,Federation of Saint Christopher and Nevis,KN,KNA,659,Americas,Caribbean,Basseterre,51320,261,XCD,eng,.kn,🇰🇳
|
||||
South Korea,Republic of Korea,KR,KOR,410,Asia,Eastern Asia,Seoul,51159889,100210,KRW,kor,.kr | .한국,🇰🇷
|
||||
Kosovo,Republic of Kosovo,XK,UNK,,Europe,Southeast Europe,Pristina,1585566,10908,EUR,sqi | srp,,🇽🇰
|
||||
Kuwait,State of Kuwait,KW,KWT,414,Asia,Western Asia,Kuwait City,4881254,17818,KWD,ara,.kw,🇰🇼
|
||||
Laos,Lao People's Democratic Republic,LA,LAO,418,Asia,South-Eastern Asia,Vientiane,7647000,236800,LAK,lao,.la,🇱🇦
|
||||
Lebanon,Lebanese Republic,LB,LBN,422,Asia,Western Asia,Beirut,5490000,10452,LBP,ara | fra,.lb,🇱🇧
|
||||
Liberia,Republic of Liberia,LR,LBR,430,Africa,Western Africa,Monrovia,5248621,111369,LRD,eng,.lr,🇱🇷
|
||||
Libya,State of Libya,LY,LBY,434,Africa,Northern Africa,Tripoli,7459000,1759540,LYD,ara,.ly,🇱🇾
|
||||
Saint Lucia,Saint Lucia,LC,LCA,662,Americas,Caribbean,Castries,184100,616,XCD,eng,.lc,🇱🇨
|
||||
Liechtenstein,Principality of Liechtenstein,LI,LIE,438,Europe,Western Europe,Vaduz,40900,160,CHF,deu,.li,🇱🇮
|
||||
Sri Lanka,Democratic Socialist Republic of Sri Lanka,LK,LKA,144,Asia,Southern Asia,Sri Jayawardenepura Kotte,21763170,65610,LKR,sin | tam,.lk | .இலங்கை | .ලංකා,🇱🇰
|
||||
Lesotho,Kingdom of Lesotho,LS,LSO,426,Africa,Southern Africa,Maseru,2116427,30355,LSL | ZAR,eng | sot,.ls,🇱🇸
|
||||
Lithuania,Republic of Lithuania,LT,LTU,440,Europe,Northern Europe,Vilnius,2894886,65300,EUR,lit,.lt,🇱🇹
|
||||
Luxembourg,Grand Duchy of Luxembourg,LU,LUX,442,Europe,Western Europe,Luxembourg,681973,2586,EUR,deu | fra | ltz,.lu,🇱🇺
|
||||
Latvia,Republic of Latvia,LV,LVA,428,Europe,Northern Europe,Riga,1829000,64559,EUR,lav,.lv,🇱🇻
|
||||
Macau,Macao Special Administrative Region of the People's Republic of China,MO,MAC,446,Asia,Eastern Asia,,685900,30,MOP,por | zho,.mo,🇲🇴
|
||||
Saint Martin,Saint Martin,MF,MAF,663,Americas,Caribbean,Marigot,31496,53,EUR,fra,.fr | .gp,🇲🇫
|
||||
Morocco,Kingdom of Morocco,MA,MAR,504,Africa,Northern Africa,Rabat,36828330,446550,MAD,ara | ber,.ma | المغرب.,🇲🇦
|
||||
Monaco,Principality of Monaco,MC,MCO,492,Europe,Western Europe,Monaco,38423,2.02,EUR,fra,.mc,🇲🇨
|
||||
Moldova,Republic of Moldova,MD,MDA,498,Europe,Eastern Europe,Chișinău,2749076,33847,MDL,ron,.md,🇲🇩
|
||||
Madagascar,Republic of Madagascar,MG,MDG,450,Africa,Eastern Africa,Antananarivo,31727042,587041,MGA,fra | mlg,.mg,🇲🇬
|
||||
Maldives,Republic of the Maldives,MV,MDV,462,Asia,Southern Asia,Malé,515132,300,MVR,div,.mv,🇲🇻
|
||||
Mexico,United Mexican States,MX,MEX,484,Americas,North America,Mexico City,130575786,1964375,MXN,spa,.mx,🇲🇽
|
||||
Marshall Islands,Republic of the Marshall Islands,MH,MHL,584,Oceania,Micronesia,Majuro,42418,181,USD,eng | mah,.mh,🇲🇭
|
||||
North Macedonia,Republic of North Macedonia,MK,MKD,807,Europe,Southeast Europe,Skopje,1822612,25713,MKD,mkd,.mk,🇲🇰
|
||||
Mali,Republic of Mali,ML,MLI,466,Africa,Western Africa,Bamako,22395489,1240192,XOF,fra,.ml,🇲🇱
|
||||
Malta,Republic of Malta,MT,MLT,470,Europe,Southern Europe,Valletta,574250,316,EUR,eng | mlt,.mt,🇲🇹
|
||||
Myanmar,Republic of the Union of Myanmar,MM,MMR,104,Asia,South-Eastern Asia,Naypyidaw,51316756,676578,MMK,mya,.mm,🇲🇲
|
||||
Montenegro,Montenegro,ME,MNE,499,Europe,Southeast Europe,Podgorica,623327,13812,EUR,cnr,.me,🇲🇪
|
||||
Mongolia,Mongolia,MN,MNG,496,Asia,Eastern Asia,Ulan Bator,3544835,1564110,MNT,mon,.mn,🇲🇳
|
||||
Northern Mariana Islands,Commonwealth of the Northern Mariana Islands,MP,MNP,580,Oceania,Micronesia,Saipan,47329,464,USD,cal | cha | eng,.mp,🇲🇵
|
||||
Mozambique,Republic of Mozambique,MZ,MOZ,508,Africa,Eastern Africa,Maputo,34090466,801590,MZN,por,.mz,🇲🇿
|
||||
Mauritania,Islamic Republic of Mauritania,MR,MRT,478,Africa,Western Africa,Nouakchott,4927532,1030700,MRU,ara,.mr,🇲🇷
|
||||
Montserrat,Montserrat,MS,MSR,500,Americas,Caribbean,Plymouth,4386,102,XCD,eng,.ms,🇲🇸
|
||||
Martinique,Martinique,MQ,MTQ,474,Americas,Caribbean,Fort-de-France,349925,1128,EUR,fra,.mq,🇲🇶
|
||||
Mauritius,Republic of Mauritius,MU,MUS,480,Africa,Eastern Africa,Port Louis,1243741,2040,MUR,eng | fra | mfe,.mu,🇲🇺
|
||||
Malawi,Republic of Malawi,MW,MWI,454,Africa,Eastern Africa,Lilongwe,20734262,118484,MWK,eng | nya,.mw,🇲🇼
|
||||
Malaysia,Malaysia,MY,MYS,458,Asia,South-Eastern Asia,Kuala Lumpur,34231700,330803,MYR,eng | msa,.my,🇲🇾
|
||||
Mayotte,Department of Mayotte,YT,MYT,175,Africa,Eastern Africa,Mamoudzou,320901,374,EUR,fra,.yt,🇾🇹
|
||||
Namibia,Republic of Namibia,NA,NAM,516,Africa,Southern Africa,Windhoek,3022401,825615,NAD | ZAR,afr | deu | eng | her | hgm | kwn | loz | ndo | tsn,.na,🇳🇦
|
||||
New Caledonia,New Caledonia,NC,NCL,540,Oceania,Melanesia,Nouméa,264596,18575,XPF,fra,.nc,🇳🇨
|
||||
Niger,Republic of Niger,NE,NER,562,Africa,Western Africa,Niamey,26312034,1267000,XOF,fra,.ne,🇳🇪
|
||||
Norfolk Island,Territory of Norfolk Island,NF,NFK,574,Oceania,Australia and New Zealand,Kingston,2188,36,AUD,eng | pih,.nf,🇳🇫
|
||||
Nigeria,Federal Republic of Nigeria,NG,NGA,566,Africa,Western Africa,Abuja,223800000,923768,NGN,eng,.ng,🇳🇬
|
||||
Nicaragua,Republic of Nicaragua,NI,NIC,558,Americas,Central America,Managua,6803886,130373,NIO,spa,.ni,🇳🇮
|
||||
Niue,Niue,NU,NIU,570,Oceania,Polynesia,Alofi,1681,260,NZD,eng | niu,.nu,🇳🇺
|
||||
Netherlands,Kingdom of the Netherlands,NL,NLD,528,Europe,Western Europe,Amsterdam,18100436,41865,EUR,nld,.nl,🇳🇱
|
||||
Norway,Kingdom of Norway,NO,NOR,578,Europe,Northern Europe,Oslo,5606944,386224,NOK,nno | nob | smi,.no,🇳🇴
|
||||
Nepal,Federal Democratic Republic of Nepal,NP,NPL,524,Asia,Southern Asia,Kathmandu,29911840,147181,NPR,nep,.np,🇳🇵
|
||||
Nauru,Republic of Nauru,NR,NRU,520,Oceania,Micronesia,Yaren,11680,21,AUD,eng | nau,.nr,🇳🇷
|
||||
New Zealand,New Zealand,NZ,NZL,554,Oceania,Australia and New Zealand,Wellington,5324700,268838,NZD,eng | mri | nzs,.nz,🇳🇿
|
||||
Oman,Sultanate of Oman,OM,OMN,512,Asia,Western Asia,Muscat,5343630,309500,OMR,ara,.om,🇴🇲
|
||||
Pakistan,Islamic Republic of Pakistan,PK,PAK,586,Asia,Southern Asia,Islamabad,241499431,796095,PKR,eng | urd,.pk,🇵🇰
|
||||
Panama,Republic of Panama,PA,PAN,591,Americas,Central America,Panama City,4064780,75417,PAB | USD,spa,.pa,🇵🇦
|
||||
Pitcairn Islands,Pitcairn Group of Islands,PN,PCN,612,Oceania,Polynesia,Adamstown,35,47,NZD,eng,.pn,🇵🇳
|
||||
Peru,Republic of Peru,PE,PER,604,Americas,South America,Lima,34350244,1285216,PEN,aym | que | spa,.pe,🇵🇪
|
||||
Philippines,Republic of the Philippines,PH,PHL,608,Asia,South-Eastern Asia,Manila,114123600,342353,PHP,eng | fil,.ph,🇵🇭
|
||||
Palau,Republic of Palau,PW,PLW,585,Oceania,Micronesia,Ngerulmud,16733,459,USD,eng | pau,.pw,🇵🇼
|
||||
Papua New Guinea,Independent State of Papua New Guinea,PG,PNG,598,Oceania,Melanesia,Port Moresby,11781559,462840,PGK,eng | hmo | tpi,.pg,🇵🇬
|
||||
Poland,Republic of Poland,PL,POL,616,Europe,Central Europe,Warsaw,37392000,312679,PLN,pol,.pl,🇵🇱
|
||||
Puerto Rico,Commonwealth of Puerto Rico,PR,PRI,630,Americas,Caribbean,San Juan,3203295,8870,USD,eng | spa,.pr,🇵🇷
|
||||
North Korea,Democratic People's Republic of Korea,KP,PRK,408,Asia,Eastern Asia,Pyongyang,25950000,120538,KPW,kor,.kp,🇰🇵
|
||||
Portugal,Portuguese Republic,PT,PRT,620,Europe,Southern Europe,Lisbon,10749635,92090,EUR,por,.pt,🇵🇹
|
||||
Paraguay,Republic of Paraguay,PY,PRY,600,Americas,South America,Asunción,6109644,406752,PYG,grn | spa,.py,🇵🇾
|
||||
Palestine,State of Palestine,PS,PSE,275,Asia,Western Asia,Ramallah | Jerusalem,5483450,6220,EGP | ILS | JOD,ara,.ps | فلسطين.,🇵🇸
|
||||
French Polynesia,French Polynesia,PF,PYF,258,Oceania,Polynesia,Papeetē,279500,4167,XPF,fra,.pf,🇵🇫
|
||||
Qatar,State of Qatar,QA,QAT,634,Asia,Western Asia,Doha,3173024,11586,QAR,ara,.qa | قطر.,🇶🇦
|
||||
Réunion,Réunion Island,RE,REU,638,Africa,Eastern Africa,Saint-Denis,896175,2511,EUR,fra,.re,🇷🇪
|
||||
Romania,Romania,RO,ROU,642,Europe,Southeast Europe,Bucharest,19036031,238391,RON,ron,.ro,🇷🇴
|
||||
Russia,Russian Federation,RU,RUS,643,Europe,Eastern Europe,Moscow,146028325,17098246,RUB,rus,.ru | .su | .рф,🇷🇺
|
||||
Rwanda,Republic of Rwanda,RW,RWA,646,Africa,Eastern Africa,Kigali,14104969,26338,RWF,eng | fra | kin,.rw,🇷🇼
|
||||
Saudi Arabia,Kingdom of Saudi Arabia,SA,SAU,682,Asia,Western Asia,Riyadh,35300280,2149690,SAR,ara,.sa | .السعودية,🇸🇦
|
||||
Sudan,Republic of the Sudan,SD,SDN,729,Africa,Northern Africa,Khartoum,51662000,1886068,SDG,ara | eng,.sd,🇸🇩
|
||||
Senegal,Republic of Senegal,SN,SEN,686,Africa,Western Africa,Dakar,18593258,196722,XOF,fra,.sn,🇸🇳
|
||||
Singapore,Republic of Singapore,SG,SGP,702,Asia,South-Eastern Asia,Singapore,6110200,710,SGD,eng | msa | tam | zho,.sg | .新加坡 | .சிங்கப்பூர்,🇸🇬
|
||||
South Georgia,South Georgia and the South Sandwich Islands,GS,SGS,239,Antarctic,,King Edward Point,0,3903,GBP,eng,.gs,🇬🇸
|
||||
Svalbard and Jan Mayen,Svalbard og Jan Mayen,SJ,SJM,744,Europe,Northern Europe,Longyearbyen,2530,61399,NOK,nor,.sj,🇸🇯
|
||||
Solomon Islands,Solomon Islands,SB,SLB,090,Oceania,Melanesia,Honiara,750325,28896,SBD,eng,.sb,🇸🇧
|
||||
Sierra Leone,Republic of Sierra Leone,SL,SLE,694,Africa,Western Africa,Freetown,9077691,71740,SLE,eng,.sl,🇸🇱
|
||||
El Salvador,Republic of El Salvador,SV,SLV,222,Americas,Central America,San Salvador,6029976,21041,USD,spa,.sv,🇸🇻
|
||||
San Marino,Republic of San Marino,SM,SMR,674,Europe,Southern Europe,City of San Marino,34132,61,EUR,ita,.sm,🇸🇲
|
||||
Somalia,Federal Republic of Somalia,SO,SOM,706,Africa,Eastern Africa,Mogadishu,19655000,637657,SOS,ara | som,.so,🇸🇴
|
||||
Saint Pierre and Miquelon,Saint Pierre and Miquelon,PM,SPM,666,Americas,North America,Saint-Pierre,5819,242,EUR,fra,.pm,🇵🇲
|
||||
Serbia,Republic of Serbia,RS,SRB,688,Europe,Southeast Europe,Belgrade,6567783,77589,RSD,srp,.rs | .срб,🇷🇸
|
||||
South Sudan,Republic of South Sudan,SS,SSD,728,Africa,Middle Africa,Juba,15786898,619745,SSP,eng,.ss,🇸🇸
|
||||
São Tomé and Príncipe,Democratic Republic of São Tomé and Príncipe,ST,STP,678,Africa,Middle Africa,São Tomé,209607,964,STN,por,.st,🇸🇹
|
||||
Suriname,Republic of Suriname,SR,SUR,740,Americas,South America,Paramaribo,616500,163820,SRD,nld,.sr,🇸🇷
|
||||
Slovakia,Slovak Republic,SK,SVK,703,Europe,Central Europe,Bratislava,5413813,49037,EUR,slk,.sk,🇸🇰
|
||||
Slovenia,Republic of Slovenia,SI,SVN,705,Europe,Central Europe,Ljubljana,2130638,20273,EUR,slv,.si,🇸🇮
|
||||
Sweden,Kingdom of Sweden,SE,SWE,752,Europe,Northern Europe,Stockholm,10605098,450295,SEK,swe,.se,🇸🇪
|
||||
Eswatini,Kingdom of Eswatini,SZ,SWZ,748,Africa,Southern Africa,Mbabane,1235549,17364,SZL | ZAR,eng | ssw,.sz,🇸🇿
|
||||
Sint Maarten,Sint Maarten,SX,SXM,534,Americas,Caribbean,Philipsburg,41349,34,ANG,eng | fra | nld,.sx,🇸🇽
|
||||
Seychelles,Republic of Seychelles,SC,SYC,690,Africa,Eastern Africa,Victoria,122729,452,SCR,crs | eng | fra,.sc,🇸🇨
|
||||
Syria,Syrian Arab Republic,SY,SYR,760,Asia,Western Asia,Damascus,25620000,185180,SYP,ara,.sy | سوريا.,🇸🇾
|
||||
Turks and Caicos Islands,Turks and Caicos Islands,TC,TCA,796,Americas,Caribbean,Cockburn Town,50828,948,USD,eng,.tc,🇹🇨
|
||||
Chad,Republic of Chad,TD,TCD,148,Africa,Middle Africa,N'Djamena,19340757,1284000,XAF,ara | fra,.td,🇹🇩
|
||||
Togo,Togolese Republic,TG,TGO,768,Africa,Western Africa,Lomé,8095498,56785,XOF,fra,.tg,🇹🇬
|
||||
Thailand,Kingdom of Thailand,TH,THA,764,Asia,South-Eastern Asia,Bangkok,65859640,513120,THB,tha,.th | .ไทย,🇹🇭
|
||||
Tajikistan,Republic of Tajikistan,TJ,TJK,762,Asia,Central Asia,Dushanbe,10499000,143100,TJS,rus | tgk,.tj,🇹🇯
|
||||
Tokelau,Tokelau,TK,TKL,772,Oceania,Polynesia,Fakaofo,2608,12,NZD,eng | smo | tkl,.tk,🇹🇰
|
||||
Turkmenistan,Turkmenistan,TM,TKM,795,Asia,Central Asia,Ashgabat,7057841,488100,TMT,rus | tuk,.tm,🇹🇲
|
||||
Timor-Leste,Democratic Republic of Timor-Leste,TL,TLS,626,Asia,South-Eastern Asia,Dili,1391221,14874,USD,por | tet,.tl,🇹🇱
|
||||
Tonga,Kingdom of Tonga,TO,TON,776,Oceania,Polynesia,Nuku'alofa,100179,747,TOP,eng | ton,.to,🇹🇴
|
||||
Trinidad and Tobago,Republic of Trinidad and Tobago,TT,TTO,780,Americas,Caribbean,Port of Spain,1367764,5130,TTD,eng,.tt,🇹🇹
|
||||
Tunisia,Tunisian Republic,TN,TUN,788,Africa,Northern Africa,Tunis,11972169,163610,TND,ara,.tn,🇹🇳
|
||||
Turkey,Republic of Turkey,TR,TUR,792,Asia,Western Asia,Ankara,85664944,783562,TRY,tur,.tr,🇹🇷
|
||||
Tuvalu,Tuvalu,TV,TUV,798,Oceania,Polynesia,Funafuti,10643,26,AUD | TVD,eng | tvl,.tv,🇹🇻
|
||||
Taiwan,Republic of China (Taiwan),TW,TWN,158,Asia,Eastern Asia,Taipei,23317031,36197,TWD,zho,.tw | .台灣 | .台湾,🇹🇼
|
||||
Tanzania,United Republic of Tanzania,TZ,TZA,834,Africa,Eastern Africa,Dodoma,68153004,947303,TZS,eng | swa,.tz,🇹🇿
|
||||
Uganda,Republic of Uganda,UG,UGA,800,Africa,Eastern Africa,Kampala,45905417,241550,UGX,eng | swa,.ug,🇺🇬
|
||||
Ukraine,Ukraine,UA,UKR,804,Europe,Eastern Europe,Kyiv,32862000,603550,UAH,ukr,.ua | .укр,🇺🇦
|
||||
United States Minor Outlying Islands,United States Minor Outlying Islands,UM,UMI,581,Americas,North America,Washington DC,0,34.2,USD,eng,.us,🇺🇲
|
||||
Uruguay,Oriental Republic of Uruguay,UY,URY,858,Americas,South America,Montevideo,3499451,181034,UYU,spa,.uy,🇺🇾
|
||||
United States,United States of America,US,USA,840,Americas,North America,"Washington, D.C.",340110988,9525067,USD,eng,.us,🇺🇸
|
||||
Uzbekistan,Republic of Uzbekistan,UZ,UZB,860,Asia,Central Asia,Tashkent,37859698,447400,UZS,rus | uzb,.uz,🇺🇿
|
||||
Vatican City,Vatican City State,VA,VAT,336,Europe,Southern Europe,Vatican City,882,0.49,EUR,ita | lat,.va,🇻🇦
|
||||
Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,VC,VCT,670,Americas,Caribbean,Kingstown,110872,389,XCD,eng,.vc,🇻🇨
|
||||
Venezuela,Bolivarian Republic of Venezuela,VE,VEN,862,Americas,South America,Caracas,28517000,916445,VES,spa,.ve,🇻🇪
|
||||
British Virgin Islands,Virgin Islands,VG,VGB,092,Americas,Caribbean,Road Town,39471,151,USD,eng,.vg,🇻🇬
|
||||
United States Virgin Islands,Virgin Islands of the United States,VI,VIR,850,Americas,Caribbean,Charlotte Amalie,87146,347,USD,eng,.vi,🇻🇮
|
||||
Vietnam,Socialist Republic of Vietnam,VN,VNM,704,Asia,South-Eastern Asia,Hanoi,101343800,331212,VND,vie,.vn,🇻🇳
|
||||
Vanuatu,Republic of Vanuatu,VU,VUT,548,Oceania,Melanesia,Port Vila,321409,12189,VUV,bis | eng | fra,.vu,🇻🇺
|
||||
Wallis and Futuna,Territory of the Wallis and Futuna Islands,WF,WLF,876,Oceania,Polynesia,Mata-Utu,11620,142,XPF,fra,.wf,🇼🇫
|
||||
Samoa,Independent State of Samoa,WS,WSM,882,Oceania,Polynesia,Apia,205557,2842,WST,eng | smo,.ws,🇼🇸
|
||||
Yemen,Republic of Yemen,YE,YEM,887,Asia,Western Asia,Sana'a,32684503,527968,YER,ara,.ye,🇾🇪
|
||||
South Africa,Republic of South Africa,ZA,ZAF,710,Africa,Southern Africa,Pretoria | Bloemfontein | Cape Town,63100945,1221037,ZAR,afr | eng | nbl | nso | sot | ssw | tsn | tso | ven | xho | zul,.za,🇿🇦
|
||||
Zambia,Republic of Zambia,ZM,ZMB,894,Africa,Eastern Africa,Lusaka,19693423,752612,ZMW,eng,.zm,🇿🇲
|
||||
Zimbabwe,Republic of Zimbabwe,ZW,ZWE,716,Africa,Southern Africa,Harare,17073087,390757,ZWL,bwg | eng | kck | khi | ndc | nde | nya | sna | sot | toi | tsn | tso | ven | xho | zib,.zw,🇿🇼
|
||||
|
@@ -0,0 +1,251 @@
|
||||
name_common,name_official,alpha2,alpha3,numeric,region,subregion,capital,population,area_km2,currencies,languages,tlds,flag
|
||||
Aruba,Aruba,AW,ABW,533,Americas,Caribbean,Oranjestad,107566,180,AWG,nld | pap,.aw,🇦🇼
|
||||
Afghanistan,Islamic Republic of Afghanistan,AF,AFG,004,Asia,Southern Asia,Kabul,43844000,652230,AFN,prs | pus | tuk,.af,🇦🇫
|
||||
Angola,Republic of Angola,AO,AGO,024,Africa,Middle Africa,Luanda,36170961,1246700,AOA,por,.ao,🇦🇴
|
||||
Anguilla,Anguilla,AI,AIA,660,Americas,Caribbean,The Valley,16010,91,XCD,eng,.ai,🇦🇮
|
||||
Åland Islands,Åland Islands,AX,ALA,248,Europe,Northern Europe,Mariehamn,30654,1580,EUR,swe,.ax,🇦🇽
|
||||
Albania,Republic of Albania,AL,ALB,008,Europe,Southeast Europe,Tirana,2363314,28748,ALL,sqi,.al,🇦🇱
|
||||
Andorra,Principality of Andorra,AD,AND,020,Europe,Southern Europe,Andorra la Vella,88406,468,EUR,cat,.ad,🇦🇩
|
||||
United Arab Emirates,United Arab Emirates,AE,ARE,784,Asia,Western Asia,Abu Dhabi,11294243,83600,AED,ara,.ae | امارات.,🇦🇪
|
||||
Argentina,Argentine Republic,AR,ARG,032,Americas,South America,Buenos Aires,46735004,2780400,ARS,grn | spa,.ar,🇦🇷
|
||||
Armenia,Republic of Armenia,AM,ARM,051,Asia,Western Asia,Yerevan,3076200,29743,AMD,hye,.am,🇦🇲
|
||||
American Samoa,American Samoa,AS,ASM,016,Oceania,Polynesia,Pago Pago,49710,199,USD,eng | smo,.as,🇦🇸
|
||||
Antarctica,Antarctica,AQ,ATA,010,Antarctic,,,1300,14000000,,,.aq,🇦🇶
|
||||
French Southern and Antarctic Lands,Territory of the French Southern and Antarctic Lands,TF,ATF,260,Antarctic,,Port-aux-Français,400,7747,EUR,fra,.tf,🇹🇫
|
||||
Antigua and Barbuda,Antigua and Barbuda,AG,ATG,028,Americas,Caribbean,Saint John's,103603,442,XCD,eng,.ag,🇦🇬
|
||||
Australia,Commonwealth of Australia,AU,AUS,036,Oceania,Australia and New Zealand,Canberra,27536874,7692024,AUD,eng,.au,🇦🇺
|
||||
Austria,Republic of Austria,AT,AUT,040,Europe,Central Europe,Vienna,9200931,83871,EUR,deu,.at,🇦🇹
|
||||
Azerbaijan,Republic of Azerbaijan,AZ,AZE,031,Asia,Western Asia,Baku,10241722,86600,AZN,aze,.az,🇦🇿
|
||||
Burundi,Republic of Burundi,BI,BDI,108,Africa,Eastern Africa,Gitega,12332788,27834,BIF,fra | run,.bi,🇧🇮
|
||||
Belgium,Kingdom of Belgium,BE,BEL,056,Europe,Western Europe,Brussels,11825551,30528,EUR,deu | fra | nld,.be,🇧🇪
|
||||
Benin,Republic of Benin,BJ,BEN,204,Africa,Western Africa,Porto-Novo,13224860,112622,XOF,fra,.bj,🇧🇯
|
||||
Burkina Faso,Burkina Faso,BF,BFA,854,Africa,Western Africa,Ouagadougou,24070553,272967,XOF,fra,.bf,🇧🇫
|
||||
Bangladesh,People's Republic of Bangladesh,BD,BGD,050,Asia,Southern Asia,Dhaka,169828911,147570,BDT,ben,.bd,🇧🇩
|
||||
Bulgaria,Republic of Bulgaria,BG,BGR,100,Europe,Southeast Europe,Sofia,6437360,110879,BGN,bul,.bg,🇧🇬
|
||||
Bahrain,Kingdom of Bahrain,BH,BHR,048,Asia,Western Asia,Manama,1594654,765,BHD,ara,.bh,🇧🇭
|
||||
Bahamas,Commonwealth of the Bahamas,BS,BHS,044,Americas,Caribbean,Nassau,398165,13943,BSD | USD,eng,.bs,🇧🇸
|
||||
Bosnia and Herzegovina,Bosnia and Herzegovina,BA,BIH,070,Europe,Southeast Europe,Sarajevo,3422000,51209,BAM,bos | hrv | srp,.ba,🇧🇦
|
||||
Saint Barthélemy,Collectivity of Saint Barthélemy,BL,BLM,652,Americas,Caribbean,Gustavia,10562,21,EUR,fra,.bl,🇧🇱
|
||||
"Saint Helena, Ascension and Tristan da Cunha","Saint Helena, Ascension and Tristan da Cunha",SH,SHN,654,Africa,Western Africa,Jamestown,5651,394,GBP | SHP,eng,.sh | .ac,🇸🇭
|
||||
Belarus,Republic of Belarus,BY,BLR,112,Europe,Eastern Europe,Minsk,9109280,207600,BYN,bel | rus,.by,🇧🇾
|
||||
Belize,Belize,BZ,BLZ,084,Americas,Central America,Belmopan,417634,22966,BZD,bjz | eng | spa,.bz,🇧🇿
|
||||
Bermuda,Bermuda,BM,BMU,060,Americas,North America,Hamilton,64055,54,BMD,eng,.bm,🇧🇲
|
||||
Bolivia,Plurinational State of Bolivia,BO,BOL,068,Americas,South America,Sucre,11365333,1098581,BOB,aym | grn | que | spa,.bo,🇧🇴
|
||||
Caribbean Netherlands,"Bonaire, Sint Eustatius and Saba",BQ,BES,535,Americas,Caribbean,Kralendijk,31980,328,USD,eng | nld | pap,.bq | .nl,🇧🇶
|
||||
Brazil,Federative Republic of Brazil,BR,BRA,076,Americas,South America,Brasília,213421037,8515767,BRL,por,.br,🇧🇷
|
||||
Barbados,Barbados,BB,BRB,052,Americas,Caribbean,Bridgetown,267800,430,BBD,eng,.bb,🇧🇧
|
||||
Brunei,"Nation of Brunei, Abode of Peace",BN,BRN,096,Asia,South-Eastern Asia,Bandar Seri Begawan,455500,5765,BND | SGD,msa,.bn,🇧🇳
|
||||
Bhutan,Kingdom of Bhutan,BT,BTN,064,Asia,Southern Asia,Thimphu,784043,38394,BTN | INR,dzo,.bt,🇧🇹
|
||||
Bouvet Island,Bouvet Island,BV,BVT,074,Antarctic,,,0,49,,nor,.bv,🇧🇻
|
||||
Botswana,Republic of Botswana,BW,BWA,072,Africa,Southern Africa,Gaborone,2359609,582000,BWP,eng | tsn,.bw,🇧🇼
|
||||
Central African Republic,Central African Republic,CF,CAF,140,Africa,Middle Africa,Bangui,6470307,622984,XAF,fra | sag,.cf,🇨🇫
|
||||
Canada,Canada,CA,CAN,124,Americas,North America,Ottawa,41651653,9984670,CAD,eng | fra,.ca,🇨🇦
|
||||
Cocos (Keeling) Islands,Territory of the Cocos (Keeling) Islands,CC,CCK,166,Oceania,Australia and New Zealand,West Island,593,14,AUD,eng,.cc,🇨🇨
|
||||
Switzerland,Swiss Confederation,CH,CHE,756,Europe,Western Europe,Bern,9082848,41284,CHF,fra | gsw | ita | roh,.ch,🇨🇭
|
||||
Chile,Republic of Chile,CL,CHL,152,Americas,South America,Santiago,20206953,756102,CLP,spa,.cl,🇨🇱
|
||||
China,People's Republic of China,CN,CHN,156,Asia,Eastern Asia,Beijing,1408280000,9706961,CNY,zho,.cn | .中国 | .中國 | .公司 | .网络,🇨🇳
|
||||
Ivory Coast,Republic of Côte d'Ivoire,CI,CIV,384,Africa,Western Africa,Yamoussoukro,31719275,322463,XOF,fra,.ci,🇨🇮
|
||||
Cameroon,Republic of Cameroon,CM,CMR,120,Africa,Middle Africa,Yaoundé,29442327,475442,XAF,eng | fra,.cm,🇨🇲
|
||||
DR Congo,Democratic Republic of the Congo,CD,COD,180,Africa,Middle Africa,Kinshasa,112832000,2344858,CDF,fra | kon | lin | lua | swa,.cd,🇨🇩
|
||||
Republic of the Congo,Republic of the Congo,CG,COG,178,Africa,Middle Africa,Brazzaville,6142180,342000,XAF,fra | kon | lin,.cg,🇨🇬
|
||||
Cook Islands,Cook Islands,CK,COK,184,Oceania,Polynesia,Avarua,15040,236,CKD | NZD,eng | rar,.ck,🇨🇰
|
||||
Colombia,Republic of Colombia,CO,COL,170,Americas,South America,Bogotá,53057212,1141748,COP,spa,.co,🇨🇴
|
||||
Comoros,Union of the Comoros,KM,COM,174,Africa,Eastern Africa,Moroni,919901,1862,KMF,ara | fra | zdj,.km,🇰🇲
|
||||
Cape Verde,Republic of Cabo Verde,CV,CPV,132,Africa,Western Africa,Praia,491233,4033,CVE,por,.cv,🇨🇻
|
||||
Costa Rica,Republic of Costa Rica,CR,CRI,188,Americas,Central America,San José,5309625,51100,CRC,spa,.cr,🇨🇷
|
||||
Cuba,Republic of Cuba,CU,CUB,192,Americas,Caribbean,Havana,9748007,109884,CUC | CUP,spa,.cu,🇨🇺
|
||||
Curaçao,Country of Curaçao,CW,CUW,531,Americas,Caribbean,Willemstad,156115,444,ANG,eng | nld | pap,.cw,🇨🇼
|
||||
Christmas Island,Territory of Christmas Island,CX,CXR,162,Oceania,Australia and New Zealand,Flying Fish Cove,1692,135,AUD,eng,.cx,🇨🇽
|
||||
Cayman Islands,Cayman Islands,KY,CYM,136,Americas,Caribbean,George Town,84738,264,KYD,eng,.ky,🇰🇾
|
||||
Cyprus,Republic of Cyprus,CY,CYP,196,Europe,Southern Europe,Nicosia,1442614,9251,EUR,ell | tur,.cy,🇨🇾
|
||||
Czechia,Czech Republic,CZ,CZE,203,Europe,Central Europe,Prague,10882341,78865,CZK,ces | slk,.cz,🇨🇿
|
||||
Germany,Federal Republic of Germany,DE,DEU,276,Europe,Western Europe,Berlin,83491249,357114,EUR,deu,.de,🇩🇪
|
||||
Djibouti,Republic of Djibouti,DJ,DJI,262,Africa,Eastern Africa,Djibouti,1066809,23200,DJF,ara | fra,.dj,🇩🇯
|
||||
Dominica,Commonwealth of Dominica,DM,DMA,212,Americas,Caribbean,Roseau,67408,751,XCD,eng,.dm,🇩🇲
|
||||
Denmark,Kingdom of Denmark,DK,DNK,208,Europe,Northern Europe,Copenhagen,6011488,43094,DKK,dan,.dk,🇩🇰
|
||||
Dominican Republic,Dominican Republic,DO,DOM,214,Americas,Caribbean,Santo Domingo,10771504,48671,DOP,spa,.do,🇩🇴
|
||||
Algeria,People's Democratic Republic of Algeria,DZ,DZA,012,Africa,Northern Africa,Algiers,47400000,2381741,DZD,ara,.dz | الجزائر.,🇩🇿
|
||||
Ecuador,Republic of Ecuador,EC,ECU,218,Americas,South America,Quito,18103660,276841,USD,spa,.ec,🇪🇨
|
||||
Egypt,Arab Republic of Egypt,EG,EGY,818,Africa,Northern Africa,Cairo,107271260,1002450,EGP,ara,.eg | .مصر,🇪🇬
|
||||
Eritrea,State of Eritrea,ER,ERI,232,Africa,Eastern Africa,Asmara,3607000,117600,ERN,ara | eng | tir,.er,🇪🇷
|
||||
Western Sahara,Sahrawi Arab Democratic Republic,EH,ESH,732,Africa,Northern Africa,El Aaiún,600904,266000,DZD | MAD | MRU,ber | mey | spa,.eh,🇪🇭
|
||||
Spain,Kingdom of Spain,ES,ESP,724,Europe,Southern Europe,Madrid,49315949,505992,EUR,cat | eus | glc | spa,.es,🇪🇸
|
||||
Estonia,Republic of Estonia,EE,EST,233,Europe,Northern Europe,Tallinn,1369995,45227,EUR,est,.ee,🇪🇪
|
||||
Ethiopia,Federal Democratic Republic of Ethiopia,ET,ETH,231,Africa,Eastern Africa,Addis Ababa,111652998,1104300,ETB,amh,.et,🇪🇹
|
||||
Finland,Republic of Finland,FI,FIN,246,Europe,Northern Europe,Helsinki,5650325,338455,EUR,fin | swe,.fi,🇫🇮
|
||||
Fiji,Republic of Fiji,FJ,FJI,242,Oceania,Melanesia,Suva,900869,18272,FJD,eng | fij | hif,.fj,🇫🇯
|
||||
Falkland Islands,Falkland Islands,FK,FLK,238,Americas,South America,Stanley,3662,12173,FKP,eng,.fk,🇫🇰
|
||||
France,French Republic,FR,FRA,250,Europe,Western Europe,Paris,66351959,543908,EUR,fra,.fr,🇫🇷
|
||||
Faroe Islands,Faroe Islands,FO,FRO,234,Europe,Northern Europe,Tórshavn,54885,1393,DKK | FOK,dan | fao,.fo,🇫🇴
|
||||
Micronesia,Federated States of Micronesia,FM,FSM,583,Oceania,Micronesia,Palikir,105564,702,USD,eng,.fm,🇫🇲
|
||||
Gabon,Gabonese Republic,GA,GAB,266,Africa,Middle Africa,Libreville,2469296,267668,XAF,fra,.ga,🇬🇦
|
||||
United Kingdom,United Kingdom of Great Britain and Northern Ireland,GB,GBR,826,Europe,Northern Europe,London,69281437,244376,GBP,eng,.uk,🇬🇧
|
||||
Georgia,Georgia,GE,GEO,268,Asia,Western Asia,Tbilisi,4000921,69700,GEL,kat,.ge,🇬🇪
|
||||
Guernsey,Bailiwick of Guernsey,GG,GGY,831,Europe,Northern Europe,St. Peter Port,64781,78,GBP | GGP,eng | fra | nfr,.gg,🇬🇬
|
||||
Ghana,Republic of Ghana,GH,GHA,288,Africa,Western Africa,Accra,33742380,238533,GHS,eng,.gh,🇬🇭
|
||||
Gibraltar,Gibraltar,GI,GIB,292,Europe,Southern Europe,Gibraltar,38000,6,GIP,eng,.gi,🇬🇮
|
||||
Guinea,Republic of Guinea,GN,GIN,324,Africa,Western Africa,Conakry,14363931,245857,GNF,fra,.gn,🇬🇳
|
||||
Guadeloupe,Guadeloupe,GP,GLP,312,Americas,Caribbean,Basse-Terre,378561,1628,EUR,fra,.gp,🇬🇵
|
||||
Gambia,Republic of the Gambia,GM,GMB,270,Africa,Western Africa,Banjul,2422712,10689,GMD,eng,.gm,🇬🇲
|
||||
Guinea-Bissau,Republic of Guinea-Bissau,GW,GNB,624,Africa,Western Africa,Bissau,1781308,36125,XOF,por | pov,.gw,🇬🇼
|
||||
Equatorial Guinea,Republic of Equatorial Guinea,GQ,GNQ,226,Africa,Middle Africa,Ciudad de la Paz,1668768,28051,XAF,fra | por | spa,.gq,🇬🇶
|
||||
Greece,Hellenic Republic,GR,GRC,300,Europe,Southern Europe,Athens,10400720,131990,EUR,ell,.gr,🇬🇷
|
||||
Grenada,Grenada,GD,GRD,308,Americas,Caribbean,St. George's,109021,344,XCD,eng,.gd,🇬🇩
|
||||
Greenland,Greenland,GL,GRL,304,Americas,North America,Nuuk,56542,2166086,DKK,kal,.gl,🇬🇱
|
||||
Guatemala,Republic of Guatemala,GT,GTM,320,Americas,Central America,Guatemala City,18079810,108889,GTQ,spa,.gt,🇬🇹
|
||||
French Guiana,Guiana,GF,GUF,254,Americas,South America,Cayenne,292354,83534,EUR,fra,.gf,🇬🇫
|
||||
Guam,Guam,GU,GUM,316,Oceania,Micronesia,Hagåtña,153836,549,USD,cha | eng | spa,.gu,🇬🇺
|
||||
Guyana,Co-operative Republic of Guyana,GY,GUY,328,Americas,South America,Georgetown,772975,214969,GYD,eng,.gy,🇬🇾
|
||||
Hong Kong,Hong Kong Special Administrative Region of the People's Republic of China,HK,HKG,344,Asia,Eastern Asia,City of Victoria,7527500,1104,HKD,eng | zho,.hk | .香港,🇭🇰
|
||||
Heard Island and McDonald Islands,Heard Island and McDonald Islands,HM,HMD,334,Antarctic,,,0,412,,eng,.hm | .aq,🇭🇲
|
||||
Honduras,Republic of Honduras,HN,HND,340,Americas,Central America,Tegucigalpa,9892632,112492,HNL,spa,.hn,🇭🇳
|
||||
Croatia,Republic of Croatia,HR,HRV,191,Europe,Southeast Europe,Zagreb,3866233,56594,EUR,hrv,.hr,🇭🇷
|
||||
Haiti,Republic of Haiti,HT,HTI,332,Americas,Caribbean,Port-au-Prince,11867032,27750,HTG,fra | hat,.ht,🇭🇹
|
||||
Hungary,Hungary,HU,HUN,348,Europe,Central Europe,Budapest,9539502,93028,HUF,hun,.hu,🇭🇺
|
||||
Indonesia,Republic of Indonesia,ID,IDN,360,Asia,South-Eastern Asia,Jakarta,284438782,1904569,IDR,ind,.id,🇮🇩
|
||||
Isle of Man,Isle of Man,IM,IMN,833,Europe,Northern Europe,Douglas,84530,572,GBP | IMP,eng | glv,.im,🇮🇲
|
||||
India,Republic of India,IN,IND,356,Asia,Southern Asia,New Delhi,1417492000,3287263,INR,eng | hin | tam,.in,🇮🇳
|
||||
British Indian Ocean Territory,British Indian Ocean Territory,IO,IOT,086,Africa,Eastern Africa,Diego Garcia,0,60,USD,eng,.io,🇮🇴
|
||||
Ireland,Republic of Ireland,IE,IRL,372,Europe,Northern Europe,Dublin,5458600,70273,EUR,eng | gle,.ie,🇮🇪
|
||||
Iran,Islamic Republic of Iran,IR,IRN,364,Asia,Southern Asia,Tehran,85961000,1648195,IRR,fas,.ir | ایران.,🇮🇷
|
||||
Iraq,Republic of Iraq,IQ,IRQ,368,Asia,Western Asia,Baghdad,46118793,438317,IQD,ara | arc | ckb,.iq,🇮🇶
|
||||
Iceland,Iceland,IS,ISL,352,Europe,Northern Europe,Reykjavik,391810,103000,ISK,isl,.is,🇮🇸
|
||||
Israel,State of Israel,IL,ISR,376,Asia,Western Asia,Jerusalem,10134800,21937,ILS,ara | heb,.il,🇮🇱
|
||||
Italy,Italian Republic,IT,ITA,380,Europe,Southern Europe,Rome,58927633,301336,EUR,cat | ita,.it,🇮🇹
|
||||
Jamaica,Jamaica,JM,JAM,388,Americas,Caribbean,Kingston,2825544,10991,JMD,eng | jam,.jm,🇯🇲
|
||||
Jersey,Bailiwick of Jersey,JE,JEY,832,Europe,Northern Europe,Saint Helier,103267,116,GBP | JEP,eng | fra | nrf,.je,🇯🇪
|
||||
Jordan,Hashemite Kingdom of Jordan,JO,JOR,400,Asia,Western Asia,Amman,11734000,89342,JOD,ara,.jo | الاردن.,🇯🇴
|
||||
Japan,Japan,JP,JPN,392,Asia,Eastern Asia,Tokyo,123210000,377930,JPY,jpn,.jp | .みんな,🇯🇵
|
||||
Kazakhstan,Republic of Kazakhstan,KZ,KAZ,398,Asia,Central Asia,Astana,20426568,2724900,KZT,kaz | rus,.kz | .қаз,🇰🇿
|
||||
Kenya,Republic of Kenya,KE,KEN,404,Africa,Eastern Africa,Nairobi,53330978,580367,KES,eng | swa,.ke,🇰🇪
|
||||
Kyrgyzstan,Kyrgyz Republic,KG,KGZ,417,Asia,Central Asia,Bishkek,7281800,199951,KGS,kir | rus,.kg,🇰🇬
|
||||
Cambodia,Kingdom of Cambodia,KH,KHM,116,Asia,South-Eastern Asia,Phnom Penh,17577760,181035,KHR | USD,khm,.kh,🇰🇭
|
||||
Kiribati,Independent and Sovereign Republic of Kiribati,KI,KIR,296,Oceania,Micronesia,South Tarawa,120740,811,AUD | KID,eng | gil,.ki,🇰🇮
|
||||
Saint Kitts and Nevis,Federation of Saint Christopher and Nevis,KN,KNA,659,Americas,Caribbean,Basseterre,51320,261,XCD,eng,.kn,🇰🇳
|
||||
South Korea,Republic of Korea,KR,KOR,410,Asia,Eastern Asia,Seoul,51159889,100210,KRW,kor,.kr | .한국,🇰🇷
|
||||
Kosovo,Republic of Kosovo,XK,UNK,,Europe,Southeast Europe,Pristina,1585566,10908,EUR,sqi | srp,,🇽🇰
|
||||
Kuwait,State of Kuwait,KW,KWT,414,Asia,Western Asia,Kuwait City,4881254,17818,KWD,ara,.kw,🇰🇼
|
||||
Laos,Lao People's Democratic Republic,LA,LAO,418,Asia,South-Eastern Asia,Vientiane,7647000,236800,LAK,lao,.la,🇱🇦
|
||||
Lebanon,Lebanese Republic,LB,LBN,422,Asia,Western Asia,Beirut,5490000,10452,LBP,ara | fra,.lb,🇱🇧
|
||||
Liberia,Republic of Liberia,LR,LBR,430,Africa,Western Africa,Monrovia,5248621,111369,LRD,eng,.lr,🇱🇷
|
||||
Libya,State of Libya,LY,LBY,434,Africa,Northern Africa,Tripoli,7459000,1759540,LYD,ara,.ly,🇱🇾
|
||||
Saint Lucia,Saint Lucia,LC,LCA,662,Americas,Caribbean,Castries,184100,616,XCD,eng,.lc,🇱🇨
|
||||
Liechtenstein,Principality of Liechtenstein,LI,LIE,438,Europe,Western Europe,Vaduz,40900,160,CHF,deu,.li,🇱🇮
|
||||
Sri Lanka,Democratic Socialist Republic of Sri Lanka,LK,LKA,144,Asia,Southern Asia,Sri Jayawardenepura Kotte,21763170,65610,LKR,sin | tam,.lk | .இலங்கை | .ලංකා,🇱🇰
|
||||
Lesotho,Kingdom of Lesotho,LS,LSO,426,Africa,Southern Africa,Maseru,2116427,30355,LSL | ZAR,eng | sot,.ls,🇱🇸
|
||||
Lithuania,Republic of Lithuania,LT,LTU,440,Europe,Northern Europe,Vilnius,2894886,65300,EUR,lit,.lt,🇱🇹
|
||||
Luxembourg,Grand Duchy of Luxembourg,LU,LUX,442,Europe,Western Europe,Luxembourg,681973,2586,EUR,deu | fra | ltz,.lu,🇱🇺
|
||||
Latvia,Republic of Latvia,LV,LVA,428,Europe,Northern Europe,Riga,1829000,64559,EUR,lav,.lv,🇱🇻
|
||||
Macau,Macao Special Administrative Region of the People's Republic of China,MO,MAC,446,Asia,Eastern Asia,,685900,30,MOP,por | zho,.mo,🇲🇴
|
||||
Saint Martin,Saint Martin,MF,MAF,663,Americas,Caribbean,Marigot,31496,53,EUR,fra,.fr | .gp,🇲🇫
|
||||
Morocco,Kingdom of Morocco,MA,MAR,504,Africa,Northern Africa,Rabat,36828330,446550,MAD,ara | ber,.ma | المغرب.,🇲🇦
|
||||
Monaco,Principality of Monaco,MC,MCO,492,Europe,Western Europe,Monaco,38423,2.02,EUR,fra,.mc,🇲🇨
|
||||
Moldova,Republic of Moldova,MD,MDA,498,Europe,Eastern Europe,Chișinău,2749076,33847,MDL,ron,.md,🇲🇩
|
||||
Madagascar,Republic of Madagascar,MG,MDG,450,Africa,Eastern Africa,Antananarivo,31727042,587041,MGA,fra | mlg,.mg,🇲🇬
|
||||
Maldives,Republic of the Maldives,MV,MDV,462,Asia,Southern Asia,Malé,515132,300,MVR,div,.mv,🇲🇻
|
||||
Mexico,United Mexican States,MX,MEX,484,Americas,North America,Mexico City,130575786,1964375,MXN,spa,.mx,🇲🇽
|
||||
Marshall Islands,Republic of the Marshall Islands,MH,MHL,584,Oceania,Micronesia,Majuro,42418,181,USD,eng | mah,.mh,🇲🇭
|
||||
North Macedonia,Republic of North Macedonia,MK,MKD,807,Europe,Southeast Europe,Skopje,1822612,25713,MKD,mkd,.mk,🇲🇰
|
||||
Mali,Republic of Mali,ML,MLI,466,Africa,Western Africa,Bamako,22395489,1240192,XOF,fra,.ml,🇲🇱
|
||||
Malta,Republic of Malta,MT,MLT,470,Europe,Southern Europe,Valletta,574250,316,EUR,eng | mlt,.mt,🇲🇹
|
||||
Myanmar,Republic of the Union of Myanmar,MM,MMR,104,Asia,South-Eastern Asia,Naypyidaw,51316756,676578,MMK,mya,.mm,🇲🇲
|
||||
Montenegro,Montenegro,ME,MNE,499,Europe,Southeast Europe,Podgorica,623327,13812,EUR,cnr,.me,🇲🇪
|
||||
Mongolia,Mongolia,MN,MNG,496,Asia,Eastern Asia,Ulan Bator,3544835,1564110,MNT,mon,.mn,🇲🇳
|
||||
Northern Mariana Islands,Commonwealth of the Northern Mariana Islands,MP,MNP,580,Oceania,Micronesia,Saipan,47329,464,USD,cal | cha | eng,.mp,🇲🇵
|
||||
Mozambique,Republic of Mozambique,MZ,MOZ,508,Africa,Eastern Africa,Maputo,34090466,801590,MZN,por,.mz,🇲🇿
|
||||
Mauritania,Islamic Republic of Mauritania,MR,MRT,478,Africa,Western Africa,Nouakchott,4927532,1030700,MRU,ara,.mr,🇲🇷
|
||||
Montserrat,Montserrat,MS,MSR,500,Americas,Caribbean,Plymouth,4386,102,XCD,eng,.ms,🇲🇸
|
||||
Martinique,Martinique,MQ,MTQ,474,Americas,Caribbean,Fort-de-France,349925,1128,EUR,fra,.mq,🇲🇶
|
||||
Mauritius,Republic of Mauritius,MU,MUS,480,Africa,Eastern Africa,Port Louis,1243741,2040,MUR,eng | fra | mfe,.mu,🇲🇺
|
||||
Malawi,Republic of Malawi,MW,MWI,454,Africa,Eastern Africa,Lilongwe,20734262,118484,MWK,eng | nya,.mw,🇲🇼
|
||||
Malaysia,Malaysia,MY,MYS,458,Asia,South-Eastern Asia,Kuala Lumpur,34231700,330803,MYR,eng | msa,.my,🇲🇾
|
||||
Mayotte,Department of Mayotte,YT,MYT,175,Africa,Eastern Africa,Mamoudzou,320901,374,EUR,fra,.yt,🇾🇹
|
||||
Namibia,Republic of Namibia,NA,NAM,516,Africa,Southern Africa,Windhoek,3022401,825615,NAD | ZAR,afr | deu | eng | her | hgm | kwn | loz | ndo | tsn,.na,🇳🇦
|
||||
New Caledonia,New Caledonia,NC,NCL,540,Oceania,Melanesia,Nouméa,264596,18575,XPF,fra,.nc,🇳🇨
|
||||
Niger,Republic of Niger,NE,NER,562,Africa,Western Africa,Niamey,26312034,1267000,XOF,fra,.ne,🇳🇪
|
||||
Norfolk Island,Territory of Norfolk Island,NF,NFK,574,Oceania,Australia and New Zealand,Kingston,2188,36,AUD,eng | pih,.nf,🇳🇫
|
||||
Nigeria,Federal Republic of Nigeria,NG,NGA,566,Africa,Western Africa,Abuja,223800000,923768,NGN,eng,.ng,🇳🇬
|
||||
Nicaragua,Republic of Nicaragua,NI,NIC,558,Americas,Central America,Managua,6803886,130373,NIO,spa,.ni,🇳🇮
|
||||
Niue,Niue,NU,NIU,570,Oceania,Polynesia,Alofi,1681,260,NZD,eng | niu,.nu,🇳🇺
|
||||
Netherlands,Kingdom of the Netherlands,NL,NLD,528,Europe,Western Europe,Amsterdam,18100436,41865,EUR,nld,.nl,🇳🇱
|
||||
Norway,Kingdom of Norway,NO,NOR,578,Europe,Northern Europe,Oslo,5606944,386224,NOK,nno | nob | smi,.no,🇳🇴
|
||||
Nepal,Federal Democratic Republic of Nepal,NP,NPL,524,Asia,Southern Asia,Kathmandu,29911840,147181,NPR,nep,.np,🇳🇵
|
||||
Nauru,Republic of Nauru,NR,NRU,520,Oceania,Micronesia,Yaren,11680,21,AUD,eng | nau,.nr,🇳🇷
|
||||
New Zealand,New Zealand,NZ,NZL,554,Oceania,Australia and New Zealand,Wellington,5324700,268838,NZD,eng | mri | nzs,.nz,🇳🇿
|
||||
Oman,Sultanate of Oman,OM,OMN,512,Asia,Western Asia,Muscat,5343630,309500,OMR,ara,.om,🇴🇲
|
||||
Pakistan,Islamic Republic of Pakistan,PK,PAK,586,Asia,Southern Asia,Islamabad,241499431,796095,PKR,eng | urd,.pk,🇵🇰
|
||||
Panama,Republic of Panama,PA,PAN,591,Americas,Central America,Panama City,4064780,75417,PAB | USD,spa,.pa,🇵🇦
|
||||
Pitcairn Islands,Pitcairn Group of Islands,PN,PCN,612,Oceania,Polynesia,Adamstown,35,47,NZD,eng,.pn,🇵🇳
|
||||
Peru,Republic of Peru,PE,PER,604,Americas,South America,Lima,34350244,1285216,PEN,aym | que | spa,.pe,🇵🇪
|
||||
Philippines,Republic of the Philippines,PH,PHL,608,Asia,South-Eastern Asia,Manila,114123600,342353,PHP,eng | fil,.ph,🇵🇭
|
||||
Palau,Republic of Palau,PW,PLW,585,Oceania,Micronesia,Ngerulmud,16733,459,USD,eng | pau,.pw,🇵🇼
|
||||
Papua New Guinea,Independent State of Papua New Guinea,PG,PNG,598,Oceania,Melanesia,Port Moresby,11781559,462840,PGK,eng | hmo | tpi,.pg,🇵🇬
|
||||
Poland,Republic of Poland,PL,POL,616,Europe,Central Europe,Warsaw,37392000,312679,PLN,pol,.pl,🇵🇱
|
||||
Puerto Rico,Commonwealth of Puerto Rico,PR,PRI,630,Americas,Caribbean,San Juan,3203295,8870,USD,eng | spa,.pr,🇵🇷
|
||||
North Korea,Democratic People's Republic of Korea,KP,PRK,408,Asia,Eastern Asia,Pyongyang,25950000,120538,KPW,kor,.kp,🇰🇵
|
||||
Portugal,Portuguese Republic,PT,PRT,620,Europe,Southern Europe,Lisbon,10749635,92090,EUR,por,.pt,🇵🇹
|
||||
Paraguay,Republic of Paraguay,PY,PRY,600,Americas,South America,Asunción,6109644,406752,PYG,grn | spa,.py,🇵🇾
|
||||
Palestine,State of Palestine,PS,PSE,275,Asia,Western Asia,Ramallah | Jerusalem,5483450,6220,EGP | ILS | JOD,ara,.ps | فلسطين.,🇵🇸
|
||||
French Polynesia,French Polynesia,PF,PYF,258,Oceania,Polynesia,Papeetē,279500,4167,XPF,fra,.pf,🇵🇫
|
||||
Qatar,State of Qatar,QA,QAT,634,Asia,Western Asia,Doha,3173024,11586,QAR,ara,.qa | قطر.,🇶🇦
|
||||
Réunion,Réunion Island,RE,REU,638,Africa,Eastern Africa,Saint-Denis,896175,2511,EUR,fra,.re,🇷🇪
|
||||
Romania,Romania,RO,ROU,642,Europe,Southeast Europe,Bucharest,19036031,238391,RON,ron,.ro,🇷🇴
|
||||
Russia,Russian Federation,RU,RUS,643,Europe,Eastern Europe,Moscow,146028325,17098246,RUB,rus,.ru | .su | .рф,🇷🇺
|
||||
Rwanda,Republic of Rwanda,RW,RWA,646,Africa,Eastern Africa,Kigali,14104969,26338,RWF,eng | fra | kin,.rw,🇷🇼
|
||||
Saudi Arabia,Kingdom of Saudi Arabia,SA,SAU,682,Asia,Western Asia,Riyadh,35300280,2149690,SAR,ara,.sa | .السعودية,🇸🇦
|
||||
Sudan,Republic of the Sudan,SD,SDN,729,Africa,Northern Africa,Khartoum,51662000,1886068,SDG,ara | eng,.sd,🇸🇩
|
||||
Senegal,Republic of Senegal,SN,SEN,686,Africa,Western Africa,Dakar,18593258,196722,XOF,fra,.sn,🇸🇳
|
||||
Singapore,Republic of Singapore,SG,SGP,702,Asia,South-Eastern Asia,Singapore,6110200,710,SGD,eng | msa | tam | zho,.sg | .新加坡 | .சிங்கப்பூர்,🇸🇬
|
||||
South Georgia,South Georgia and the South Sandwich Islands,GS,SGS,239,Antarctic,,King Edward Point,0,3903,GBP,eng,.gs,🇬🇸
|
||||
Svalbard and Jan Mayen,Svalbard og Jan Mayen,SJ,SJM,744,Europe,Northern Europe,Longyearbyen,2530,61399,NOK,nor,.sj,🇸🇯
|
||||
Solomon Islands,Solomon Islands,SB,SLB,090,Oceania,Melanesia,Honiara,750325,28896,SBD,eng,.sb,🇸🇧
|
||||
Sierra Leone,Republic of Sierra Leone,SL,SLE,694,Africa,Western Africa,Freetown,9077691,71740,SLE,eng,.sl,🇸🇱
|
||||
El Salvador,Republic of El Salvador,SV,SLV,222,Americas,Central America,San Salvador,6029976,21041,USD,spa,.sv,🇸🇻
|
||||
San Marino,Republic of San Marino,SM,SMR,674,Europe,Southern Europe,City of San Marino,34132,61,EUR,ita,.sm,🇸🇲
|
||||
Somalia,Federal Republic of Somalia,SO,SOM,706,Africa,Eastern Africa,Mogadishu,19655000,637657,SOS,ara | som,.so,🇸🇴
|
||||
Saint Pierre and Miquelon,Saint Pierre and Miquelon,PM,SPM,666,Americas,North America,Saint-Pierre,5819,242,EUR,fra,.pm,🇵🇲
|
||||
Serbia,Republic of Serbia,RS,SRB,688,Europe,Southeast Europe,Belgrade,6567783,77589,RSD,srp,.rs | .срб,🇷🇸
|
||||
South Sudan,Republic of South Sudan,SS,SSD,728,Africa,Middle Africa,Juba,15786898,619745,SSP,eng,.ss,🇸🇸
|
||||
São Tomé and Príncipe,Democratic Republic of São Tomé and Príncipe,ST,STP,678,Africa,Middle Africa,São Tomé,209607,964,STN,por,.st,🇸🇹
|
||||
Suriname,Republic of Suriname,SR,SUR,740,Americas,South America,Paramaribo,616500,163820,SRD,nld,.sr,🇸🇷
|
||||
Slovakia,Slovak Republic,SK,SVK,703,Europe,Central Europe,Bratislava,5413813,49037,EUR,slk,.sk,🇸🇰
|
||||
Slovenia,Republic of Slovenia,SI,SVN,705,Europe,Central Europe,Ljubljana,2130638,20273,EUR,slv,.si,🇸🇮
|
||||
Sweden,Kingdom of Sweden,SE,SWE,752,Europe,Northern Europe,Stockholm,10605098,450295,SEK,swe,.se,🇸🇪
|
||||
Eswatini,Kingdom of Eswatini,SZ,SWZ,748,Africa,Southern Africa,Mbabane,1235549,17364,SZL | ZAR,eng | ssw,.sz,🇸🇿
|
||||
Sint Maarten,Sint Maarten,SX,SXM,534,Americas,Caribbean,Philipsburg,41349,34,ANG,eng | fra | nld,.sx,🇸🇽
|
||||
Seychelles,Republic of Seychelles,SC,SYC,690,Africa,Eastern Africa,Victoria,122729,452,SCR,crs | eng | fra,.sc,🇸🇨
|
||||
Syria,Syrian Arab Republic,SY,SYR,760,Asia,Western Asia,Damascus,25620000,185180,SYP,ara,.sy | سوريا.,🇸🇾
|
||||
Turks and Caicos Islands,Turks and Caicos Islands,TC,TCA,796,Americas,Caribbean,Cockburn Town,50828,948,USD,eng,.tc,🇹🇨
|
||||
Chad,Republic of Chad,TD,TCD,148,Africa,Middle Africa,N'Djamena,19340757,1284000,XAF,ara | fra,.td,🇹🇩
|
||||
Togo,Togolese Republic,TG,TGO,768,Africa,Western Africa,Lomé,8095498,56785,XOF,fra,.tg,🇹🇬
|
||||
Thailand,Kingdom of Thailand,TH,THA,764,Asia,South-Eastern Asia,Bangkok,65859640,513120,THB,tha,.th | .ไทย,🇹🇭
|
||||
Tajikistan,Republic of Tajikistan,TJ,TJK,762,Asia,Central Asia,Dushanbe,10499000,143100,TJS,rus | tgk,.tj,🇹🇯
|
||||
Tokelau,Tokelau,TK,TKL,772,Oceania,Polynesia,Fakaofo,2608,12,NZD,eng | smo | tkl,.tk,🇹🇰
|
||||
Turkmenistan,Turkmenistan,TM,TKM,795,Asia,Central Asia,Ashgabat,7057841,488100,TMT,rus | tuk,.tm,🇹🇲
|
||||
Timor-Leste,Democratic Republic of Timor-Leste,TL,TLS,626,Asia,South-Eastern Asia,Dili,1391221,14874,USD,por | tet,.tl,🇹🇱
|
||||
Tonga,Kingdom of Tonga,TO,TON,776,Oceania,Polynesia,Nuku'alofa,100179,747,TOP,eng | ton,.to,🇹🇴
|
||||
Trinidad and Tobago,Republic of Trinidad and Tobago,TT,TTO,780,Americas,Caribbean,Port of Spain,1367764,5130,TTD,eng,.tt,🇹🇹
|
||||
Tunisia,Tunisian Republic,TN,TUN,788,Africa,Northern Africa,Tunis,11972169,163610,TND,ara,.tn,🇹🇳
|
||||
Turkey,Republic of Turkey,TR,TUR,792,Asia,Western Asia,Ankara,85664944,783562,TRY,tur,.tr,🇹🇷
|
||||
Tuvalu,Tuvalu,TV,TUV,798,Oceania,Polynesia,Funafuti,10643,26,AUD | TVD,eng | tvl,.tv,🇹🇻
|
||||
Taiwan,Republic of China (Taiwan),TW,TWN,158,Asia,Eastern Asia,Taipei,23317031,36197,TWD,zho,.tw | .台灣 | .台湾,🇹🇼
|
||||
Tanzania,United Republic of Tanzania,TZ,TZA,834,Africa,Eastern Africa,Dodoma,68153004,947303,TZS,eng | swa,.tz,🇹🇿
|
||||
Uganda,Republic of Uganda,UG,UGA,800,Africa,Eastern Africa,Kampala,45905417,241550,UGX,eng | swa,.ug,🇺🇬
|
||||
Ukraine,Ukraine,UA,UKR,804,Europe,Eastern Europe,Kyiv,32862000,603550,UAH,ukr,.ua | .укр,🇺🇦
|
||||
United States Minor Outlying Islands,United States Minor Outlying Islands,UM,UMI,581,Americas,North America,Washington DC,0,34.2,USD,eng,.us,🇺🇲
|
||||
Uruguay,Oriental Republic of Uruguay,UY,URY,858,Americas,South America,Montevideo,3499451,181034,UYU,spa,.uy,🇺🇾
|
||||
United States,United States of America,US,USA,840,Americas,North America,"Washington, D.C.",340110988,9525067,USD,eng,.us,🇺🇸
|
||||
Uzbekistan,Republic of Uzbekistan,UZ,UZB,860,Asia,Central Asia,Tashkent,37859698,447400,UZS,rus | uzb,.uz,🇺🇿
|
||||
Vatican City,Vatican City State,VA,VAT,336,Europe,Southern Europe,Vatican City,882,0.49,EUR,ita | lat,.va,🇻🇦
|
||||
Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,VC,VCT,670,Americas,Caribbean,Kingstown,110872,389,XCD,eng,.vc,🇻🇨
|
||||
Venezuela,Bolivarian Republic of Venezuela,VE,VEN,862,Americas,South America,Caracas,28517000,916445,VES,spa,.ve,🇻🇪
|
||||
British Virgin Islands,Virgin Islands,VG,VGB,092,Americas,Caribbean,Road Town,39471,151,USD,eng,.vg,🇻🇬
|
||||
United States Virgin Islands,Virgin Islands of the United States,VI,VIR,850,Americas,Caribbean,Charlotte Amalie,87146,347,USD,eng,.vi,🇻🇮
|
||||
Vietnam,Socialist Republic of Vietnam,VN,VNM,704,Asia,South-Eastern Asia,Hanoi,101343800,331212,VND,vie,.vn,🇻🇳
|
||||
Vanuatu,Republic of Vanuatu,VU,VUT,548,Oceania,Melanesia,Port Vila,321409,12189,VUV,bis | eng | fra,.vu,🇻🇺
|
||||
Wallis and Futuna,Territory of the Wallis and Futuna Islands,WF,WLF,876,Oceania,Polynesia,Mata-Utu,11620,142,XPF,fra,.wf,🇼🇫
|
||||
Samoa,Independent State of Samoa,WS,WSM,882,Oceania,Polynesia,Apia,205557,2842,WST,eng | smo,.ws,🇼🇸
|
||||
Yemen,Republic of Yemen,YE,YEM,887,Asia,Western Asia,Sana'a,32684503,527968,YER,ara,.ye,🇾🇪
|
||||
South Africa,Republic of South Africa,ZA,ZAF,710,Africa,Southern Africa,Pretoria | Bloemfontein | Cape Town,63100945,1221037,ZAR,afr | eng | nbl | nso | sot | ssw | tsn | tso | ven | xho | zul,.za,🇿🇦
|
||||
Zambia,Republic of Zambia,ZM,ZMB,894,Africa,Eastern Africa,Lusaka,19693423,752612,ZMW,eng,.zm,🇿🇲
|
||||
Zimbabwe,Republic of Zimbabwe,ZW,ZWE,716,Africa,Southern Africa,Harare,17073087,390757,ZWL,bwg | eng | kck | khi | ndc | nde | nya | sna | sot | toi | tsn | tso | ven | xho | zib,.zw,🇿🇼
|
||||
|
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
"""extract_author_census.py
|
||||
|
||||
Extract-lane artifact: per-author commit census of the troupe repository.
|
||||
|
||||
Source (real tool call): `git -C /root/troupe-standup log --format=%an`
|
||||
aggregated with a stdlib Counter. No LLM summarization, no fabricated rows.
|
||||
|
||||
Output: 2026-11-02-author-census.csv (rank,author,commits)
|
||||
"""
|
||||
import csv
|
||||
import subprocess
|
||||
from collections import Counter
|
||||
|
||||
REPO = "/root/troupe-standup"
|
||||
OUT = "/root/troupe-standup/wizard-work/ledger/2026-11-02-author-census.csv"
|
||||
TOP_N = 20
|
||||
|
||||
|
||||
def main():
|
||||
out = subprocess.run(
|
||||
["git", "-C", REPO, "log", "--format=%an"],
|
||||
check=True, capture_output=True, text=True,
|
||||
).stdout
|
||||
|
||||
counts = Counter(out.splitlines())
|
||||
total = sum(counts.values())
|
||||
distinct = len(counts)
|
||||
|
||||
rows = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))[:TOP_N]
|
||||
|
||||
with open(OUT, "w", newline="") as fh:
|
||||
w = csv.writer(fh)
|
||||
w.writerow(["rank", "author", "commits"])
|
||||
for i, (author, n) in enumerate(rows, start=1):
|
||||
w.writerow([i, author, n])
|
||||
|
||||
print(f"total commits : {total}")
|
||||
print(f"distinct authors: {distinct}")
|
||||
print(f"rows written : {len(rows)} -> {OUT}")
|
||||
print("top 5:")
|
||||
for author, n in rows[:5]:
|
||||
print(f" {n:>5} {author}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Flatten the REST Countries v3.1 dataset into a clean, flat table.
|
||||
|
||||
Usage:
|
||||
python3 extract_countries.py <source_json> <output_csv>
|
||||
|
||||
Source (raw, from the REST Countries repository):
|
||||
https://raw.githubusercontent.com/restcountries/restcountries/master/src/main/resources/countriesV3.1.json
|
||||
The JSON is an array of 250 country records; this script flattens every record
|
||||
to one CSV row with the fixed 14-column contract below.
|
||||
|
||||
Columns (order):
|
||||
name_common | name_official | alpha2 | alpha3 | numeric |
|
||||
region | subregion | capital | population | area_km2 |
|
||||
currencies | languages | tlds | flag
|
||||
"""
|
||||
import csv
|
||||
import json
|
||||
import sys
|
||||
|
||||
|
||||
def as_text(value):
|
||||
"""Empty string for None/empty, plain str otherwise."""
|
||||
if value is None or value == '':
|
||||
return ''
|
||||
return str(value)
|
||||
|
||||
|
||||
def list_join(value):
|
||||
"""Join a list of strings with ' | '; empty string for None."""
|
||||
if value is None:
|
||||
return ''
|
||||
return ' | '.join(str(item) for item in value)
|
||||
|
||||
|
||||
def currency_codes(currencies):
|
||||
if not isinstance(currencies, dict):
|
||||
return ''
|
||||
return ' | '.join(sorted(currencies.keys()))
|
||||
|
||||
|
||||
def language_codes(languages):
|
||||
if not isinstance(languages, dict):
|
||||
return ''
|
||||
return ' | '.join(sorted(languages.keys()))
|
||||
|
||||
|
||||
def flatten(record):
|
||||
name = record.get('name') or {}
|
||||
return [
|
||||
as_text(name.get('common')), # name_common
|
||||
as_text(name.get('official')), # name_official
|
||||
as_text(record.get('cca2')), # alpha2
|
||||
as_text(record.get('cca3')), # alpha3
|
||||
as_text(record.get('ccn3')), # numeric
|
||||
as_text(record.get('region')), # region
|
||||
as_text(record.get('subregion')), # subregion
|
||||
list_join(record.get('capital')), # capital
|
||||
as_text(record.get('population')), # population
|
||||
as_text(record.get('area')), # area_km2
|
||||
currency_codes(record.get('currencies')), # currencies
|
||||
language_codes(record.get('languages')), # languages
|
||||
list_join(record.get('tld')), # tlds
|
||||
as_text(record.get('flag')), # flag
|
||||
]
|
||||
|
||||
|
||||
HEADERS = [
|
||||
'name_common', 'name_official', 'alpha2', 'alpha3', 'numeric',
|
||||
'region', 'subregion', 'capital', 'population', 'area_km2',
|
||||
'currencies', 'languages', 'tlds', 'flag',
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
sys.stderr.write('usage: extract_countries.py <source_json> <output_csv>\n')
|
||||
return 2
|
||||
source_path, out_path = sys.argv[1], sys.argv[2]
|
||||
try:
|
||||
with open(source_path, encoding='utf-8') as fh:
|
||||
records = json.load(fh)
|
||||
except (OSError, ValueError) as exc:
|
||||
sys.stderr.write('cannot read source %s: %s\n' % (source_path, exc))
|
||||
return 1
|
||||
if not isinstance(records, list):
|
||||
sys.stderr.write('source JSON is not a list\n')
|
||||
return 1
|
||||
with open(out_path, 'w', encoding='utf-8', newline='') as fh:
|
||||
writer = csv.writer(fh, lineterminator='\n')
|
||||
writer.writerow(HEADERS)
|
||||
for record in records:
|
||||
writer.writerow(flatten(record))
|
||||
print('records_in: %d' % len(records))
|
||||
print('wrote: %s' % out_path)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env python3
|
||||
# Verify 2026-11-02 commit census by author (top 15).
|
||||
#
|
||||
# Exits 0 iff the committed CSV at wizard-work/ledger/2026-11-02-commit-census-by-author.csv
|
||||
# matches a clean re-derivation from git (recompute -> sort -> head -15) field-for-field,
|
||||
# and the repo's rev-list count matches the sum of the re-derived rows.
|
||||
# Exit code IS the verdict: 0 pass, nonzero fault.
|
||||
import csv
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
REPO = "/root/troupe-standup"
|
||||
CSV_PATH = "wizard-work/ledger/2026-11-02-commit-census-by-author.csv"
|
||||
|
||||
|
||||
def git(*args):
|
||||
return subprocess.run(
|
||||
["git", "-C", REPO] + list(args), check=True, capture_output=True, text=True
|
||||
).stdout
|
||||
|
||||
|
||||
def recompute_top15():
|
||||
out = git("log", "--format=%aN")
|
||||
counts = {}
|
||||
for line in out.splitlines():
|
||||
name = line.strip()
|
||||
if name:
|
||||
counts[name] = counts.get(name, 0) + 1
|
||||
return sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))[:15]
|
||||
|
||||
|
||||
def main():
|
||||
expected = recompute_top15()
|
||||
total = git("rev-list", "--count", "HEAD").strip()
|
||||
|
||||
with open(CSV_PATH, newline="") as fh:
|
||||
rows = list(csv.DictReader(fh))
|
||||
|
||||
problems = []
|
||||
if len(rows) != len(expected):
|
||||
problems.append("row count %d != expected %d" % (len(rows), len(expected)))
|
||||
|
||||
for i, (row, (name, cnt)) in enumerate(zip(rows, expected), start=1):
|
||||
want = "%d,%s,%d" % (i, name, cnt)
|
||||
got = "%s,%s,%s" % (row.get("rank"), row.get("author"), row.get("commits"))
|
||||
if want != got:
|
||||
problems.append("row %d: want %s got %s" % (i, want, got))
|
||||
|
||||
if problems:
|
||||
print("FAIL")
|
||||
for p in problems:
|
||||
print(" -", p)
|
||||
sys.exit(1)
|
||||
|
||||
print("PASS: top-15 author census matches git re-derivation; total=%s" % total)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Independent cross-check: extracted CSV vs the raw source JSON.
|
||||
|
||||
Usage:
|
||||
python3 verify_extraction.py <source_json> <csv_path>
|
||||
|
||||
Verifies that every source record appears exactly once in the CSV:
|
||||
- row count equals the source record count
|
||||
- alpha-2 code sets match exactly
|
||||
- name_common values match for every row
|
||||
|
||||
Exits 0 only if all checks pass. Evidence, not the formal gate.
|
||||
"""
|
||||
import csv
|
||||
import json
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
sys.stderr.write('usage: verify_extraction.py <source_json> <csv_path>\n')
|
||||
return 2
|
||||
source_path, csv_path = sys.argv[1], sys.argv[2]
|
||||
try:
|
||||
with open(source_path, encoding='utf-8') as fh:
|
||||
records = json.load(fh)
|
||||
except (OSError, ValueError) as exc:
|
||||
sys.stderr.write('cannot read source %s: %s\n' % (source_path, exc))
|
||||
return 1
|
||||
if not isinstance(records, list):
|
||||
sys.stderr.write('source JSON is not a list\n')
|
||||
return 1
|
||||
|
||||
source = {}
|
||||
for rec in records:
|
||||
code = str(rec.get('cca2')) if rec.get('cca2') else None
|
||||
name = str((rec.get('name') or {}).get('common')) if rec.get('name') else ''
|
||||
if code:
|
||||
source[code] = name
|
||||
|
||||
try:
|
||||
with open(csv_path, encoding='utf-8') as fh:
|
||||
rows = list(csv.reader(fh))
|
||||
except OSError as exc:
|
||||
sys.stderr.write('cannot read csv %s: %s\n' % (csv_path, exc))
|
||||
return 1
|
||||
if not rows:
|
||||
sys.stderr.write('csv is empty\n')
|
||||
return 1
|
||||
header, data = rows[0], rows[1:]
|
||||
problems = []
|
||||
if len(data) != len(source):
|
||||
problems.append('row count %d != source count %d'
|
||||
% (len(data), len(source)))
|
||||
|
||||
csv_codes = {}
|
||||
for row in data:
|
||||
if len(row) != 14:
|
||||
problems.append('row with %d fields: %r' % (len(row), row))
|
||||
continue
|
||||
csv_codes[row[2]] = row[0]
|
||||
|
||||
missing = sorted(set(source) - set(csv_codes))
|
||||
extra = sorted(set(csv_codes) - set(source))
|
||||
if missing:
|
||||
problems.append('alpha-2 missing from csv: %r' % missing)
|
||||
if extra:
|
||||
problems.append('alpha-2 extra in csv: %r' % extra)
|
||||
mismatches = [c for c in source if csv_codes.get(c) != source[c]]
|
||||
if mismatches:
|
||||
problems.append('name_common mismatches: %r' % mismatches)
|
||||
|
||||
if problems:
|
||||
sys.stderr.write('VERIFY FAILED\n')
|
||||
for problem in problems:
|
||||
sys.stderr.write(' - %s\n' % problem)
|
||||
return 1
|
||||
print('verify: ok rows=%d codes=%d source=%d header=%r'
|
||||
% (len(data), len(csv_codes), len(source), header))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
@@ -1,120 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
# CHECK-quill-draft-compliance (lane copy) -- delegates to the repository gate.
|
||||
#
|
||||
# WHAT THIS FILE USED TO BE, AND WHY IT IS NOT ANY MORE (Q154)
|
||||
# It was a second, independent implementation of the same gate: a bash script
|
||||
# with a `python3 -` heredoc that scanned the lane through the absolute path
|
||||
# /root/troupe-standup/wizard-work/quill, appended a row read from
|
||||
# /root/.hermes/wizard-outputs/quill/ (a file outside the repository), and
|
||||
# regenerated the table WITHOUT its header line so that its `diff` would read
|
||||
# clean -- which is why the committed table at HEAD had 82 rows and no header.
|
||||
# Two implementations of one gate is also why the tree carried two different
|
||||
# verdicts for the same artifact.
|
||||
#
|
||||
# There is now exactly one gate, at the repository root, and this path is a
|
||||
# pointer to it: same legs, same exit codes, no second rule list, no host
|
||||
# path. Arguments are passed through.
|
||||
#
|
||||
# Exit codes are the root gate's: 0 all legs passed, 1 a fault, 2 ungradable.
|
||||
set -u
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$SCRIPT_DIR"
|
||||
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit 2
|
||||
ROOT="$(cd "$HERE/../.." && pwd)" || exit 2
|
||||
GATE="$ROOT/CHECK-quill-draft-compliance"
|
||||
|
||||
TSV="$PROJECT_ROOT/draft-compliance-report-2026-10-31.tsv"
|
||||
REPORT="$PROJECT_ROOT/draft-verification-report-2026-11-01.md"
|
||||
|
||||
if [[ ! -f "$TSV" ]]; then
|
||||
echo "Missing TSV: $TSV"
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -f "$REPORT" ]]; then
|
||||
echo "Missing report: $REPORT"
|
||||
exit 1
|
||||
if [ ! -f "$GATE" ]; then
|
||||
echo "delegation target missing: $GATE" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Generate fresh TSV using Python
|
||||
FRESH=$(mktemp)
|
||||
python3 - "$FRESH" <<'PY'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
wizard_work = Path("/root/troupe-standup/wizard-work/quill")
|
||||
exclude = {"draft-compliance-report-2026-10-31.md", "draft-verification-report-2026-11-01.md"}
|
||||
verification_report = "draft-verification-report-2026-11-01.md"
|
||||
rows = []
|
||||
for p in sorted(wizard_work.glob("*.md")):
|
||||
if p.name in exclude:
|
||||
continue
|
||||
rel = p.name
|
||||
lines = p.read_text(errors="replace").splitlines()
|
||||
line_count = len(lines)
|
||||
has_verdict = any(l.strip().startswith("VERDICT:") for l in lines)
|
||||
has_check = any(l.strip().startswith("CHECK:") for l in lines)
|
||||
bare_cmd = ""
|
||||
for l in lines:
|
||||
s = l.strip()
|
||||
if s.startswith("CHECK:"):
|
||||
bare_cmd = s[len("CHECK:"):].strip()
|
||||
break
|
||||
rows.append((rel, line_count, has_verdict, has_check, bool(bare_cmd), bare_cmd))
|
||||
|
||||
# Include verification report
|
||||
report_path = Path("/root/.hermes/wizard-outputs/quill/draft-verification-report-2026-11-01.md")
|
||||
if report_path.exists():
|
||||
lines = report_path.read_text(errors="replace").splitlines()
|
||||
line_count = len(lines)
|
||||
has_verdict = any(l.strip().startswith("VERDICT:") for l in lines)
|
||||
has_check = any(l.strip().startswith("CHECK:") for l in lines)
|
||||
bare_cmd = ""
|
||||
for l in lines:
|
||||
s = l.strip()
|
||||
if s.startswith("CHECK:"):
|
||||
bare_cmd = s[len("CHECK:"):].strip()
|
||||
break
|
||||
rows.append((verification_report, line_count, has_verdict, has_check, bool(bare_cmd), bare_cmd))
|
||||
|
||||
rows.sort(key=lambda r: r[0])
|
||||
with open(sys.argv[1], "w") as f:
|
||||
f.write(f"# measured {len(rows)} markdown files\n")
|
||||
for rel, lc, hv, hc, hbc, cmd in rows:
|
||||
f.write(f"{rel}\t{lc}\t{hv}\t{hc}\t{hbc}\t{cmd}\n")
|
||||
PY
|
||||
|
||||
if ! diff -u "$TSV" "$FRESH" > /dev/null; then
|
||||
echo "TSV mismatch"
|
||||
diff -u "$TSV" "$FRESH" | head -20
|
||||
rm -f "$FRESH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify report summary numbers match TSV
|
||||
pop=$(grep -oP 'Total `\.md` drafts scanned\s*\|\s*\K\d+' "$REPORT" || true)
|
||||
verdict=$(grep -oP 'Drafts with `VERDICT:`\s*\|\s*\K\d+' "$REPORT" || true)
|
||||
check=$(grep -oP 'Drafts with `CHECK:`\s*\|\s*\K\d+' "$REPORT" || true)
|
||||
bare=$(grep -oP 'Drafts with a bare `CHECK:` command\s*\|\s*\K\d+' "$REPORT" || true)
|
||||
failing=$(grep -oP 'Drafts failing at least one column\s*\|\s*\K\d+' "$REPORT" || true)
|
||||
|
||||
tsv_pop=$(tail -n +2 "$TSV" | wc -l)
|
||||
tsv_verdict=$(awk -F'\t' '$3 == "True" {count++} END {print count+0}' "$TSV")
|
||||
tsv_check=$(awk -F'\t' '$4 == "True" {count++} END {print count+0}' "$TSV")
|
||||
tsv_bare=$(awk -F'\t' '$5 == "True" {count++} END {print count+0}' "$TSV")
|
||||
tsv_failing=$(awk -F'\t' 'NR>1 && ($3 != "True" || $5 != "True") {count++} END {print count+0}' "$TSV")
|
||||
|
||||
if [[ "$pop" != "$tsv_pop" ]]; then
|
||||
echo "Population mismatch: report=$pop, tsv=$tsv_pop"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$verdict" != "$tsv_verdict" ]]; then
|
||||
echo "Verdict count mismatch: report=$verdict, tsv=$tsv_verdict"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$check" != "$tsv_check" ]]; then
|
||||
echo "Check count mismatch: report=$check, tsv=$tsv_check"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$bare" != "$tsv_bare" ]]; then
|
||||
echo "Bare check mismatch: report=$bare, tsv=$tsv_bare"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$failing" != "$tsv_failing" ]]; then
|
||||
echo "Failing mismatch: report=$failing, tsv=$tsv_failing"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify report has VERDICT and CHECK lines
|
||||
if ! grep -q '^VERDICT:' "$REPORT"; then
|
||||
echo "Report missing VERDICT line"
|
||||
exit 1
|
||||
fi
|
||||
if ! grep -q '^CHECK:' "$REPORT"; then
|
||||
echo "Report missing CHECK line"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -f "$FRESH"
|
||||
echo "All checks passed"
|
||||
exit 0
|
||||
exec bash "$GATE" "$@"
|
||||
@@ -0,0 +1,14 @@
|
||||
# The revision this census describes.
|
||||
#
|
||||
# draft-compliance-report-2026-10-31 is a SNAPSHOT. It counts the .md drafts in
|
||||
# this lane as they stood at `rev`, and says nothing about a later tree. The
|
||||
# verifier materialises the lane at `rev` (git archive) and grades the committed
|
||||
# table and report against THOSE bytes, so a draft added tomorrow is drift to
|
||||
# report, not a fault of this census. The live tree is still graded on demand
|
||||
# with `--worktree`.
|
||||
#
|
||||
# `tsv` is the sha256 of the committed table. A pin is moved deliberately:
|
||||
# re-derive the table, rewrite this file, commit both together. The verifier
|
||||
# reads this file; it does not guess.
|
||||
rev 2f8ef83df22b25f67f092f07d2d37d7891f116d4
|
||||
tsv 74d092b4eef3cd1c6f9aaca74c2e5caa4a9232561f97fa07622d8e3ade285b17
|
||||
@@ -34,6 +34,10 @@ import shlex
|
||||
# the table it publishes).
|
||||
ARTIFACT_MD = "draft-compliance-report-2026-10-31.md"
|
||||
ARTIFACT_TSV = "draft-compliance-report-2026-10-31.tsv"
|
||||
# The revision the artifact describes, and the digest of its committed bytes.
|
||||
# A dated census describes a tree; without the pin it silently starts describing
|
||||
# a later one (Q154: 8 drafts landed after this table and it read red for it).
|
||||
ARTIFACT_PIN = "draft-compliance-report-2026-10-31.pin"
|
||||
|
||||
COLUMNS = ("filename", "lines", "has_verdict", "has_check", "check_clean",
|
||||
"check_command")
|
||||
|
||||
@@ -10,6 +10,21 @@ WHAT IT GRADES, AND AGAINST WHAT
|
||||
the report's Evidence table against the counts it just measured, so a stale
|
||||
numeral in the prose is a fault rather than a reader's problem.
|
||||
|
||||
WHICH TREE -- three modes, because a dated census describes a revision
|
||||
(default) the lane as it stands at the pin in
|
||||
`draft-compliance-report-2026-10-31.pin`, extracted with
|
||||
`git archive`; the committed TSV and report are graded against
|
||||
it. Drift since the pin is printed as a note, never a fault.
|
||||
--worktree the live worktree; this is the "is the census current?" reading
|
||||
and it faults on any difference, additions included.
|
||||
--rev REV the lane at REV, for probing whether a given tree's census is
|
||||
true and for grading an older landing.
|
||||
|
||||
Why: the 2026-10-31 table was byte-true at 2f8ef83 and read red at HEAD for
|
||||
eight drafts that landed after it -- a snapshot cannot be graded against a
|
||||
tree it never described. And the fix must not be "grade nothing": the pin is
|
||||
what makes the claim falsifiable (Q154).
|
||||
|
||||
Paths come from THIS FILE's location. The 2026-10-31 version hardcoded an
|
||||
absolute home-directory path in both the scanner and the verifier, so a
|
||||
clone's CHECK graded the host's tree and a mutated copy of the committed TSV
|
||||
@@ -17,13 +32,16 @@ WHAT IT GRADES, AND AGAINST WHAT
|
||||
class, because this file's own fix must not reintroduce it.
|
||||
|
||||
EXIT CODES -- the archive's convention
|
||||
0 the TSV and the report re-derive from the tree
|
||||
1 a fault: a row, a file-set entry or a reported count disagrees
|
||||
2 could not grade: the report or TSV is missing/unreadable, or the lane
|
||||
directory does not exist. Never a pass.
|
||||
0 the TSV and the report re-derive from the tree they describe
|
||||
1 a fault: a row, a file-set entry or a reported count disagrees, or the
|
||||
committed TSV is not the bytes the pin names
|
||||
2 could not grade: the report, the TSV or the pin is missing/unreadable, the
|
||||
pin names no rev, the rev cannot be extracted, or the repository root
|
||||
cannot be found. Never a pass.
|
||||
|
||||
--selftest runs the cells in a temp tree: one green control and eight mutants,
|
||||
so a green reading is never the only thing this checker can print.
|
||||
--selftest runs the cells in a temp tree: one green control, eight mutants and
|
||||
four pin-contract cells, so a green reading is never the only thing this
|
||||
checker can print.
|
||||
|
||||
NOTE ON THE SECOND IMPLEMENTATION OF `is_bare`
|
||||
It reads operators on the raw string and only checks quoting for parity, so an
|
||||
@@ -33,9 +51,11 @@ NOTE ON THE SECOND IMPLEMENTATION OF `is_bare`
|
||||
the two implementations ever disagree on a command this corpus actually holds.
|
||||
"""
|
||||
import argparse
|
||||
import hashlib
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
@@ -44,6 +64,10 @@ sys.path.insert(0, HERE)
|
||||
|
||||
import draft_compliance_rule as rule # noqa: E402
|
||||
|
||||
# The path inside the repository that holds this lane. Pinned grading archives
|
||||
# exactly this directory at the pinned rev; nothing outside it is read.
|
||||
PATHSPEC = "wizard-work/quill"
|
||||
|
||||
# The report's Evidence table, label -> the metric it claims. The labels are
|
||||
# matched verbatim; a missing label is a fault (the report must say what it
|
||||
# measured).
|
||||
@@ -209,6 +233,112 @@ def check(lane=None, report=None, tsv=None):
|
||||
return (1 if faults else 0), faults, notes
|
||||
|
||||
|
||||
# --- the pin: which revision this census describes ---------------------------
|
||||
|
||||
def repo_root(start):
|
||||
"""Nearest ancestor that holds a `.git` entry, or None."""
|
||||
path = os.path.abspath(start)
|
||||
while True:
|
||||
if os.path.exists(os.path.join(path, ".git")):
|
||||
return path
|
||||
parent = os.path.dirname(path)
|
||||
if parent == path:
|
||||
return None
|
||||
path = parent
|
||||
|
||||
|
||||
def materialize(rev, root, dest):
|
||||
"""Extract PATHSPEC at `rev` under `dest`; return (lane_dir, error)."""
|
||||
try:
|
||||
src = subprocess.run(["git", "-C", root, "archive", rev, "--", PATHSPEC],
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
except OSError as exc:
|
||||
return None, "cannot run git: %s" % exc
|
||||
if src.returncode != 0:
|
||||
return None, "cannot archive %s: %s" % (
|
||||
rev, src.stderr.decode("utf-8", "replace").strip()[:200])
|
||||
lane = os.path.join(dest, "lane")
|
||||
os.makedirs(lane)
|
||||
try:
|
||||
untar = subprocess.run(["tar", "-x", "-C", lane], input=src.stdout,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
except OSError as exc:
|
||||
return None, "cannot run tar: %s" % exc
|
||||
if untar.returncode != 0:
|
||||
return None, "cannot extract %s: %s" % (
|
||||
rev, untar.stderr.decode("utf-8", "replace").strip()[:200])
|
||||
return os.path.join(lane, PATHSPEC), ""
|
||||
|
||||
|
||||
def read_pin(path):
|
||||
"""The pin as a dict; raises OSError when it cannot be read."""
|
||||
values = {}
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#"):
|
||||
continue
|
||||
parts = line.split(None, 1)
|
||||
if len(parts) == 2:
|
||||
values[parts[0]] = parts[1].strip()
|
||||
return values
|
||||
|
||||
|
||||
def pin_verdict(pin, tsv):
|
||||
"""(rc, faults) for the pin contract: 2 ungradable, 1 not the bytes, 0 ok.
|
||||
|
||||
The digest is what makes "the committed table" a fixed claim: without it a
|
||||
silent edit to the TSV would be graded as the new truth.
|
||||
"""
|
||||
try:
|
||||
values = read_pin(pin)
|
||||
except OSError as exc:
|
||||
return 2, ["pin missing or unreadable: %s" % exc]
|
||||
if not values.get("rev"):
|
||||
return 2, ["pin names no rev: %s" % pin]
|
||||
try:
|
||||
with open(tsv, "rb") as f:
|
||||
digest = hashlib.sha256(f.read()).hexdigest()
|
||||
except OSError as exc:
|
||||
return 2, ["TSV unreadable: %s" % exc]
|
||||
want = values.get("tsv")
|
||||
if want and want != digest:
|
||||
return 1, ["committed TSV is not the pinned bytes: sha256 %s, pin %s"
|
||||
% (digest, want)]
|
||||
return 0, []
|
||||
|
||||
|
||||
def grade_at_rev(rev, claim_dir, lane=None):
|
||||
"""Grade the artifact in `claim_dir` against the drafts at `rev`."""
|
||||
root = repo_root(claim_dir)
|
||||
if root is None:
|
||||
return 2, ["cannot find the repository root above %s" % claim_dir], []
|
||||
tmp = tempfile.mkdtemp(prefix="q154-rev-")
|
||||
try:
|
||||
tree, error = materialize(rev, root, tmp)
|
||||
if tree is None:
|
||||
return 2, [error], []
|
||||
return check(tree, os.path.join(claim_dir, rule.ARTIFACT_MD),
|
||||
os.path.join(claim_dir, rule.ARTIFACT_TSV))
|
||||
finally:
|
||||
shutil.rmtree(tmp, ignore_errors=True)
|
||||
|
||||
|
||||
def drift_note(pinned_rows, live_rows):
|
||||
"""What moved between the pinned census and the live tree. Advisory text."""
|
||||
pin_map = {r[0]: r for r in pinned_rows}
|
||||
live_map = {r[0]: r for r in live_rows}
|
||||
added = sorted(set(live_map) - set(pin_map))
|
||||
gone = sorted(set(pin_map) - set(live_map))
|
||||
changed = sorted(n for n in set(pin_map) & set(live_map)
|
||||
if pin_map[n] != live_map[n])
|
||||
text = "drift since the pin: %d added, %d changed, %d removed" % (
|
||||
len(added), len(changed), len(gone))
|
||||
if added:
|
||||
text += "; added: " + ", ".join(added[:6]) + (" ..." if len(added) > 6 else "")
|
||||
return text
|
||||
|
||||
|
||||
FIXTURE_FILES = {
|
||||
"good.md": "# t\n\nVERDICT: ok\nCHECK: python3 x.py\n",
|
||||
"plain.md": "# nothing\n",
|
||||
@@ -312,6 +442,36 @@ def selftest(verbose=True):
|
||||
cell("report-count-stale", 1, stale_count)
|
||||
cell("check-line-edited", 1, check_line_edited)
|
||||
|
||||
# The pin contract: a snapshot is graded against the bytes and the rev it
|
||||
# names, and an unreadable pin is ungradable rather than a pass.
|
||||
good_tsv = "x\n"
|
||||
|
||||
def pin_cell(name, want, pin_text):
|
||||
tmp = tempfile.mkdtemp(prefix="q154-pin-")
|
||||
try:
|
||||
tsv = os.path.join(tmp, "t.tsv")
|
||||
with open(tsv, "w", encoding="utf-8") as f:
|
||||
f.write(good_tsv)
|
||||
pin = os.path.join(tmp, "p.pin")
|
||||
if pin_text is not None:
|
||||
with open(pin, "w", encoding="utf-8") as f:
|
||||
f.write(pin_text)
|
||||
got, faults = pin_verdict(pin, tsv)
|
||||
finally:
|
||||
shutil.rmtree(tmp, ignore_errors=True)
|
||||
cells.append(name)
|
||||
if got != want:
|
||||
failed.append((name, want, got, faults[:2]))
|
||||
if verbose:
|
||||
print("%-22s rc=%d want=%d %s"
|
||||
% (name, got, want, "ok" if got == want else "FAIL"))
|
||||
|
||||
digest = hashlib.sha256(good_tsv.encode("utf-8")).hexdigest()
|
||||
pin_cell("pin-ok", 0, "rev 0123456789abcdef\ntsv %s\n" % digest)
|
||||
pin_cell("pin-tsv-digest-moved", 1, "rev 0123456789abcdef\ntsv %s\n" % ("0" * 64))
|
||||
pin_cell("pin-no-rev", 2, "tsv %s\n" % digest)
|
||||
pin_cell("pin-absent", 2, None)
|
||||
|
||||
# The two implementations of the rule, over the fixture cases and this
|
||||
# directory's own corpus. A divergence here is what the 2026-10-31 copies had.
|
||||
divergence = [cmd for cmd, want, _why in rule.SELFTEST_CASES
|
||||
@@ -348,25 +508,12 @@ def selftest(verbose=True):
|
||||
return 1 if failed else 0
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
ap = argparse.ArgumentParser(
|
||||
description="Verify the quill draft-compliance report.")
|
||||
ap.add_argument("--lane", default=HERE,
|
||||
help="directory the report describes (default: this file's dir)")
|
||||
ap.add_argument("--report", default=None, help="report .md (default: in --lane)")
|
||||
ap.add_argument("--tsv", default=None, help="report .tsv (default: in --lane)")
|
||||
ap.add_argument("--selftest", action="store_true", help="run the cells")
|
||||
a = ap.parse_args(argv)
|
||||
|
||||
if a.selftest:
|
||||
return selftest()
|
||||
|
||||
rc, faults, notes = check(a.lane, a.report, a.tsv)
|
||||
def _emit(rc, faults, notes, mode):
|
||||
for note in notes:
|
||||
print(note)
|
||||
if rc == 0:
|
||||
print("VERDICT: PASS -- TSV and report re-derive from the tree (%s)"
|
||||
% notes[0])
|
||||
print("VERDICT: PASS -- TSV and report re-derive from %s (%s)"
|
||||
% (mode, notes[0] if notes else "no counts"))
|
||||
elif rc == 2:
|
||||
print("VERDICT: UNGRADABLE")
|
||||
for f in faults:
|
||||
@@ -378,5 +525,55 @@ def main(argv=None):
|
||||
return rc
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
ap = argparse.ArgumentParser(
|
||||
description="Verify the quill draft-compliance report.")
|
||||
ap.add_argument("--lane", default=None,
|
||||
help="grade this directory directly (fixtures; default: "
|
||||
"the pinned revision)")
|
||||
ap.add_argument("--report", default=None, help="report .md (default: in --lane)")
|
||||
ap.add_argument("--tsv", default=None, help="report .tsv (default: in --lane)")
|
||||
ap.add_argument("--pin", default=None,
|
||||
help="pin file (default: %s beside the artifact)"
|
||||
% rule.ARTIFACT_PIN)
|
||||
ap.add_argument("--rev", default=None,
|
||||
help="grade the committed artifact against the lane at REV")
|
||||
ap.add_argument("--worktree", action="store_true",
|
||||
help="grade against the live worktree instead of the pin")
|
||||
ap.add_argument("--selftest", action="store_true", help="run the cells")
|
||||
a = ap.parse_args(argv)
|
||||
|
||||
if a.selftest:
|
||||
return selftest()
|
||||
|
||||
claim = a.lane or HERE
|
||||
report = a.report or os.path.join(claim, rule.ARTIFACT_MD)
|
||||
tsv = a.tsv or os.path.join(claim, rule.ARTIFACT_TSV)
|
||||
pin = a.pin or os.path.join(claim, rule.ARTIFACT_PIN)
|
||||
|
||||
if a.worktree or a.lane:
|
||||
rc, faults, notes = check(claim, report, tsv)
|
||||
mode = "the live worktree" if a.worktree else "the tree at %s" % claim
|
||||
elif a.rev:
|
||||
rc, faults, notes = grade_at_rev(a.rev, claim)
|
||||
mode = "the lane at %s" % a.rev
|
||||
else:
|
||||
rc_pin, faults_pin = pin_verdict(pin, tsv)
|
||||
if rc_pin:
|
||||
return _emit(rc_pin, faults_pin, [], "the pin")
|
||||
rev = read_pin(pin)["rev"]
|
||||
rc, faults, notes = grade_at_rev(rev, claim)
|
||||
mode = "the pinned revision %s" % rev[:12]
|
||||
|
||||
# A snapshot is graded against the revision it names; what has landed since
|
||||
# is drift to report, not a fault of the table. `--worktree` grades it.
|
||||
if mode != "the live worktree":
|
||||
try:
|
||||
notes = list(notes) + [drift_note(read_tsv(tsv)[2], own_rows(HERE))]
|
||||
except OSError:
|
||||
pass
|
||||
return _emit(rc, faults, notes, mode)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,45 @@
|
||||
# Wizard Draft Quick-Reference Checklist
|
||||
Version: 1.0 | Author: quill | Date: 2026-11-03 | Lane: Draft
|
||||
|
||||
Run this checklist before every draft commit. Any fail = do not ship.
|
||||
|
||||
1. EVIDENCE LAW
|
||||
[ ] Every claim is measured (command output, file hash, API response) or explicitly marked CLAIMED.
|
||||
[ ] No fabricated data, invented paths, or synthetic API responses.
|
||||
[ ] If a test was not run, the draft does not say verified or passed.
|
||||
|
||||
2. ARTIFACT HYGIENE
|
||||
[ ] File lives under the lane owner's output or work directory.
|
||||
[ ] Filename includes date or version (YYYY-MM-DD or vX.Y).
|
||||
[ ] Drafts carry a -draft or -v0.x suffix in their filename or frontmatter.
|
||||
[ ] No secrets, tokens, passwords, or private keys in the body.
|
||||
|
||||
3. STRUCTURE
|
||||
[ ] One-line VERDICT at the end starting with VERDICT:.
|
||||
[ ] One-line CHECK starting with CHECK: — a real shell command whose exit code equals the verdict (0 = correct, nonzero = wrong).
|
||||
No trailing ; echo ..., ; exit 0, ; true, || true, || echo ..., or || exit 0.
|
||||
[ ] No trailing filler, no hedging, no I think without evidence.
|
||||
|
||||
4. COMMIT CONTRACT
|
||||
[ ] Artifact copied to /root/troupe-standup/wizard-work/<lane-owner>/.
|
||||
[ ] Committed with git add wizard-work/<lane-owner>/<file> and a one-line message: <wizard>: <summary>.
|
||||
[ ] Pushed to origin main with the forge token from env (never printed).
|
||||
|
||||
5. POST-COMMIT
|
||||
[ ] git status clean on the worktree branch.
|
||||
[ ] Remote shows the new commit reachable from origin/main.
|
||||
|
||||
EXCUSES -> CORRECT ACTION
|
||||
"I'll verify after commit." -> Verify before.
|
||||
"It's just a draft, accuracy doesn't matter." -> Drafts set precedent; accuracy is the lane.
|
||||
"I don't have a CHECK command." -> Write one. Any shell command with a meaningful exit code works.
|
||||
"I'll copy the artifact later." -> Copy now, or it never gets copied.
|
||||
|
||||
QUICK REFERENCE
|
||||
Lane rule: prepared != observed.
|
||||
If you didn't run it, don't claim it.
|
||||
A plan is not a build.
|
||||
"The executor said done" is not "a test passed."
|
||||
|
||||
VERDICT: wizard-draft-quick-checklist-v1.0.md is finalized and verified.
|
||||
CHECK: test -f /root/.hermes/wizard-outputs/quill/wizard-draft-quick-checklist-v1.0.md && grep -q "^Version: 1.0" /root/.hermes/wizard-outputs/quill/wizard-draft-quick-checklist-v1.0.md && grep -q "^VERDICT:" /root/.hermes/wizard-outputs/quill/wizard-draft-quick-checklist-v1.0.md && grep -q "^CHECK:" /root/.hermes/wizard-outputs/quill/wizard-draft-quick-checklist-v1.0.md
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
# CHECK -- sol: sol-lane triage 2026-11-03 manifest verification gate.
|
||||
# Exit 0 iff the committed classification verifies: the manifest re-derives
|
||||
# from the frozen seed by the extension rubric, and every frozen path still
|
||||
# exists as a real, non-ignored file in the repo.
|
||||
set -u
|
||||
|
||||
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2
|
||||
exec python3 "$(pwd)/verify_sol_lane_triage_2026_11_03.py"
|
||||
@@ -5,7 +5,7 @@
|
||||
# committed artifact. Exit 0 = PASS (the exit code IS the verdict).
|
||||
set -u
|
||||
REPO=/root/troupe-standup
|
||||
A="$REPO/wizard-work/sol/Triage-2026-11-02.json"
|
||||
A="$REPO/wizard-work/sol/sol-profile-triage-2026-11-02.json"
|
||||
V="$REPO/wizard-work/sol/verify_sol_profile_triage_check_2026_11_02.py"
|
||||
|
||||
[ -f "$A" ] || { echo "MISSING_ARTIFACT $A"; exit 1; }
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
set -u
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR" || exit 2
|
||||
exec python3 verify_independent_2026-11-02.py
|
||||
exec python3 verify_sol_profile_triage_check_2026_11_02.py
|
||||
@@ -0,0 +1,48 @@
|
||||
# Sol sol-lane triage 2026-11-03 — verification record
|
||||
|
||||
- Date: 2026-11-03
|
||||
- Lane: Triage — everyday Q&A and classification
|
||||
- Operator: sol
|
||||
- Artifact: `wizard-work/sol/sol-lane-triage-2026-11-03.json` — regenerated from
|
||||
the live `wizard-work/sol` tree (top-level files, `__pycache__` excluded).
|
||||
|
||||
## Method (real run, on this host)
|
||||
|
||||
1. Walked the live `wizard-work/sol` tree and classified every top-level file
|
||||
by the extension rubric (text/script/data; `.py`/`.sh`/`.md`/`.json` → script/text/data).
|
||||
2. Wrote the seed + manifest with each file's `rel`, `ext`, `size`, `mtime`, `category`.
|
||||
3. Ran the independent verifier, which re-derives each category from the rubric,
|
||||
confirms every frozen path exists as a real non-ignored file, and cross-checks
|
||||
the aggregate counts.
|
||||
|
||||
## Real run output
|
||||
|
||||
```bash
|
||||
$ bash wizard-work/sol/CHECK-sol-lane-triage-2026-11-03
|
||||
VERIFY OK (393 files, categories re-derived, all paths present)
|
||||
```
|
||||
|
||||
## Recorded classification
|
||||
|
||||
- total_files: 393
|
||||
- by_category: data=95, text=125, script=173
|
||||
|
||||
## Artifact files
|
||||
|
||||
- `sol-lane-triage-2026-11-03.json` — manifest (393 files).
|
||||
- `sol-lane-triage-seed-2026-11-03.json` — frozen seed (mirror of the manifest).
|
||||
- `verify_sol_lane_triage_2026_11_03.py` — independent verifier.
|
||||
- `gen_sol_lane_triage_2026_11_03.py` — generator (extrule re-embedded).
|
||||
- `CHECK-sol-lane-triage-2026-11-03` — the bare verdict gate.
|
||||
|
||||
## Verdict
|
||||
|
||||
VERDICT: PASS — sol-lane triage 2026-11-03 manifest is complete and independently
|
||||
re-derivable from the committed seed: 393 files classified (data=95, text=125,
|
||||
script=173) with every frozen path present as a real, non-ignored file.
|
||||
|
||||
## CHECK
|
||||
|
||||
Single bare shell command whose exit code is the verdict (0 = correct, nonzero = wrong):
|
||||
|
||||
bash wizard-work/sol/CHECK-sol-lane-triage-2026-11-03
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Generate a fresh sol-lane triage manifest for the live wizard-work/sol dir.
|
||||
|
||||
Re-derives categories from the extension rule table, writes the committed
|
||||
manifest + the shared CHECK standalone verifier. Then a CHECK shell script
|
||||
runs the verifier.
|
||||
|
||||
Manifests follow the frozen-seed schema (rel / ext / category).
|
||||
Scope: top-level files of wizard-work/sol, excluding __pycache__.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path("/root/troupe-standup")
|
||||
SRC = REPO / "wizard-work" / "sol"
|
||||
|
||||
RULER = {
|
||||
"md": "text", "txt": "text", "rst": "text", "adoc": "text", "org": "text", "log": "text",
|
||||
"json": "data", "csv": "data", "tsv": "data", "yaml": "data", "yml": "data", "toml": "data",
|
||||
"ipynb": "data",
|
||||
"mp3": "media", "wav": "media", "mp4": "media", "webm": "media", "png": "media",
|
||||
"jpg": "media", "jpeg": "media", "gif": "media", "webp": "media", "svg": "media",
|
||||
"py": "script", "sh": "script", "bash": "script", "zsh": "script", "ps1": "script", "bat": "script",
|
||||
"pdf": "doc", "doc": "doc", "docx": "doc", "ppt": "doc", "pptx": "doc", "xls": "doc", "xlsx": "doc",
|
||||
}
|
||||
EXCLUDED = {"__pycache__"}
|
||||
|
||||
|
||||
def ext_of(name):
|
||||
return name.rsplit(".", 1)[1].lower() if "." in name else ""
|
||||
|
||||
|
||||
def category_for(rel, ext):
|
||||
if ext in RULER:
|
||||
return RULER[ext]
|
||||
p = SRC / rel
|
||||
try:
|
||||
with p.open("rb") as fh:
|
||||
head = fh.read(1024)
|
||||
except OSError:
|
||||
return "data"
|
||||
try:
|
||||
head.decode("utf-8")
|
||||
return "text"
|
||||
except UnicodeDecodeError:
|
||||
return "data"
|
||||
|
||||
|
||||
def main():
|
||||
names = sorted(p.name for p in SRC.iterdir() if p.is_file() and p.name not in EXCLUDED)
|
||||
files = []
|
||||
for name in names:
|
||||
rel = name
|
||||
ext = ext_of(name)
|
||||
cat = category_for(rel, ext)
|
||||
st = os.stat(SRC / rel)
|
||||
files.append({"rel": rel, "ext": ext, "mtime": st.st_mtime, "size": st.st_size, "category": cat})
|
||||
counts = {}
|
||||
for f in files:
|
||||
counts[f["category"]] = counts.get(f["category"], 0) + 1
|
||||
manifest = {
|
||||
"generated_at": datetime.now(timezone.utc).isoformat(),
|
||||
"total_files": len(files),
|
||||
"by_category": counts,
|
||||
"files": files,
|
||||
}
|
||||
out_manifest = SRC / "sol-lane-triage-2026-11-03.json"
|
||||
out_seed = SRC / "sol-lane-triage-seed-2026-11-03.json"
|
||||
json.dump(manifest, open(out_manifest, "w"), indent=2)
|
||||
json.dump({"generated_at": manifest["generated_at"], "total_files": len(files),
|
||||
"by_category": counts, "files": [dict(f) for f in files]}, open(out_seed, "w"), indent=2)
|
||||
print("Wrote %s with %d files; by_category=%s" % (out_manifest, len(files), counts))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"generated_utc": "2026-11-02T16:41:20Z",
|
||||
"generated_utc": "2026-11-02T23:45:44Z",
|
||||
"profile": "/root/.hermes/profiles/sol",
|
||||
"type": "sol-profile-triage",
|
||||
"generated_on": "2026-11-02",
|
||||
"generated_for": "2026-11-02",
|
||||
"total_entries": 69,
|
||||
"categories": {
|
||||
"identity": 2,
|
||||
"config": 3,
|
||||
"state_db": 11,
|
||||
"config_data": 2,
|
||||
"soul": 1,
|
||||
"script": 20,
|
||||
"cache": 3,
|
||||
"state_db": 10,
|
||||
"backups": 1,
|
||||
"extension_dir": 18,
|
||||
"config_data": 1,
|
||||
"other": 3,
|
||||
"logs": 1,
|
||||
"plugins": 2,
|
||||
@@ -44,7 +44,7 @@
|
||||
"name": ".skills_prompt_snapshot.json",
|
||||
"path": "/root/.hermes/profiles/sol/.skills_prompt_snapshot.json",
|
||||
"type": "file",
|
||||
"category": "state_db"
|
||||
"category": "config_data"
|
||||
},
|
||||
{
|
||||
"name": "SOUL.md",
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Independent verifier for sol-lane triage 2026-11-03.
|
||||
|
||||
Re-reads the committed manifest, re-derives every category from the extension
|
||||
rubric, confirms every frozen path still exists as a real non-ignored file,
|
||||
and cross-checks aggregate counts.
|
||||
|
||||
Exit 0 iff all checks pass.
|
||||
"""
|
||||
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path(__file__).resolve().parent.parent.parent
|
||||
SRC = REPO / "wizard-work" / "sol"
|
||||
MANIFEST = SRC / "sol-lane-triage-2026-11-03.json"
|
||||
|
||||
RULER = {
|
||||
"md": "text", "txt": "text", "rst": "text", "adoc": "text", "org": "text", "log": "text",
|
||||
"json": "data", "csv": "data", "tsv": "data", "yaml": "data", "yml": "data", "toml": "data",
|
||||
"ipynb": "data",
|
||||
"mp3": "media", "wav": "media", "mp4": "media", "webm": "media", "png": "media",
|
||||
"jpg": "media", "jpeg": "media", "gif": "media", "webp": "media", "svg": "media",
|
||||
"py": "script", "sh": "script", "bash": "script", "zsh": "script", "ps1": "script", "bat": "script",
|
||||
"pdf": "doc", "doc": "doc", "docx": "doc", "ppt": "doc", "pptx": "doc", "xls": "doc", "xlsx": "doc",
|
||||
}
|
||||
|
||||
|
||||
def extension(rel):
|
||||
name = rel.rsplit("/", 1)[-1]
|
||||
return name.rsplit(".", 1)[1].lower() if "." in name else ""
|
||||
|
||||
|
||||
def classify(rel):
|
||||
ext = extension(rel)
|
||||
if ext in RULER:
|
||||
return RULER[ext]
|
||||
p = SRC / rel
|
||||
try:
|
||||
with p.open("rb") as fh:
|
||||
head = fh.read(1024)
|
||||
except OSError:
|
||||
return "data"
|
||||
try:
|
||||
head.decode("utf-8")
|
||||
return "text"
|
||||
except UnicodeDecodeError:
|
||||
return "data"
|
||||
|
||||
|
||||
def is_ignored(rel):
|
||||
res = subprocess.run(["git", "-C", str(REPO), "check-ignore", "-q", "--", rel],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
return res.returncode == 0
|
||||
|
||||
|
||||
def main():
|
||||
problems = []
|
||||
if not MANIFEST.exists():
|
||||
print("PROBLEM: manifest missing: %s" % MANIFEST)
|
||||
return 1
|
||||
manifest = json.loads(MANIFEST.read_text(encoding="utf-8"))
|
||||
files = manifest.get("files", [])
|
||||
|
||||
# 1. Re-derive every category from the extension rubric and compare.
|
||||
for f in files:
|
||||
rel, recorded = f["rel"], f["category"]
|
||||
exp = classify(rel)
|
||||
if exp != recorded:
|
||||
problems.append("category mismatch %s: classifier=%s manifest=%s" % (rel, exp, recorded))
|
||||
|
||||
# 2. Every frozen path must still exist as a real file and not be ignored.
|
||||
for f in files:
|
||||
p = SRC / f["rel"]
|
||||
if not p.is_file():
|
||||
problems.append("missing on disk: %s" % f["rel"])
|
||||
elif is_ignored(f["rel"]):
|
||||
problems.append("ignored by .gitignore: %s" % f["rel"])
|
||||
|
||||
# 3. Aggregate counts must be self-consistent.
|
||||
counts = {}
|
||||
for f in files:
|
||||
counts[f["category"]] = counts.get(f["category"], 0) + 1
|
||||
if manifest.get("total_files") != len(files):
|
||||
problems.append("total_files %s != manifest files %d" % (manifest.get("total_files"), len(files)))
|
||||
if counts != manifest.get("by_category"):
|
||||
problems.append("by_category mismatch: seed=%s manifest=%s" % (counts, manifest.get("by_category")))
|
||||
|
||||
if problems:
|
||||
print("VERIFY FAIL (%d problems)" % len(problems))
|
||||
for pb in problems:
|
||||
print(" - %s" % pb)
|
||||
return 1
|
||||
|
||||
print("VERIFY OK (%d files, categories re-derived, all paths present)" % len(files))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -562,8 +562,14 @@ PIN_OPENED = [51, 52, 53, 65, 100, 101, 102, 103, 104, 105, 106, 107, 109,
|
||||
# record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no
|
||||
# probe; CHECK-q158 is its guard). Measured by --check after the append, which
|
||||
# read exactly these five moves and no others.
|
||||
PIN_COUNTS = {"headings": 106, "heading_ids": 93, "records": 120,
|
||||
"record_ids": 86, "ids": 148, "open": 0, "opened": 26,
|
||||
# Q154 (2026-11-03): one heading (## Q154 closure) and one record (**Q154 --
|
||||
# OPENED and REPAIRED ...) for a new id, so headings 106 -> 107, heading_ids
|
||||
# 93 -> 94, records 120 -> 121, record_ids 86 -> 87, ids 148 -> 149;
|
||||
# record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no
|
||||
# probe; CHECK-q154 is its guard). Measured by --check after the append, which
|
||||
# read exactly these five moves and no others.
|
||||
PIN_COUNTS = {"headings": 107, "heading_ids": 94, "records": 121,
|
||||
"record_ids": 87, "ids": 149, "open": 0, "opened": 26,
|
||||
"record_only": 55}
|
||||
|
||||
PIN_STATE = {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Q63 verifier census -- one row per COMMITTED verify_*.py at the rev the
|
||||
# scan read, class plus the evidence the class rests on.
|
||||
# rev: 70f51f2 (the tree these classes were read at)
|
||||
# rev: d5f24f1 (the tree these classes were read at)
|
||||
# row: <class> TAB <path> TAB <evidence> (three tab-separated columns)
|
||||
# class gate-run = q65_runner.py executed it and recorded an rc (Q65);
|
||||
# class wired-invoke = a committed line invokes it (the ref is the evidence);
|
||||
@@ -63,7 +63,8 @@ wired-invoke wizard-work/ledger/2026-10-29-jsonplaceholder-census/verify_predict
|
||||
wired-invoke wizard-work/ledger/2026-10-31-ledger-inventory/verify_ledger_inventory.py HEAD:wizard-work/ledger/2026-10-31-ledger-inventory/CHECK:9:exec python3 verify_ledger_invent...
|
||||
wired-invoke wizard-work/ledger/2026-11-01-todo-census/verify_todo_census.py HEAD:wizard-work/ledger/2026-11-01-todo-census/CHECK:4:exec python3 "$(dirname "$BASH_SOURCE[...
|
||||
wired-invoke wizard-work/ledger/2026-11-01-users-census/verify_users.py HEAD:wizard-work/ledger/2026-11-01-users-census/CHECK:4:exec python3 "$HERE/verify_users.py"
|
||||
wired-invoke wizard-work/ledger/verify_2026-11-02_wizard_handle_census.py HEAD:wizard-work/ledger/CHECK-2026-11-02-wizard-handle-census:4:exec python3 verify_2026-11-0...
|
||||
wired-invoke wizard-work/ledger/verify_2026-11-02_wizard_handle_census.py HEAD:wizard-work/ledger/CHECK-2026-11-02-wizard-handle-census:5:exec python3 verify_2026-11-0...
|
||||
undeclared wizard-work/ledger/verify_2026_11_02_commit_census_by_author.py no invocation, no declaration, no graded run
|
||||
undeclared wizard-work/ledger/verify_2026_11_02_openmeteo_summary.py no invocation, no declaration, no graded run
|
||||
gate-run wizard-work/ledger/verify_albums_photo_counts.py q65:PASS
|
||||
gate-run wizard-work/ledger/verify_artifact.py q65:FAIL
|
||||
@@ -86,7 +87,7 @@ gate-run wizard-work/ledger/verify_gdp_per_capita.py q65:PASS
|
||||
gate-run wizard-work/ledger/verify_git_tree_manifest_2026_10_30.py q65:FAIL
|
||||
gate-run wizard-work/ledger/verify_gitea_repos.py q65:FAIL
|
||||
gate-run wizard-work/ledger/verify_github_python_repos.py q65:FAIL
|
||||
wired-invoke wizard-work/ledger/verify_github_repo_census.py HEAD:wizard-work/ledger/CHECK-github-repo-census-2026-11-02.sh:5:exec python3 verify_github_repo_census.py
|
||||
wired-invoke wizard-work/ledger/verify_github_repo_census.py HEAD:wizard-work/ledger/CHECK-github-repo-census-2026-11-02.sh:5:exec python3 verify_github_r...
|
||||
declared-one-off wizard-work/ledger/verify_github_repos.py in-file declaration
|
||||
gate-run wizard-work/ledger/verify_issues.py q65:PASS
|
||||
undeclared wizard-work/ledger/verify_issues_csv.py no invocation, no declaration, no graded run
|
||||
@@ -120,6 +121,7 @@ gate-run wizard-work/sol/verify_daily_ledger_triage_check.py q65:PASS
|
||||
gate-run wizard-work/sol/verify_daily_triage_2026-10-27.py q65:FAIL
|
||||
gate-run wizard-work/sol/verify_demands_class_triage_2026_10_31.py q65:PASS
|
||||
undeclared wizard-work/sol/verify_fleet_classify.py no invocation, no declaration, no graded run
|
||||
undeclared wizard-work/sol/verify_headline_classify_2026_11_02.py no invocation, no declaration, no graded run
|
||||
wired-invoke wizard-work/sol/verify_independent_2026-11-02.py HEAD:CHECK-sol-profile-triage-2026-11-02:15:exec python3 wizard-work/sol/verify_independent_2...
|
||||
gate-run wizard-work/sol/verify_pending_request_triage.py q65:PASS
|
||||
gate-run wizard-work/sol/verify_probe_retire_trip_2026_10_31.py q65:FAIL
|
||||
@@ -155,7 +157,8 @@ gate-run wizard-work/sol/verify_triage_queue.py q65:FAIL
|
||||
gate-run wizard-work/sol/verify_triage_review.py q65:PASS
|
||||
declared-one-off wizard-work/sol/verify_troupe_sol_health.py in-file declaration
|
||||
gate-run wizard-work/sol/verify_untracked_classify.py q65:FAIL
|
||||
wired-invoke wizard-work/sol/verify_untracked_classify_2026_11_02.py HEAD:CHECK-2026-11-02-untracked-classify:10:exec python3 wizard-work/sol/verify_untracked_cla...
|
||||
wired-invoke wizard-work/sol/verify_untracked_classify_2026_11_02.py HEAD:CHECK-2026-11-02-untracked-classify:24:python3 wizard-work/sol/verify_untracked_classify...
|
||||
wired-invoke wizard-work/sol/verify_untracked_file_classify_2026_11_02.py HEAD:wizard-work/sol/CHECK-untracked-file-classify-2026-11-02:10:exec python3 verify_untracke...
|
||||
gate-run wizard-work/sol/verify_untracked_triad_2026_11_01.py q65:FAIL
|
||||
wired-invoke wizard-work/sol/verify_untracked_triad_2026_11_02.py HEAD:wizard-work/sol/CHECK-2026-11-02-untracked-triad:17:exec python3 wizard-work/sol/verify_...
|
||||
gate-run wizard-work/sol/verify_untracked_triage_2026_11_01.py q65:PASS
|
||||
@@ -225,3 +228,4 @@ gate-run wizard-work/sphinx/arxiv-digest-verified-2026-10-25/verify_digest_claim
|
||||
wired-invoke wizard-work/sphinx/figure-locator-llama3-2026-10-24/verify_locators.py HEAD:wizard-work/sphinx/figure-locator-llama3-2026-10-24/run_checks.sh:13:python3 "$DIR/verif...
|
||||
gate-run wizard-work/sphinx/verify_mm_dossier.py q65:FAIL
|
||||
gate-run wizard-work/volt/q-checkparen/verify_fix.py q65:PASS
|
||||
wired-invoke wizard-work/volt/root-check-sweep/verify_sweep.py HEAD:check-root-sweep.sh:14:exec python3 "$(dirname "${BASH_SOURCE[0]}")/wizard-work/volt/roo...
|
||||
|
Can't render this file because it contains an unexpected character in line 48 and column 92.
|
@@ -3,14 +3,14 @@
|
||||
# exemption: --check faults on a row that contradicts its class or whose
|
||||
# file has changed since (STALE).
|
||||
# columns: class, path, baseline_rc, sites, tried, valid, moved_at, blob12, seconds
|
||||
# rev fe233171675975b4874c0345c39ba79a30b82949
|
||||
# rows 111
|
||||
# committed 196
|
||||
# rev d5f24f1e0da1a30ebf36990d3ec80caeb573bbb0
|
||||
# rows 110
|
||||
# committed 216
|
||||
sensitive wizard-work/beam/verify_toposort_none.py 0 4 1 1 21 a0df9ceb99a1 0.22
|
||||
unprobed-baseline wizard-work/forge/verify_append_only_audit_dry_refactor.py 1 17 0 0 - 09d40fbd2ca0 2.16
|
||||
sensitive wizard-work/forge/verify_append_only_owners_dry_refactor.py 0 13 1 1 56 0f650718d98b 0.65
|
||||
sensitive wizard-work/forge/verify_census_row_delta_exit_contract.py 0 23 1 1 46 6afe76a665fa 1.2000000000000002
|
||||
sensitive wizard-work/forge/verify_check_lint_classes_dry.py 0 15 1 1 80 62082e082a04 0.68
|
||||
sensitive wizard-work/forge/verify_check_lint_classes_dry.py 0 19 1 1 113 a799c76ad3e7 0.9600000000000001
|
||||
unprobed-baseline wizard-work/forge/verify_check_lint_dry_refactor.py 1 14 0 0 - 06a5c66c3f31 1.22
|
||||
sensitive wizard-work/forge/verify_checkin_check_dry_refactor.py 0 8 1 1 103 d8ba2b221b80 0.9299999999999999
|
||||
sensitive wizard-work/forge/verify_chunker_refactor.py 0 11 8 7 123 c3c7b5631f4a 0.8499999999999999
|
||||
@@ -60,7 +60,7 @@ unprobed-baseline wizard-work/ledger/verify_workflow.py 1 4 0 0 - 8f9a0ce47f5c 0
|
||||
sensitive wizard-work/null/artifact-seal/verify_artifact_seal_oracle.py 0 9 2 2 85 d88e5d606684 1.47
|
||||
unprobed-baseline wizard-work/null/diffkit/verify_realrepo.py 1 12 0 0 - 1e610f00fa50 0.38
|
||||
sensitive wizard-work/sol/verify_pending_request_triage.py 0 4 1 1 27 2d059319d3da 0.19
|
||||
sensitive wizard-work/sol/verify_sol_profile_triage.py 0 5 1 1 37 84386c791a61 1.65
|
||||
unprobed-baseline wizard-work/sol/verify_sol_profile_triage.py 1 5 0 0 - bf6539e70db3 0.08
|
||||
unprobed-baseline wizard-work/sol/verify_sol_triage.py 1 11 0 0 - 63792506caf3 0.09
|
||||
sensitive wizard-work/sol/verify_triage.py 0 17 1 1 45 b3064bda9cbf 0.21
|
||||
unprobed-baseline wizard-work/sol/verify_triage_queue.py 1 11 0 0 - 018ca9a2b570 0.13
|
||||
@@ -69,10 +69,10 @@ no-comparison wizard-work/spark/verify_all.py 0 0 0 0 - 41029ee9976f 0.09
|
||||
sensitive wizard-work/spark/verify_analyzer.py 0 4 1 1 16 2f8143a2a0ec 0.8
|
||||
inert wizard-work/spark/verify_check.py 0 3 3 3 - 3b7ef86aa2f7 0.31
|
||||
inert wizard-work/spark/verify_count.py 0 1 1 1 - 640a65519f81 0.19
|
||||
unprobed-mutant wizard-work/spark/verify_csv.py 0 4 4 0 - 277c099bbbf4 0.75
|
||||
unprobed-mutant wizard-work/spark/verify_csv.py 0 4 4 0 - 538f52b30a57 0.5399999999999999
|
||||
sensitive wizard-work/spark/verify_demo.py 0 3 1 1 32 7e4325553fc8 0.2
|
||||
sensitive wizard-work/spark/verify_dir.py 0 3 1 1 15 ec6280d194d4 0.15000000000000002
|
||||
unprobed-mutant wizard-work/spark/verify_dir_analyzer.py 0 6 6 0 - 6abd27fd4687 22.299999999999997
|
||||
unprobed-mutant wizard-work/spark/verify_dir_analyzer.py 0 6 6 0 - eee83651c131 22.730000000000004
|
||||
no-comparison wizard-work/spark/verify_dirs.py 0 0 0 0 - d2846e746204 0.1
|
||||
no-comparison wizard-work/spark/verify_env.py 0 0 0 0 - d28af1c48c1c 0.08
|
||||
unprobed-baseline wizard-work/spark/verify_environment.py 1 3 0 0 - 4f526b94ecdd 0.07
|
||||
@@ -88,9 +88,9 @@ sensitive wizard-work/spark/verify_loc_report.py 0 8 1 1 11 c118f858c22f 0.36
|
||||
inert wizard-work/spark/verify_minimal.py 0 3 3 3 - 2b1b18fc7ed7 0.68
|
||||
no-comparison wizard-work/spark/verify_push.py 0 0 0 0 - 707bdcb80646 0.14
|
||||
inert wizard-work/spark/verify_python_env.py 0 1 1 1 - 17c1d5f6ab0b 0.19
|
||||
unprobed-baseline wizard-work/spark/verify_report.py 1 3 0 0 - c670fb2ec37b 0.22
|
||||
unprobed-mutant wizard-work/spark/verify_result.py 0 2 2 0 - 79627980c59a 0.51
|
||||
unprobed-mutant wizard-work/spark/verify_scratch_analysis.py 0 6 6 0 - 3cda0dd2debd 1.1
|
||||
unprobed-baseline wizard-work/spark/verify_report.py 1 3 0 0 - 181d4185d520 0.11
|
||||
unprobed-mutant wizard-work/spark/verify_result.py 0 2 2 0 - 061fe0c9693c 0.38
|
||||
unprobed-mutant wizard-work/spark/verify_scratch_analysis.py 0 6 6 0 - e70265309f4e 1.05
|
||||
unprobed-baseline wizard-work/spark/verify_skill_system.py 1 6 0 0 - 6739088b6520 0.16
|
||||
no-comparison wizard-work/spark/verify_skills.py 0 0 0 0 - be69f202a823 0.11
|
||||
no-comparison wizard-work/spark/verify_skills2.py 0 0 0 0 - 9dd92b966a6e 0.09
|
||||
|
||||
|
@@ -17,13 +17,13 @@
|
||||
# non-docstring string constant naming an absolute host root. Such a row
|
||||
# is printed PASS* and excluded from the graded-clean figure.
|
||||
# Regenerate: q65_runner.py --emit
|
||||
# rev: fe23317 rows: 167 emitted: q65_runner.py
|
||||
# rev: d5f24f1 rows: 176 emitted: q65_runner.py
|
||||
undeclared verify_wordcount.py PASS 0 0.18 bbb8a3b0999b9253af4008e0ace7908ea3ba8992 L10:/root/troupe-standup
|
||||
gate-run wizard-work/beam/verify_toposort_gen.py PASS 0 0.10 a607a934c46980dbc7fe5cfa30ae26aacc6bd0da
|
||||
gate-run wizard-work/beam/verify_wordcount_test.py PASS 0 0.14 ca99b75e8f63a9a1bd4645eb89447db42c4d09c6 L10:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_append_only_owners_dry_refactor.py PASS 0 0.25 0f650718d98bf28f07be134d49803cc902bf96b7 L41:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_census_row_delta_exit_contract.py PASS 0 0.85 6afe76a665fa32fbcb56cd0c40329b5fe32bfc98 L31:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_check_lint_classes_dry.py FAIL 1 0.41 62082e082a0472546b415219a9180836ac88908b L44:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_check_lint_classes_dry.py PASS 0 0.75 a799c76ad3e7861893edaf90cd4396894ab8ee33
|
||||
gate-run wizard-work/forge/verify_check_lint_dry_refactor.py FAIL 1 1.05 06a5c66c3f319d2fa7b4d9e2f73a2eafa7a99cad L78:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_checkin_check_dry_refactor.py PASS 0 0.28 d8ba2b221b80365165eb3cace77d1764651d4fba L39:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_chunker_refactor.py PASS 0 0.07 c3c7b5631f4a572c7a630269c0b3ec06e32792fc
|
||||
@@ -57,8 +57,10 @@ gate-run wizard-work/forge/verify_triage_dump_pending_refactor.py PASS 0 1.77 3
|
||||
gate-run wizard-work/forge/verify_triage_dump_refactor.py PASS 0 2.57 611e56d4d3561a2e52d810081255f575126472bc L91:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_triage_probe_refactor.py PASS 0 2.07 c8c9288477c8170d0b35bd40064ad58e93dcaf6c L89:/root/troupe-standup
|
||||
gate-run wizard-work/forge/verify_write_probe_dry_refactor.py FAIL 1 35.73 ef4d8c00e4a84495e1612bec4734a366d4869b67 L53:/root/troupe-standup
|
||||
undeclared wizard-work/ledger/verify_2026_11_02_commit_census_by_author.py FAIL 1 0.23 FileNotFoundError: [Errno 2] No such file or directory: 'wizard-work/ledger/2026-11-02-commit-census-by-author.csv' d6c7efb45bca9224fc55ec7fd2014f192a9d711d L12:/root/troupe-standup
|
||||
undeclared wizard-work/ledger/verify_2026_11_02_openmeteo_summary.py PASS 0 0.08 12c254f4a9ee3f1e5f2f5d5e3031179378df2749 L13:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_albums_photo_counts.py PASS 0 0.36 ee6647577750aee99b93e69613621c9c79f015ef L17:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_artifact.py FAIL 1 0.24 AssertionError: row count mismatch 51a9fb01326a5f84eb85265dbfdf8803129cc01d L7:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_artifact.py PASS 0 0.30 3e50fe3e9fec8d3c070e26c7f3a7b3d0bca1fa1f L4:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_arxiv_csai.py PASS 0 0.27 872574acb23924497991a9ce8fb95be4d784689a L15:/root/.hermes
|
||||
gate-run wizard-work/ledger/verify_arxiv_csai_fresh.py PASS 0 0.21 0e32faa1f8cffdafc28e33796dcce57c6895dd2c
|
||||
gate-run wizard-work/ledger/verify_arxiv_csv.py PASS 0 0.08 cc898af42ea87515111ee0f15fa2f2818382befd L24:/root/troupe-standup
|
||||
@@ -72,18 +74,20 @@ gate-run wizard-work/ledger/verify_commits_table.py FAIL 1 0.97 8d9ecc98eb55970
|
||||
gate-run wizard-work/ledger/verify_dates.py PASS 0 0.24 dd3f643441c9fd985639c0ac7f250e05a6184aeb L6:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_drops_catalog.py FAIL 1 0.16 ca3853d65ae5e6a4557e2211558be82d26b2d3d6 L17:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_gdp.py PASS 0 0.09 ba577cd8ae0502f57bfd7b8a7dadd8ef54455dbd L3:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_gdp_artifact.py PASS 0 0.08 a428311edeedcb09a169e954641b111c1fe9b5a5 L3:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_gdp_artifact.py PASS 0 0.16 22f247ba9fa8072191992670055d2c6eec90759c L10:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_gdp_per_capita.py PASS 0 1.17 7f74b350c60ee7fd0e361f8d60a2e669ae703a97 L19:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_git_tree_manifest_2026_10_30.py FAIL 1 0.21 AssertionError: row count mismatch: manifest 4255 vs live 4756 a2977f530cac2280e577fd9dac89176a1f0e6af0 L16:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_gitea_repos.py FAIL 1 0.34 73ef858149be5fd7e9ec58056435c3bd31f9419c L16:/root/.hermes
|
||||
gate-run wizard-work/ledger/verify_github_python_repos.py FAIL 1 3.35 6956aa9c1560e8b6bf85f239eb5da663797d0a70
|
||||
gate-run wizard-work/ledger/verify_issues.py PASS 0 0.08 176fd33f05223aaaf789608b662c3d253f685422 L15:/root/.hermes
|
||||
undeclared wizard-work/ledger/verify_issues_csv.py FAIL 1 0.16 IndexError: list index out of range dc6bf5e1b5d063ec54b917e581c47b58bcfc9a14
|
||||
gate-run wizard-work/ledger/verify_ledger_census.py FAIL 1 0.13 82b43f4bd2ea7afa2523c514caa0347dd77859dd L17:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_ledger_dir_census.py PASS 0 0.85 19021119834653f1b733844b6979ac6004060d3a
|
||||
gate-run wizard-work/ledger/verify_ledger_dir_census_2026_11_01.py PASS 0 0.76 12a8eba554bb0ba36fe183d2656bbee8b2130113
|
||||
gate-run wizard-work/ledger/verify_profile_census.py FAIL 1 10.51 fcfee7f22822f0ee680068dff9341725f018bf7f L16:/root/.hermes
|
||||
gate-run wizard-work/ledger/verify_python_org_repos.py FAIL 1 1.69 da60445425c431a6779fb2c3d9a457c2f1de888d L18:/root/.hermes
|
||||
gate-run wizard-work/ledger/verify_replies_catalog.py FAIL 1 0.14 NameError: name 'rerderive' is not defined. Did you mean: 'rederive'? 5b8f4c06c147db32a7f28717f6db4eff268c65ed L18:/root/troupe-standup
|
||||
undeclared wizard-work/ledger/verify_replies_index_2026-11-02.py PASS 0 0.15 5db9958fc71035419ff595c964967208824176a5 L13:/root/troupe-standup
|
||||
gate-run wizard-work/ledger/verify_reply_volume_census.py FAIL 1 0.12 4b37879a47f04625b61c7ce570d838f1114821a9
|
||||
gate-run wizard-work/ledger/verify_skill_catalog.py PASS 0 0.16 10d7d3b4f3d64317f315478c3e12bbea8338fd79 L19:/root/.hermes
|
||||
gate-run wizard-work/ledger/verify_stackchain_catalog.py FAIL 1 0.09 60aa1853a04b6340cc251e7e673350fdf28c9050 L16:/root/troupe-standup
|
||||
@@ -96,10 +100,14 @@ gate-run wizard-work/null/satkit-2026-10-26/verify_satkit.py PASS 0 4.17 dd58dc
|
||||
gate-run wizard-work/quill/verify_draft_compliance.py FAIL 1 0.24 2c7c86e2421fc39efea547f9a2eb6f3a86d8098f
|
||||
gate-run wizard-work/quill/verify_placeholder_ids.py PASS 0 0.18 d839200994d125cd760a601645dc75847dd242b5 L12:/root/troupe-standup
|
||||
gate-run wizard-work/quill/verify_standup_draft.py FAIL 1 0.20 IndexError: list index out of range 49e48b0b335cb01f3d3fecb069e71be6025b1a5c
|
||||
undeclared wizard-work/quill/verify_summary.py FAIL 1 0.12 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 64d473985f0425f58bfdb724a63962873216a996
|
||||
gate-run wizard-work/sol/class-triage-2026-10-31/verify_class_triage.py FAIL 1 0.15 dbea0cdfde5d607fe37fd8683e9b4c0013910c3d L14:/root/troupe-standup
|
||||
undeclared wizard-work/sol/verify_classify_audit.py PASS 0 0.08 b1365cebfc20a472e80a9165c4fb3b4f1c3099f8 L27:/root/.hermes
|
||||
gate-run wizard-work/sol/verify_daily_ledger_triage_check.py PASS 0 0.12 98d40061da0ce1b463cb52fd7d60d3601c08a798
|
||||
gate-run wizard-work/sol/verify_daily_triage_2026-10-27.py FAIL 1 0.46 458bb2425170b1d61e16d0596fe011e151491289 L21:/root/troupe-standup
|
||||
gate-run wizard-work/sol/verify_demands_class_triage_2026_10_31.py PASS 0 0.08 12f88088c9512a36a0a3a39b1de71c6a33a9fcdd
|
||||
undeclared wizard-work/sol/verify_fleet_classify.py FAIL 1 0.07 42eace187c81d0f87512f2f7b72e5e3c591d327f L20:/root/.hermes
|
||||
undeclared wizard-work/sol/verify_headline_classify_2026_11_02.py PASS 0 0.07 801288aacb5f2fedffed3ae7fd24cc3652086dbf L14:/root/troupe-standup
|
||||
gate-run wizard-work/sol/verify_pending_request_triage.py PASS 0 0.09 2d059319d3da0514bc72247ad7d1393039e5405d L11:/root/troupe-standup
|
||||
gate-run wizard-work/sol/verify_probe_retire_trip_2026_10_31.py FAIL 1 0.10 412470b6bfb023802482984285cf54363aa842b9 L21:/root/troupe-standup
|
||||
gate-run wizard-work/sol/verify_probe_set_2026_10_31.py FAIL 1 0.16 FileNotFoundError: [Errno 2] No such file or directory: '/root/troupe-standup/tools/inspect_tree.py' ccfe30c06068655fc668d8a72aaf84bd3fa12c71
|
||||
@@ -133,10 +141,10 @@ gate-run wizard-work/spark/verify_analyzer.py PASS 0 0.55 2f8143a2a0ec960bb7832
|
||||
gate-run wizard-work/spark/verify_artifact.py PASS 0 0.63 e11b957a4af381e69dee4a8c0a9685627a56153a L9:/root/troupe-standup
|
||||
gate-run wizard-work/spark/verify_check.py PASS 0 0.09 3b7ef86aa2f790eec4ab504b1261dfb695b9c759
|
||||
gate-run wizard-work/spark/verify_count.py PASS 0 0.08 640a65519f8116cc4ccc003c6ab4bb60fa16eb26 L5:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_csv.py PASS 0 0.08 277c099bbbf4fce2a63fae337606af926f936a75 L8:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_csv.py PASS 0 0.10 538f52b30a57d0db3c963197a08ad7dd3ab68bdf L15:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_demo.py PASS 0 0.08 7e4325553fc86aa30419c00f99d5c226d28750b3 L20:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_dir.py PASS 0 0.07 ec6280d194d416ebe8a8fbf681cd986fb41cad6d L23:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_dir_analyzer.py PASS 0 5.35 6abd27fd46878ec6935ab7901b67368c8312149c L9:/root/troupe-standup
|
||||
gate-run wizard-work/spark/verify_dir_analyzer.py PASS 0 19.35 eee83651c131d9fcc375f50af258e94320c9b0d5 L16:/root/troupe-standup
|
||||
gate-run wizard-work/spark/verify_env.py PASS 0 0.10 d28af1c48c1c426a0a4e7fe1fb724637ba80920b L9:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_environment.py FAIL 1 0.07 4f526b94ecdd6d9c084794eefd8b6291d3ab30c6 L22:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_fib.py PASS 0 0.08 163468d71cd7fea6c9e064b85d89da7bb7807c5d L24:/root/.hermes
|
||||
@@ -148,7 +156,7 @@ gate-run wizard-work/spark/verify_hermes_env.py PASS 0 0.09 f3256d5c09f02f45054
|
||||
gate-run wizard-work/spark/verify_hermes_import.py FAIL 1 0.08 6f2dc0f75c2616f84d54f1635deb0f11314fde37
|
||||
gate-run wizard-work/spark/verify_hermes_path.py PASS 0 0.08 385362b75cfedf35202ff48a7703bbd2381eb4a0 L11:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_hermes_setup.py FAIL 1 0.09 - Working directory is /root/troupe-standup/wizard-work/spark, expected /root 1756ed52437e304dde754e7fa909bfaccb333c5d L25:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_hermes_skill.py FAIL 1 0.12 ModuleNotFoundError: No module named 'hermes_tools' 3d2f5283eae4cbabd4d822b8af1cd7e5bca55c8a
|
||||
gate-run wizard-work/spark/verify_hermes_skill.py FAIL 1 0.20 ModuleNotFoundError: No module named 'hermes_tools' 691f35214183fa326516797eb06d9cfd987ed37d
|
||||
gate-run wizard-work/spark/verify_inventory.py FAIL 1 0.07 02b54c2c98fe8eaaf5ebebfc3155405a312ca6d6 L11:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_json.py PASS 0 0.11 71b343f0b1f3302ddd761b61c1c829ddaa5d85e5 L4:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_line_counter.py PASS 0 0.29 fbb011fd6ca999423a47a4786b5404eee290011d L7:/root/.hermes
|
||||
@@ -158,9 +166,9 @@ gate-run wizard-work/spark/verify_metrics.py PASS 0 0.19 901e7b06b2d51ed34476f7
|
||||
gate-run wizard-work/spark/verify_minimal.py PASS 0 0.09 2b1b18fc7ed7842925deb12ece9fa6fe681c3d2f L31:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_push.py PASS 0 0.08 707bdcb80646a8848ab3db4be908a36a083c0d54 L3:/root/troupe-standup
|
||||
gate-run wizard-work/spark/verify_python_env.py PASS 0 0.08 17c1d5f6ab0bcd691d87d737c262a8cdec3ecb29 L22:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_report.py FAIL 1 0.15 KeyError: 'summary' c670fb2ec37b78a01699df12b6f115368e45c94f L3:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_result.py PASS 0 0.08 79627980c59a6ec1816df3a2b00f3aa9543f6a5a L3:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_scratch_analysis.py PASS 0 0.08 3cda0dd2debdecbce03bb2fd29119e27ac1eb422 L6:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_report.py FAIL 1 0.15 KeyError: 'summary' 181d4185d520f296dc0129e148a42449ed47da56 L11:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_result.py PASS 0 0.08 061fe0c9693c29e59a1e9df171ec7560cd27c906 L11:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_scratch_analysis.py PASS 0 0.14 e70265309f4e43694507bd3d1326b80e6319cbd1 L13:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_skill_system.py FAIL 1 0.14 ModuleNotFoundError: No module named 'hermes_tools' 6739088b65208074b3a348642726a1c28982583a
|
||||
gate-run wizard-work/spark/verify_skills.py PASS 0 0.10 be69f202a8238afd3da7bfe26fe38fc0d99d04d4 L5:/root/.hermes
|
||||
gate-run wizard-work/spark/verify_skills2.py PASS 0 0.08 9dd92b966a6e1c950c588282a5d685dba25d3001 L6:/root/.hermes
|
||||
|
||||
|
Reference in new issue
Block a user