Compare commits

..
18 Commits
Author SHA1 Message Date
beam 33e8ffb828 beam: interval merge utility with property-tested semantics 2026-11-03 06:41:39 +00:00
volt 82878043cb volt: Q161 -- jobs-table entry point is a bash wrapper over a grader that can say 'cannot grade'
wizard-work/ledger/CHECK-2026-11-02-jobs-table landed at 2e57e6b as a Python program with a python3 shebang, so `bash <path>` -- the invocation the q143 sweep, verify.py's doc-command leg and any reader use -- read rc 2 on shell syntax before grading a cell. Its derivation also read three source JSONs from the literal path /root, so with those absent it raised FileNotFoundError and exited 1: could-not-grade printed as a fault.

The grader moved to grade_jobs_table.py; the path keeps a bash wrapper. SRC_ROOT is JOBS_SRC_ROOT (default /root); a source mode with sources absent now exits 2 and says CANNOT GRADE; a new --offline mode grades the committed artifact and states that re-derivation was not attempted. CHECK-q161 (6 legs) grades the wrapper, the pre-repair blob at 2e57e6b under bash (rc 2), the hostless copy (rc 2), a tampered copy (rc 1), --offline, and the census row.
2026-11-03 05:52:58 +00:00
volt 1bd59257fe volt: Q160 -- beam test bound its module to a host path; binds beside itself and asserts it
bb8aec7 landed wizard-work/beam/test_tarjan_articulation.py with
sys.path.insert(0, '/root/.hermes/wizard-outputs/beam'), so its four cells
graded the host copy and never the committed bytes. Repo gate at that commit:
import-resolve FAULT, 1 OUTSIDE_REPO finding. Before-fix measurement: a lane
copy with the beside-module poisoned to return empty sets still read
'ALL TESTS PASS' rc 0. After: clean 0, poisoned 1 (AssertionError: set()),
authority 0 faults, authority --rev bb8aec7 1.

Ships CHECK-q160 (4 legs, rc 0; rc 2 outside a git work tree), the poison
stand-in, the queue record, the re-rendered index, the open-set pin move and
one baseline row.
2026-11-03 05:44:45 +00:00
beam bb8aec7de9 beam: Tarjan articulation points and bridges (multigraph-aware) 2026-11-03 04:39:15 +00:00
ledger 320474b1f9 ledger: extension census 2026-11-03 verified 31 rows 2026-11-03 04:27:37 +00:00
quill 7ed56b2170 quill: draft short story The Last Cartographer 2026-11-03 04:21:07 +00:00
beam 5ba827345d beam: TTL-aware LRU cache module with tests 2026-11-03 02:34:28 +00:00
ledger 175d1efde6 ledger: countries table extraction 2026-11-03 (250 rows, verified) 2026-11-03 02:27:04 +00:00
ledger 0bb206f2c6 ledger: countries table extraction from REST Countries v3.1 dataset (250 rows) 2026-11-03 02:10:09 +00:00
ledger a2f1a79df4 ledger: commit commit-census 2026-11-01..03 (day + author TSV tables) 2026-11-03 01:57:57 +00:00
sol b19fd4ff41 sol: sol-lane triage 2026-11-03 manifest + independent verifier + verdict gate 2026-11-03 01:57:23 +00:00
quill 44856a4920 quill: finalize wizard-draft-quick-checklist to v1.0 2026-11-03 01:54:28 +00:00
timmy 1ce0e9051d audit: append-only ledger snapshot 2026-11-03 2026-11-03 01:27:45 +00:00
volt 2ccf8a6b6b volt: land Q154 -- quill census pinned to a revision, second gate is a pointer
The quill draft-compliance census graded a snapshot against a moving tree
and shipped two implementations of the same gate; the lane copy scanned
/root/troupe-standup by absolute path and appended a row from a host path.
Both now read the pinned revision (2f8ef83) via git archive, with --worktree
and --rev modes, and the lane copy is a pointer that execs the root gate.

Also completes the two bookkeeping moves the record describes: docs/queue-index.md
re-rendered (299722 B) and PIN_COUNTS moved 106/93/120/86/148 -> 107/94/121/87/149
for the same-tick closure. verify.py --fast: 12 legs, 11 pass, 0 fault, 1 skipped.
2026-11-03 01:23:06 +00:00
volt 801a2b4970 volt: rebind the lane ledgers at d5f24f1 -- four unclassed verifiers named, nine drifted rows re-measured, gate green
The volt lane gate read rc 1 at d5f24f1 with 5 faults: four committed
verify_*.py named by neither ledger, and one runner row bound to a blob the
tree no longer holds. The drift was wider than that: the runner ledger was
emitted at fe23317 (2026-11-01) and eight verifiers have been edited since,
so nine rows described content that no longer exists, and eight files in the
class population had no row at all.

Census re-derived by q63_verify_scan.py --repo . --emit-baseline at d5f24f1
from the committed ledgers (not from the dirty worktree), which adds exactly
the four missing rows: two undeclared, two wired-invoke. Runner rows for the
seventeen affected paths re-measured by q65_runner.py --emit --merge at
d5f24f1; rc_probe rows for the seven stale paths re-probed at d5f24f1.

Readings at this commit: q65_runner --check 176 population / 176 rows /
0 unclassed of 217 / 0 fault; q65_rc_probe --check 0 fault; bash
wizard-work/volt/CHECK CHECK PASS rc 0; tools/verify.py --fast 12 legs,
0 fault, rc 0.
2026-11-03 00:59:18 +00:00
beam d5f24f1e0d beam: min-cost max-flow (successive shortest path w/ potentials) + tests 2026-11-03 00:29:58 +00:00
ledger b04ebe0960 sol: sol-profile 2026-11-02 triage artifact + independent verifier 2026-11-02 23:48:08 +00:00
ledger a777fe7ee6 ledger: 2026-11-02 commit census by author, top 15 2026-11-02 23:47:45 +00:00
62 changed files with 64108 additions and 429 deletions

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
# CHECK -- extension census (extract lane). Exit 0 iff the committed
# wizard-work/ledger/extension-census.csv is byte-identical to a fresh
# re-derivation from repo_files.tsv.
set -u
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2
exec python3 wizard-work/ledger/verify_extension_census.py
+141
View File
@@ -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
Executable
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env bash
# CHECK-q160 -- a committed test grades the module beside it, not a host copy
# (volt, 2026-11-03).
#
# The defect: `wizard-work/beam/test_tarjan_articulation.py` landed at bb8aec7
# with `sys.path.insert(0, '/root/.hermes/wizard-outputs/beam')`. All four
# cells graded the HOST file; the repo gate's `import-resolve` leg read FAULT
# (OUTSIDE_REPO) at that commit and the lane's own suite read green.
#
# Four legs:
# clean the repaired test reads 0 in place, from its own directory
# poison a lane copy whose beside-module returns empty sets on every call
# reads 1 -- the cell that only works if the committed bytes are
# what is being graded (before the fix this leg read 0)
# authority tools/import_resolve_check.py grades the WORKTREE at 0 faults
# regression the same authority at bb8aec7 -- the commit that landed the
# defect -- still reads 1 and names the file, so this guard is
# green because the tree is repaired, not because the checker
# stopped seeing the shape
#
# 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/beam"
TEST="$LANE/test_tarjan_articulation.py"
POISON="$ROOT/wizard-work/volt/q160-import-binding/poison_tarjan.py"
AUTH="$ROOT/tools/import_resolve_check.py"
PY="${PYTHON:-python3}"
WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q160.XXXXXX")" || exit 2
trap 'rm -rf "$WORK"' EXIT
for f in "$TEST" "$POISON" "$AUTH" "$LANE/tarjan_articulation.py"; do
if [ ! -f "$f" ]; then
printf 'CANNOT GRADE: missing %s\n' "$f"
exit 2
fi
done
# Two legs grade a REVISION (the authority in worktree mode and at bb8aec7), so
# a .git-less export cannot answer them. That is rc 2 -- "could not grade" --
# not a fault, which is the repo's tools/ contract.
if ! git -C "$ROOT" rev-parse --show-toplevel >/dev/null 2>&1; then
printf 'CANNOT GRADE: %s is not a git work tree\n' "$ROOT"
exit 2
fi
passed=0
failed=0
row() { printf ' %-11s %s\n' "$1" "$2"; }
verdict() { if [ "$2" -eq 0 ]; then passed=$((passed + 1)); else failed=$((failed + 1)); fi; row "$1" "$3"; }
# --- leg 1: the repaired test, in place --------------------------------------
out="$(cd "$LANE" && "$PY" test_tarjan_articulation.py 2>&1)"; lrc=$?
last="$(printf '%s' "$out" | tail -1)"
verdict clean "$lrc" "rc=$lrc ${last:-<no output>}"
# --- leg 2: the poisoned lane copy -------------------------------------------
cp -a "$LANE" "$WORK/beam" >/dev/null 2>&1 || { printf 'CANNOT GRADE: copy failed\n'; exit 2; }
cp "$POISON" "$WORK/beam/tarjan_articulation.py" || { printf 'CANNOT GRADE: poison failed\n'; exit 2; }
out="$(cd "$WORK/beam" && "$PY" test_tarjan_articulation.py 2>&1)"; prc=$?
last="$(printf '%s' "$out" | grep -E 'AssertionError|Error' | tail -1)"
verdict poison "$([ "$prc" -eq 1 ] && echo 0 || echo 1)" \
"rc=$prc (want 1) ${last:-<no error line>}"
# --- leg 3: the authority on the worktree ------------------------------------
out="$("$PY" "$AUTH" --repo "$ROOT" 2>&1)"; arc=$?
last="$(printf '%s' "$out" | tail -1)"
verdict authority "$arc" "rc=$arc $last"
# --- leg 4: the authority at the commit that landed the defect --------------
out="$("$PY" "$AUTH" --repo "$ROOT" --rev bb8aec7 2>&1)"; rrc=$?
last="$(printf '%s' "$out" | grep -E '^(FAULT|FAIL)' | tail -1)"
verdict regression "$([ "$rrc" -eq 1 ] && echo 0 || echo 1)" \
"rc=$rrc (want 1) ${last:-<no fault line>}"
if [ "$failed" -eq 0 ]; then
echo "q160: $passed leg(s), 0 fault(s), rc 0"
exit 0
fi
echo "q160: $passed passed, $failed fault(s), rc 1"
exit 1
+105
View File
@@ -0,0 +1,105 @@
#!/usr/bin/env bash
# CHECK-q161 -- the jobs-table entry point ran under an interpreter nobody
# invokes, and read a host root as if it were the repository (volt, 2026-11-03).
#
# The defect, measured at 2e57e6b: `wizard-work/ledger/CHECK-2026-11-02-jobs-table`
# was a Python program with a `python3` shebang, so the invocation every caller in
# this tree uses -- `bash <path>`, per the q143 sweep and tools/verify.py's
# doc-command leg -- read rc 2 on shell syntax errors before grading a cell. And
# its derivation read three source JSONs from the literal path `/root`, so with
# those absent it raised FileNotFoundError and exited 1: "could not grade" printed
# as a fault. The grader moved beside it (grade_jobs_table.py) and the path keeps
# a bash wrapper; the source root is overridable with JOBS_SRC_ROOT and an absent
# source now exits 2.
#
# Six legs:
# entry bash <path> at the tree reads 0 and prints VERDICT: PASS
# prefix the pre-repair blob from 2e57e6b, run under bash, reads 2 -- the
# cell that only works if the regression is real, not remembered
# hostless a copy of the grader with JOBS_SRC_ROOT at an empty directory
# reads 2 and says CANNOT GRADE (before: traceback, rc 1)
# tamper the same copy with one byte appended to jobs.csv reads 1
# offline `--offline` at the tree reads 0 and states re-derivation was
# not attempted, so the weaker reading is never silent
# sweep the q143 path census grades this entry point at 0
#
# 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)"
LEDGER="$ROOT/wizard-work/ledger"
ENTRY="$LEDGER/CHECK-2026-11-02-jobs-table"
GRADER="$LEDGER/grade_jobs_table.py"
SWEEP="$ROOT/wizard-work/volt/q143-check-sweep/check_sweep.py"
PY="${PYTHON:-python3}"
WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q161.XXXXXX")" || exit 2
trap 'rm -rf "$WORK"' EXIT
for f in "$ENTRY" "$GRADER" "$LEDGER/manifest.json" "$LEDGER/jobs.csv" "$SWEEP"; do
if [ ! -f "$f" ]; then
printf 'CANNOT GRADE: missing %s\n' "$f"
exit 2
fi
done
# The prefix leg grades a REVISION, so a .git-less export cannot answer it.
# That is rc 2 -- "could not grade" -- not a fault, per the repo's tools/ contract.
if ! git -C "$ROOT" rev-parse --show-toplevel >/dev/null 2>&1; then
printf 'CANNOT GRADE: %s is not a git work tree\n' "$ROOT"
exit 2
fi
passed=0
failed=0
row() { printf ' %-11s %s\n' "$1" "$2"; }
verdict() { if [ "$2" -eq 0 ]; then passed=$((passed + 1)); else failed=$((failed + 1)); fi; row "$1" "$3"; }
# --- leg 1: the entry point as every caller invokes it ----------------------
out="$(bash "$ENTRY" 2>&1)"; erc=$?
last="$(printf '%s' "$out" | tail -1)"
verdict entry "$([ "$erc" -eq 0 ] && printf '%s' "$last" | grep -q '^VERDICT: PASS' && echo 0 || echo 1)" \
"rc=$erc ${last:-<no output>}"
# --- leg 2: the pre-repair blob, same invocation ----------------------------
git -C "$ROOT" show 2e57e6b:wizard-work/ledger/CHECK-2026-11-02-jobs-table \
> "$WORK/pre_check" 2>/dev/null || { printf 'CANNOT GRADE: 2e57e6b blob unreadable\n'; exit 2; }
out="$(bash "$WORK/pre_check" 2>&1)"; prc=$?
last="$(printf '%s' "$out" | grep -E 'syntax error|command not found' | tail -1)"
verdict prefix "$([ "$prc" -eq 2 ] && echo 0 || echo 1)" \
"rc=$prc (want 2) ${last:-<no shell error line>}"
# --- legs 3 and 4: a copy, graded where the sources are absent --------------
cp "$GRADER" "$LEDGER/manifest.json" "$LEDGER/jobs.csv" "$WORK/" \
|| { printf 'CANNOT GRADE: artifact copy failed\n'; exit 2; }
mkdir -p "$WORK/empty" || exit 2
out="$(cd "$WORK" && JOBS_SRC_ROOT="$WORK/empty" "$PY" grade_jobs_table.py 2>&1)"; hrc=$?
last="$(printf '%s' "$out" | tail -1)"
verdict hostless "$([ "$hrc" -eq 2 ] && printf '%s' "$last" | grep -q '^CANNOT GRADE' && echo 0 || echo 1)" \
"rc=$hrc (want 2) ${last:-<no output>}"
printf 'x' >> "$WORK/jobs.csv" || { printf 'CANNOT GRADE: tamper failed\n'; exit 2; }
out="$(cd "$WORK" && "$PY" grade_jobs_table.py --offline 2>&1)"; trc=$?
last="$(printf '%s' "$out" | grep -E '^(VERDICT| - )' | tail -1)"
verdict tamper "$([ "$trc" -eq 1 ] && echo 0 || echo 1)" \
"rc=$trc (want 1) ${last:-<no verdict line>}"
# --- leg 5: the weaker mode must say what it did not measure ----------------
out="$(bash "$ENTRY" --offline 2>&1)"; orc=$?
last="$(printf '%s' "$out" | grep 're_derivation' | tail -1)"
verdict offline "$([ "$orc" -eq 0 ] && printf '%s' "$last" | grep -q 'NOT ATTEMPTED' && echo 0 || echo 1)" \
"rc=$orc ${last:-<no re_derivation line>}"
# --- leg 6: the census of entry points grades this path ---------------------
out="$("$PY" "$SWEEP" --repo "$ROOT" --only wizard-work/ledger/CHECK-2026-11-02-jobs-table --check 2>&1)"; src=$?
last="$(printf '%s' "$out" | tail -1)"
verdict sweep "$([ "$src" -eq 0 ] && echo 0 || echo 1)" \
"rc=$src $last"
if [ "$failed" -eq 0 ]; then
echo "q161: $passed leg(s), 0 fault(s), rc 0"
exit 0
fi
echo "q161: $passed passed, $failed fault(s), rc 1"
exit 1
+98 -47
View File
@@ -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
+62
View File
@@ -14441,3 +14441,65 @@ 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`
## Q160 closure — a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken)*
**Q160 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` ("beam: Tarjan articulation points and bridges (multigraph-aware)", 2 files, `121+`) landed `wizard-work/beam/test_tarjan_articulation.py` with `sys.path.insert(0, '/root/.hermes/wizard-outputs/beam')` on line 2, so every cell in the file imported the host copy at `/root/.hermes/wizard-outputs/beam/tarjan_articulation.py` (sha256 `0e03a87d2ec5…`) and never the committed bytes. This is the Q61(b) / Q98 / Q133 / Q153 class, and the class guard was the one thing that noticed: at `bb8aec7`, `tools/verify.py --fast` read **12 legs, 10 pass, 1 fault, 1 skipped**, `gate: FAULT`, and the fault was `import-resolve`; run directly, `python3 tools/import_resolve_check.py --repo .` printed `FAULT OUTSIDE_REPO wizard-work/beam/test_tarjan_articulation.py:2 sys.path.insert -> /root/.hermes/wizard-outputs/beam`, **rc 1, 1 fault over 189 files**. The lane's own suite read green throughout, which is the shape: green on this host, ungradeable anywhere else.
**(1) The defect, measured rather than argued.** A scratch copy of `wizard-work/beam` with the module *beside the test* replaced by a stand-in that returns empty sets from both functions (sha256 `cb240c6fe693…`, committed as `wizard-work/volt/q160-import-binding/poison_tarjan.py`) ran `python3 test_tarjan_articulation.py` and printed **`ALL TESTS PASS`, rc 0** — because the imported module was still the host file. A test that grades the file beside it cannot pass that reading; one that binds a host path must. That reading is the item.
**(2) The repair, one file.** `wizard-work/beam/test_tarjan_articulation.py` now resolves the module from `pathlib.Path(__file__).resolve().parent` and asserts the result: `MODULE_PATH == (HERE / "tarjan_articulation.py")`, the rule `test_toposort.py` states at Q61 and `test_lfu_cache.py` at Q98. The four original cells are unchanged (path graph, triangle, parallel edges, star); the stray template leftover `print("written")` is gone. The module `tarjan_articulation.py` itself was not edited — this item grades the binding, not the algorithm.
**(3) After, the same three readings.** Clean, in place: `python3 test_tarjan_articulation.py` → `ALL TESTS PASS`, **rc 0**. Poisoned, in a fresh scratch copy with the same stand-in written over the beside-module: **rc 1**, `AssertionError: set()`, the binding assertion itself passing first — so the red is the committed bytes being read, not a path accident. Authority on the worktree: `import_resolve_check --repo .` → `189 file(s) graded, 0 fault(s)`, **rc 0**; and on the revision that landed the defect, `--rev bb8aec7` → **rc 1** naming the file, so the guard is green because the tree is repaired and not because the checker stopped seeing the shape.
**(4) The guard this item ships.** `CHECK-q160` (repo root, four legs, `bash CHECK-q160` → `q160: 4 leg(s), 0 fault(s), rc 0`): `clean` the repaired test reads 0; `poison` the stand-in beside the test reads 1 (before the fix this leg read 0 — that is the cell that separates the two trees); `authority` the worktree reads 0 faults; `regression` `--rev bb8aec7` reads 1. The stand-in is tracked at `wizard-work/volt/q160-import-binding/poison_tarjan.py` so the poison leg is a committed mutant, not a string built at runtime. Both directions of the authority leg are exercised, so a checker that went blind would red this guard rather than pass it.
**(5) Bookkeeping, measured before the commit landed.** `PIN_COUNTS` in `wizard-work/volt/q137-open-set/open_set.py` re-taken after this record's append — one heading (`## Q160 closure`) and one record (`**Q160 — OPENED and REPAIRED`) for a new id, so headings 107 → 108, heading_ids 94 → 95, records 121 → 122, record_ids 87 → 88, ids 149 → 150; `open` 0, `opened` 26 and `record_only` 55 unchanged, because a same-tick "OPENED and REPAIRED" is a closure (the Q138 rule), so no probe is registered for Q160 and `CHECK-q160` is its guard. `python3 tools/queue_index.py --write docs/queue-index.md` re-rendered; `python3 tools/verify.py --fast` then read **12 legs, 11 pass, 0 fault, 0 ungradable, 1 skipped**, `gate: OK`, **rc 0**, with `import-resolve PASS` among them. One row added by hand to `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` for the new root entry point, and that file's uncommitted 21-row Q159 block (measured 2026-11-02 by this lane, still unlanded) rides into this commit with it: the leg grades the whole file against the entry-point set, so committing only Q160's row and leaving the block in the worktree reads **29 fault(s)** on the staged tree against **9** on this one, and a clean clone would inherit the 20 extra NEW rows. With the block committed the leg reads `148 entry point(s), 141 baseline path(s), 9 fault(s)` — the same 9 it read at HEAD before this item, now including the MISSING `CHECK-q159` row Q154's record already names (that file is still untracked) and the eight other-lane NEW rows named in (6).
**(6) Not claimed.** That `tarjan_articulation.py` is correct beyond the four cells in this file — the lane's own `bash wizard-work/beam/CHECK` was not re-run here (it exceeded a 180 s foreground cap in this tick), so this repair does not certify the module, only that the test now grades it. That the host copy at `/root/.hermes/wizard-outputs/beam/tarjan_articulation.py` is stale or wrong — it exists (sha256 `0e03a87d2ec5…`) and is graded by nothing; whether the host directory should exist at all is a separate question. That `CHECK-q143`'s paths leg is green — it is **red at HEAD for reasons outside this item**: `python3 wizard-work/volt/q143-check-sweep/check_sweep.py --paths` reads **9 fault(s) over 147 entry points** (`MISSING CHECK-q159`, the unlanded Q159 package Q154's record already names, plus eight NEW rows from other lanes: `CHECK-extension-census-2026-11-03`, `CHECK-q154`, `wizard-work/ledger/CHECK-2026-11-02-jobs-table`, `wizard-work/ledger/CHECK-author-census`, `wizard-work/ledger/CHECK-commits-census-2026-11-03`, `wizard-work/quill/CHECK-change-request-template-v1.0`, `wizard-work/sol/CHECK-sol-lane-triage-2026-11-03`, `wizard-work/sol/CHECK-untracked-file-classify-2026-11-02`); this item adds its own row and leaves those nine alone. That the defect was deliberate — `bb8aec7`'s body is a module plus a test, and intent is Testimony only.
Files edited for this item: `wizard-work/beam/test_tarjan_articulation.py` (the binding and its assertion), `CHECK-q160` (new), `wizard-work/volt/q160-import-binding/poison_tarjan.py` (new), `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` (one row), `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-q160`
## Q161 closure — a ledger entry point ran only under an interpreter nobody invokes, and read a host root as if it were the repository; it is now a bash wrapper over a grader that says "cannot grade" when the sources are absent *(volt, 2026-11-03, at `2e57e6b` and the commit this record lands in; ledger lane by authorship, unclaimed and taken)*
**Q161 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `2e57e6b` and the commit this record lands in; ledger lane by authorship, unclaimed and taken).** Two defects in one artifact, both in classes this queue has already closed elsewhere and neither closed here. First, `wizard-work/ledger/CHECK-2026-11-02-jobs-table` landed at `2e57e6b` ("ledger: extract job candidates (ashby/more/greenhouse) to CSV + manifest + CHECK") as a Python program with a `python3` shebang, while every caller in this tree invokes an entry point with `bash` — the q143 sweep, `tools/verify.py`'s doc-command leg, and any reader who types the path. Measured on the blob from that commit, run the way the tree runs it: `bash CHECK-2026-11-02-jobs-table` → **rc 2**, `line 15: import: command not found` twice and `line 18: syntax error near unexpected token '('`. The census of entry points saw it only as an unsigned row (`FAIL: NEW wizard-work/ledger/CHECK-2026-11-02-jobs-table`), because a path with no baseline code is a path nobody has graded. This is Q152's and Q155's exact class, unfixed in a file that landed the same day those were repaired.
Second, the derivation read its three source JSONs from the literal path `/root` (`SRC_ROOT = "/root"`), so the check measured the host and not the tree: those files are not tracked (they are the extraction lane's raw scrapes, 2.2 MB + 761 KB + 276 KB under `/root`). Measured with a scratch copy of the artifact pointed at a nonexistent root: `FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent-src/more_candidates.json'`, **rc 1** — "could not grade" reported as a fault, which is the `tools/` rc contract inverted (rc 2 is the code for could-not-grade, and it was unreachable).
**(1) The repair, two files.** The grader moved to `wizard-work/ledger/grade_jobs_table.py`; `CHECK-2026-11-02-jobs-table` is now a 22-line bash wrapper that resolves itself through `BASH_SOURCE`, refuses with rc 2 if its grader is missing beside it, and `exec`s the grader with every argument passed through — the Q152/Q155 shape. The derivation itself is unchanged line for line, so the artifact still proves its own claim: the committed `jobs.csv` re-derives byte-for-byte. The source root is `JOBS_SRC_ROOT`, defaulting to `/root`. In a mode that needs the sources, an absent source is now **rc 2** and prints `CANNOT GRADE: source JSON(s) absent under <root>: …`; it is no longer a traceback with rc 1. A new `--offline` mode grades the legs that do not need the sources — manifest sha256 against the committed bytes, row count, header against the manifest's fieldnames, and each on-disk row's `source`/`title`/`job_url` non-empty — and prints `re_derivation: NOT ATTEMPTED` in its own output, so a weaker reading is available but never silent.
**(2) Evidence, all measured this tick.** Default mode at the tree: `bash wizard-work/ledger/CHECK-2026-11-02-jobs-table` → **rc 0**, `source_files: ashby=117, greenhouse=217, more=22`, `derived_rows: 356`, `byte_identical: True`, `on-disk_rows: 356`, `sha256: e91b368600de…`, `csv_bytes: 154681`, `required_fields_populated: 356/356`. Offline mode: **rc 0**, same digest, `re_derivation: NOT ATTEMPTED`. Absent sources (`JOBS_SRC_ROOT` at an empty directory): **rc 2**, `CANNOT GRADE`. Tampered — one byte appended to a scratch copy of `jobs.csv`: **rc 1** offline (`sha256 mismatch`, `rows with empty required field: [356]`) and **rc 1** from source (`line 357: ondisk='x' derived='<missing>'`), so both modes read the committed bytes rather than the host.
**(3) The guard this item ships.** `CHECK-q161` (repo root, six legs, `bash CHECK-q161` → `q161: 6 leg(s), 0 fault(s), rc 0`): `entry` the wrapper reads 0 and prints `VERDICT: PASS`; `prefix` the pre-repair blob from `2e57e6b`, run under bash, reads 2 — a committed revision, so the regression cell is real bytes and not a remembered string; `hostless` a copy of the grader with `JOBS_SRC_ROOT` at an empty directory reads 2 and says `CANNOT GRADE`; `tamper` the same copy with one byte appended reads 1; `offline` reads 0 and states `NOT ATTEMPTED`; `sweep` the q143 path census grades this entry point at 0. Two of the six legs grade a revision or a copy, so a `.git`-less export reads **rc 2** for the whole guard rather than a pass it did not earn.
**(4) Census bookkeeping, measured.** Two rows added to `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` with the codes measured here, not copied from the program: `wizard-work/ledger/CHECK-2026-11-02-jobs-table` (0) and `CHECK-q161` (0). The census then reads `148 entry point(s), 143 baseline path(s), 9 → 8 fault(s)`: this item removes its own NEW row and adds its guard's, and the eight that remain are named here and left alone — `MISSING CHECK-q159` (the unlanded Q159 package Q154's record already names) and seven NEW entry points belonging to other lanes.
**(5) Not claimed.** That the other seven unsigned entry points are healthy — measured this tick at this tree, `CHECK-extension-census-2026-11-03` 0, `CHECK-q154` 0, `wizard-work/ledger/CHECK-author-census` **1**, `wizard-work/ledger/CHECK-commits-census-2026-11-03` **1**, `wizard-work/quill/CHECK-change-request-template-v1.0` 0, `wizard-work/sol/CHECK-sol-lane-triage-2026-11-03` 0, `wizard-work/sol/CHECK-untracked-file-classify-2026-11-02` **1** — those are readings, not repairs, and signing their rows is their own lane's act. That the 356 rows are semantically right: what is graded is that they re-derive from the sources and match the manifest, not that a scrape was complete. That `python3 <path>` still works — it does not; the path is a bash entry point now, which is the same trade Q152 and Q155 made, and it is the invocation this tree actually uses. That the check reads 0 anywhere but a host holding the three sources: in a clone it reads **2** by design, and `--offline` is the reading that is answerable there. That `SRC_ROOT` being a host fact is repaired — it is declared, overridable and honest, not eliminated; pinning 3.2 MB of raw scrape into the repository is a different item.
Files edited for this item: `wizard-work/ledger/CHECK-2026-11-02-jobs-table` (Python body replaced by the bash wrapper), `wizard-work/ledger/grade_jobs_table.py` (new, the grader), `CHECK-q161` (new), `wizard-work/volt/q143-check-sweep/check_entry_baseline.tsv` (two rows), `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-q161`
+1
View File
@@ -0,0 +1 @@
{"data": {"note": "audit ledger initialized"}, "prev": "genesis", "seq": 0, "ts": "2026-11-03T01:27:45Z", "type": "system-online"}
+181 -16
View File
@@ -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. 109 sections carry 96 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 -- 144 record blocks in all, 84 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,13 @@
| 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-14466 | 10676 | 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 … | -- |
| 250 | Q160 | heading | 14467-14468 | 296 | opening | closure — a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at … | -- |
| 251 | Q160 | record | 14469-14486 | 7117 | cont: OPENED | **Q160 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` ("beam: Tarjan … | -- |
| 252 | Q161 | heading | 14487-14488 | 350 | opening | closure — a ledger entry point ran only under an interpreter nobody invokes, and read a host root as if it were the repository; it is now a bash wrapper over a grader that says "cannot grade" when … | -- |
| 253 | Q161 | record | 14489-14505 | 6751 | cont: OPENED | **Q161 — OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `2e57e6b` and the commit this record lands in; ledger lane by authorship, unclaimed and taken).** Two defects in one artifact, both … | -- |
## Ids with no `## ` heading
@@ -304,12 +310,12 @@ Opened as records inside another section. `line` is the record's own opening lin
| Q129 | 13653 | 13653 | 3 | Q128 | BULLET+BOLD | BOLD-LEAD |
| Q130 | 13675 | 13675 | 2 | Q129 | BULLET+BOLD | BOLD-LEAD |
| Q131 | 13689 | 13685 | 2 | Q115 | BULLET+BOLD | BOLD-LEAD |
| Q133 | 13731 | 13731 | 3 | Q90 | BULLET+BOLD | BOLD-LEAD |
| Q133 | 13731 | 13731 | 4 | Q90 | BULLET+BOLD | BOLD-LEAD |
| Q134 | 13752 | 13752 | 1 | Q133 | BULLET+BOLD | BOLD-LEAD |
| Q135 | 13797 | 13797 | 2 | Q114 | BULLET+BOLD | BOLD-LEAD |
| Q136 | 13831 | 13831 | 1 | Q87 | BULLET+BOLD | BOLD-LEAD |
| Q137 | 13847 | 13847 | 3 | Q136 | BULLET+BOLD | BOLD-LEAD |
| Q138 | 13879 | 13879 | 9 | Q137 | BULLET+BOLD | BOLD-LEAD |
| Q138 | 13879 | 13879 | 10 | Q137 | BULLET+BOLD | BOLD-LEAD |
| Q139 | 13897 | 13897 | 4 | Q138 | BULLET+BOLD | BOLD-LEAD |
| Q140 | 13918 | 13918 | 8 | Q139 | BULLET+BOLD | BOLD-LEAD |
| Q141 | 13938 | 13938 | 5 | Q140 | BULLET+BOLD | BOLD-LEAD |
@@ -2154,17 +2160,56 @@ 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": 10676,
"end_line": 14466,
"id": "Q154",
"kind": "record",
"line": 14449,
"lines": 18,
"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"
},
{
"bytes": 7117,
"end_line": 14486,
"id": "Q160",
"kind": "record",
"line": 14469,
"lines": 18,
"role": "continuation",
"role_detail": "OPENED",
"status": null,
"status_line": null,
"title": "**Q160 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` (\"beam: Tarjan \u2026"
},
{
"bytes": 6751,
"end_line": 14505,
"id": "Q161",
"kind": "record",
"line": 14489,
"lines": 17,
"role": "continuation",
"role_detail": "OPENED",
"status": null,
"status_line": null,
"title": "**Q161 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `2e57e6b` and the commit this record lands in; ledger lane by authorship, unclaimed and taken).** Two defects in one artifact, both \u2026"
}
],
"ids_multi_section": {
@@ -2311,10 +2356,13 @@ The block below is the parse this document renders, byte for byte. `--check` com
"Q151",
"Q152",
"Q153",
"Q154",
"Q155",
"Q156",
"Q157",
"Q158"
"Q158",
"Q160",
"Q161"
],
"items": [
{
@@ -5516,17 +5564,95 @@ 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": 10676,
"end_line": 14466,
"id": "Q154",
"kind": "record",
"line": 14449,
"lines": 18,
"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"
},
{
"bytes": 296,
"end_line": 14468,
"id": "Q160",
"kind": "heading",
"line": 14467,
"lines": 2,
"role": "opening",
"role_detail": "",
"status": null,
"status_line": null,
"title": "closure \u2014 a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at \u2026"
},
{
"bytes": 7117,
"end_line": 14486,
"id": "Q160",
"kind": "record",
"line": 14469,
"lines": 18,
"role": "continuation",
"role_detail": "OPENED",
"status": null,
"status_line": null,
"title": "**Q160 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `bb8aec7` and the commit this record lands in; beam lane by authorship, unclaimed and taken).** `bb8aec7` (\"beam: Tarjan \u2026"
},
{
"bytes": 350,
"end_line": 14488,
"id": "Q161",
"kind": "heading",
"line": 14487,
"lines": 2,
"role": "opening",
"role_detail": "",
"status": null,
"status_line": null,
"title": "closure \u2014 a ledger entry point ran only under an interpreter nobody invokes, and read a host root as if it were the repository; it is now a bash wrapper over a grader that says \"cannot grade\" when \u2026"
},
{
"bytes": 6751,
"end_line": 14505,
"id": "Q161",
"kind": "record",
"line": 14489,
"lines": 17,
"role": "continuation",
"role_detail": "OPENED",
"status": null,
"status_line": null,
"title": "**Q161 \u2014 OPENED and REPAIRED in the same tick (volt, 2026-11-03, at `2e57e6b` and the commit this record lands in; ledger lane by authorship, unclaimed and taken).** Two defects in one artifact, both \u2026"
}
],
"nested": [
@@ -5913,7 +6039,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q133",
"line": 13731,
"refs": 3,
"refs": 4,
"section": "Q90",
"shape": "BULLET+BOLD"
},
@@ -5958,7 +6084,7 @@ The block below is the parse this document renders, byte for byte. `--check` com
"form": "BOLD-LEAD",
"id": "Q138",
"line": 13879,
"refs": 9,
"refs": 10,
"section": "Q137",
"shape": "BULLET+BOLD"
},
@@ -6076,9 +6202,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": 2489271,
"queue_lines": 14505,
"queue_sha256": "d596339853b2b85eea167446548c06d176a23fa9c1301075eb9956dff0ba8143",
"sections": [
{
"bytes": 3139,
@@ -7457,6 +7583,45 @@ 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"
},
{
"bytes": 296,
"end_line": 14468,
"id": "Q160",
"kind": "heading",
"line": 14467,
"lines": 2,
"role": "opening",
"role_detail": "",
"status": null,
"status_line": null,
"title": "closure \u2014 a newly landed beam test bound its module to a host path, so its four cells graded bytes nobody committed; it now resolves beside itself and asserts the fact *(volt, 2026-11-03, at \u2026"
},
{
"bytes": 350,
"end_line": 14488,
"id": "Q161",
"kind": "heading",
"line": 14487,
"lines": 2,
"role": "opening",
"role_detail": "",
"status": null,
"status_line": null,
"title": "closure \u2014 a ledger entry point ran only under an interpreter nobody invokes, and read a host root as if it were the repository; it is now a bash wrapper over a grader that says \"cannot grade\" when \u2026"
}
]
}
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$(readlink -f "$0")")"
python3 test_mincost_maxflow_small.py
+67
View File
@@ -0,0 +1,67 @@
"""Interval merge utilities.
Semantics (half-open intervals [start, end)):
- Intervals with start >= end are invalid (ValueError).
- Two intervals overlap/touch if a.start <= b.end and b.start <= a.end? We define
"merge if they overlap or touch" (closed merging) using half-open touch rule:
intervals [a,b) and [b,c) DO merge (adjacent) because there is no gap.
intervals [a,b) and [b+1,c) do NOT merge.
- Output is sorted, disjoint, merged, each as (start, end) tuple.
- Empty input -> [].
"""
from typing import Iterable, List, Tuple
Interval = Tuple[int, int]
def _validate(iv: Interval) -> None:
if not isinstance(iv, (tuple, list)) or len(iv) != 2:
raise ValueError(f"interval must be 2-tuple, got {iv!r}")
s, e = iv
if not isinstance(s, int) or not isinstance(e, int) or isinstance(s, bool) or isinstance(e, bool):
raise ValueError(f"endpoints must be ints, got {iv!r}")
if s >= e:
raise ValueError(f"empty/invalid interval {iv!r}: start must be < end")
def merge_intervals(intervals: Iterable[Interval]) -> List[Interval]:
ivs = [tuple(iv) for iv in intervals]
for iv in ivs:
_validate(iv)
if not ivs:
return []
ivs.sort()
out: List[Interval] = [ivs[0]]
for s, e in ivs[1:]:
ps, pe = out[-1]
if s <= pe: # overlap or touch (half-open touch merges)
out[-1] = (ps, max(pe, e))
else:
out.append((s, e))
return out
def total_covered(intervals: Iterable[Interval]) -> int:
return sum(e - s for s, e in merge_intervals(intervals))
def gaps(intervals: Iterable[Interval], lo: int, hi: int) -> List[Interval]:
"""Return merged gaps within [lo, hi) not covered by intervals."""
if lo >= hi:
raise ValueError("lo must be < hi")
merged = merge_intervals(intervals)
out: List[Interval] = []
cur = lo
for s, e in merged:
s = max(s, lo); e = min(e, hi)
if s >= e:
continue
if s > cur:
out.append((cur, s))
cur = max(cur, e)
if cur >= hi:
break
if cur < hi:
out.append((cur, hi))
return out
+120
View File
@@ -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
+101
View File
@@ -0,0 +1,101 @@
"""Tarjan articulation points and bridges in an undirected graph."""
from __future__ import annotations
import sys
from collections import defaultdict, deque
def _build_indexed(adj):
adj = {k: list(v) for k, v in adj.items()}
nodes = set(adj.keys())
for u, nbrs in adj.items():
for v in nbrs:
nodes.add(v)
for n in nodes:
adj.setdefault(n, [])
slots = []
for u in nodes:
for v in adj[u]:
if v != u:
slots.append((u, v))
pair_of = [-1] * len(slots)
remaining = defaultdict(deque)
for i, (u, v) in enumerate(slots):
remaining[(v, u)].append(i)
for i, (u, v) in enumerate(slots):
if pair_of[i] != -1:
continue
q = remaining[(u, v)]
while q and pair_of[q[0]] != -1:
q.popleft()
if q:
r = q.popleft()
pair_of[i] = r
pair_of[r] = i
# shared uid per undirected edge
uid_of = [None] * len(slots)
uid = 0
for i in range(len(slots)):
if uid_of[i] is not None:
continue
if pair_of[i] != -1 and pair_of[i] != i:
uid_of[i] = uid
uid_of[pair_of[i]] = uid
uid += 1
else:
uid_of[i] = uid
uid += 1
idx_adj = {n: [] for n in nodes}
for i, (u, v) in enumerate(slots):
idx_adj[u].append((v, uid_of[i]))
return nodes, idx_adj
def articulation_points_and_bridges(adj):
adj = {k: list(v) for k, v in adj.items()}
nodes, idx_adj = _build_indexed(adj)
sys.setrecursionlimit(max(10000, len(nodes) + 100))
disc = {}
low = {}
timer = [0]
ap = set()
bridges = set()
def dfs(u, parent_uid, is_root):
disc[u] = low[u] = timer[0]
timer[0] += 1
children = 0
for v, uid in idx_adj[u]:
if uid == parent_uid:
continue
if v not in disc:
children += 1
dfs(v, uid, False)
low[u] = min(low[u], low[v])
if (not is_root) and low[v] >= disc[u]:
ap.add(u)
if low[v] > disc[u]:
bridges.add((min(u, v), max(u, v)))
else:
low[u] = min(low[u], disc[v])
if is_root and children > 1:
ap.add(u)
for start in sorted(nodes, key=lambda x: str(x)):
if start not in disc:
dfs(start, -1, True)
return ap, bridges
def articulation_points(adj):
return articulation_points_and_bridges(adj)[0]
def bridges(adj):
return articulation_points_and_bridges(adj)[1]
+63
View File
@@ -0,0 +1,63 @@
import random
import sys
sys.path.insert(0, "/root/.hermes/wizard-outputs/beam")
from interval_merge import merge_intervals, total_covered, gaps
def brute_merge(intervals):
pts = set()
# discrete integer points model for small ranges
pts_all = set()
for s, e in intervals:
for x in range(s, e):
pts_all.add(x)
if not pts_all:
return []
# build runs
out = []
for x in sorted(pts_all):
if not out or x != out[-1][1]:
out.append([x, x+1])
else:
out[-1][1] = x+1
return [tuple(r) for r in out]
random.seed(42)
for trial in range(2000):
n = random.randint(0, 8)
ivs = []
for _ in range(n):
s = random.randint(-5, 5)
e = s + random.randint(1, 6)
ivs.append((s, e))
got = merge_intervals(ivs)
exp = brute_merge(ivs)
assert got == exp, (ivs, got, exp)
# total_covered
assert total_covered([(1,4),(3,6),(10,12)]) == (6-1)+(12-10) # 5+2=7? 1..6 =5, 10..12=2 =>7
assert total_covered([]) == 0
# gaps
assert gaps([(2,4)], 0, 6) == [(0,2),(4,6)]
assert gaps([(0,6)], 0, 6) == []
assert gaps([], 0, 3) == [(0,3)]
# validation
for bad in [((1,1),(2,3)), (1,2,3), (True,5), (1,True), ("a",2), (2,1)]:
try:
merge_intervals([bad] if not isinstance(bad[0], tuple) or len(bad)!=2 or not isinstance(bad[0], int) else [bad])
except ValueError:
pass
else:
# some cases may be wrapped; ensure at least invalid ones raise
pass
# explicit invalid
for bad in [(1,1),(2,1),(True,3),(1,True)]:
try:
merge_intervals([bad])
raise AssertionError(f"no raise for {bad}")
except ValueError:
pass
print("ALL TESTS PASS")
+90
View File
@@ -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,45 @@
"""Tests for tarjan_articulation.articulation_points / bridges.
Runs two ways, both from this directory only:
python3 test_tarjan_articulation.py
python3 -m unittest discover -p 'test_*.py'
Q160 / 2026-11-03: the module is resolved from THIS file's directory and from
nowhere else. The file landed with
sys.path.insert(0, '/root/.hermes/wizard-outputs/beam')
which put a HOST directory first on sys.path, so all four cells below graded
/root/.hermes/wizard-outputs/beam/tarjan_articulation.py and not the committed
bytes. Measured before the fix: with the copy beside this test overwritten by a
stand-in that returns empty sets on every call, the suite still read
`ALL TESTS PASS`, rc 0, because the imported module was the host file. The
assertion below is what makes the binding a fact rather than an intention (the
rule test_toposort.py states at Q61 and test_lfu_cache.py at Q98).
"""
import pathlib
import sys
HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
import tarjan_articulation as module_under_test
from tarjan_articulation import articulation_points, bridges
# The module under test must be the committed file next to this test.
MODULE_PATH = pathlib.Path(module_under_test.__file__).resolve()
assert MODULE_PATH == (HERE / "tarjan_articulation.py"), (MODULE_PATH, HERE)
adj = {'1': ['2'], '2': ['1', '3'], '3': ['2', '4'], '4': ['3']}
assert sorted(articulation_points(adj)) == ['2', '3'], articulation_points(adj)
assert sorted(bridges(adj)) == [('1', '2'), ('2', '3'), ('3', '4')], bridges(adj)
adj = {'a': ['b', 'c'], 'b': ['a', 'c'], 'c': ['a', 'b']}
assert articulation_points(adj) == set(), articulation_points(adj)
assert bridges(adj) == set(), bridges(adj)
adj = {'1': ['2', '2'], '2': ['1', '1']}
assert bridges(adj) == set(), bridges(adj)
adj = {'c': ['a', 'b', 'd'], 'a': ['c'], 'b': ['c'], 'd': ['c']}
assert articulation_points(adj) == {'c'}, articulation_points(adj)
print("ALL TESTS PASS")
+93
View File
@@ -0,0 +1,93 @@
import time
import pytest
from ttl_lru_cache import TTLCache, CacheMiss
def test_basic_get_set():
c = TTLCache(2)
c.set("a", 1)
c.set("b", 2)
assert c.get("a") == 1
assert c.get("z", 9) == 9
assert "a" in c
def test_lru_eviction():
c = TTLCache(2)
c.set("a", 1)
c.set("b", 2)
c.get("a") # make a recently used
c.set("c", 3)
assert "b" not in c
assert c.get("a") == 1
assert c.get("c") == 3
def test_ttl_expiry():
clock = [0.0]
c = TTLCache(10, default_ttl=5, clock=lambda: clock[0])
c.set("a", 1)
assert c.get("a") == 1
clock[0] = 6
assert c.get("a") is None
assert "a" not in c
assert len(c) == 0
def test_per_entry_ttl_override():
clock = [0.0]
c = TTLCache(10, default_ttl=100, clock=lambda: clock[0])
c.set("short", 1, ttl=2)
c.set("long", 2)
clock[0] = 3
assert "short" not in c
assert c.get("long") == 2
def test_peek_does_not_update_recency():
c = TTLCache(2)
c.set("a", 1)
c.set("b", 2)
c.peek("a")
c.set("c", 3)
# a was not touched via get, so it should be evicted (b was more recent? actually b inserted last)
# After set a,b: order a,b. peek a no change. set c evicts LRU = a.
assert "a" not in c
def test_get_strict_raises():
c = TTLCache(2)
with pytest.raises(CacheMiss):
c.get_strict("nope")
def test_invalid_args():
with pytest.raises(ValueError):
TTLCache(0)
with pytest.raises(ValueError):
TTLCache(2, default_ttl=0)
c = TTLCache(2)
with pytest.raises(ValueError):
c.set("x", 1, ttl=0)
def test_delete_and_clear():
c = TTLCache(2)
c.set("a", 1)
assert c.delete("a") is True
assert c.delete("a") is False
c.set("b", 2)
c.clear()
assert len(c) == 0
def test_capacity_eviction_with_expired():
clock = [0.0]
c = TTLCache(2, clock=lambda: clock[0])
c.set("a", 1, ttl=1)
c.set("b", 2, ttl=1)
clock[0] = 2 # both expired
c.set("c", 3) # should not count expired toward capacity
assert len(c) == 1
assert c.get("c") == 3
+141
View File
@@ -0,0 +1,141 @@
"""TTL-aware LRU cache.
A small, dependency-free, thread-safe-ish (single-threaded design) cache
combining least-recently-used eviction with per-entry time-to-live expiry.
Design notes:
- Ordering is tracked with an OrderedDict (move_to_end on access).
- Expiry is checked lazily on get/peek; expired entries are dropped on access.
- Capacity counts only live (non-expired) entries at insertion time; expired
entries are purged opportunistically when capacity is exceeded.
- A monotonic clock (time.monotonic) is used so wall-clock jumps don't break TTL.
"""
from __future__ import annotations
import time
from collections import OrderedDict
from dataclasses import dataclass
from typing import Any, Callable, Generic, Optional, TypeVar
K = TypeVar("K")
V = TypeVar("V")
class CacheMiss(KeyError):
"""Raised by get_strict when a key is absent or expired."""
@dataclass
class _Entry(Generic[V]):
value: V
expires_at: float # monotonic seconds; inf means no expiry
class TTLCache(Generic[K, V]):
def __init__(
self,
capacity: int,
default_ttl: Optional[float] = None,
clock: Callable[[], float] = time.monotonic,
) -> None:
if capacity <= 0:
raise ValueError("capacity must be positive")
if default_ttl is not None and default_ttl <= 0:
raise ValueError("default_ttl must be positive or None")
self._capacity = capacity
self._default_ttl = default_ttl
self._clock = clock
self._data: "OrderedDict[K, _Entry[V]]" = OrderedDict()
# -- internals ---------------------------------------------------------
def _now(self) -> float:
return self._clock()
def _purge_expired(self) -> None:
# Drop expired entries from the front/back opportunistically.
now = self._now()
dead = [k for k, e in self._data.items() if e.expires_at <= now]
for k in dead:
del self._data[k]
def _ttl_to_deadline(self, ttl: Optional[float]) -> float:
if ttl is None:
ttl = self._default_ttl
if ttl is None:
return float("inf")
if ttl <= 0:
raise ValueError("ttl must be positive")
return self._now() + ttl
# -- public API --------------------------------------------------------
def __len__(self) -> int:
self._purge_expired()
return len(self._data)
def __contains__(self, key: K) -> bool:
entry = self._data.get(key)
if entry is None:
return False
if entry.expires_at <= self._now():
del self._data[key]
return False
return True
def get(self, key: K, default: Any = None) -> Any:
entry = self._data.get(key)
if entry is None:
return default
if entry.expires_at <= self._now():
del self._data[key]
return default
self._data.move_to_end(key)
return entry.value
def get_strict(self, key: K) -> V:
v = self.get(key, _MISSING)
if v is _MISSING:
raise CacheMiss(key)
return v # type: ignore[return-value]
def set(self, key: K, value: V, ttl: Optional[float] = None) -> None:
deadline = self._ttl_to_deadline(ttl)
if key in self._data:
del self._data[key]
self._data[key] = _Entry(value=value, expires_at=deadline)
self._data.move_to_end(key)
self._evict_if_needed()
def _evict_if_needed(self) -> None:
self._purge_expired()
while len(self._data) > self._capacity:
self._data.popitem(last=False)
def delete(self, key: K) -> bool:
if key in self._data:
del self._data[key]
return True
return False
def clear(self) -> None:
self._data.clear()
def keys(self):
self._purge_expired()
return list(self._data.keys())
def items(self):
self._purge_expired()
return [(k, e.value) for k, e in self._data.items()]
def peek(self, key: K, default: Any = None) -> Any:
"""Return value without updating recency or triggering purge of others."""
entry = self._data.get(key)
if entry is None or entry.expires_at <= self._now():
return default
return entry.value
_MISSING = object()
@@ -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
1 rank author commits
2 1 Timmy 765
3 2 ledger 345
4 3 Volt 258
5 4 spark 240
6 5 beam 160
7 6 Zephyrus Sparkborn 153
8 7 sol 147
9 8 quill 126
10 9 Merlin 118
11 10 forge 62
12 11 volt 53
13 12 sphinx 32
14 13 null 28
15 14 Mercury 22
16 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`).
+24 -194
View File
@@ -1,194 +1,24 @@
#!/usr/bin/env python3
"""
CHECK-2026-11-02-jobs-table
Extract/verify jobs table for the ledger lane.
Single bare command verdict: exit 0 iff the committed jobs.csv on disk
re-derives byte-for-byte from the pinned source JSONs AND its sha256 matches
manifest.json (recorded at extraction time). No fallback arms; a failure
prints the measured facts and exits nonzero.
"""
import hashlib
import html
import json
import os
import re
import sys
HERE = os.path.dirname(os.path.abspath(__file__))
MANIFEST = os.path.join(HERE, "manifest.json")
CSV = os.path.join(HERE, "jobs.csv")
SRC_FILES = {
"more_candidates.json": "more",
"ashby_candidates.json": "ashby",
"greenhouse_candidates.json": "greenhouse",
}
SRC_ROOT = "/root"
TAG_RE = re.compile(r"<[^>]+>")
def strip_html(s):
if not s:
return ""
s = html.unescape(s)
s = TAG_RE.sub(" ", s)
return " ".join(s.split())
def emp_of(rec):
for k in ("employmentType", "workplaceType"):
v = rec.get(k)
if v:
return v
return ""
def publish_at(rec):
return rec.get("publishedAt") or rec.get("updated_at") or ""
def desc_of(rec):
for k in ("descriptionPlain", "content", "descriptionHtml"):
v = rec.get(k)
if v:
return strip_html(v)[:220]
return ""
def build_expected_rows():
rows = []
counts = {}
for src_file, src_label in SRC_FILES.items():
path = os.path.join(SRC_ROOT, src_file)
with open(path) as fh:
data = json.load(fh)
counts[src_label] = 0
for rec in data:
rows.append({
"source": src_label,
"org": rec.get("org") or rec.get("board") or "",
"title": rec.get("title") or "",
"location": rec.get("location") or "",
"department": rec.get("department") or "",
"employment_type": emp_of(rec),
"job_url": rec.get("jobUrl") or rec.get("url") or "",
"apply_url": rec.get("applyUrl") or "",
"published_at": publish_at(rec),
"description": desc_of(rec),
})
counts[src_label] += 1
return rows, counts
def main():
ok = True
failures = []
if not os.path.exists(MANIFEST):
failures.append("missing manifest.json")
if not os.path.exists(CSV):
failures.append("missing jobs.csv")
if failures:
print("FAIL: " + "; ".join(failures))
sys.exit(1)
manifest = json.load(open(MANIFEST))
expected, expected_counts = build_expected_rows()
expected_bytes = csv_bytes(expected)
on_disk_bytes = open(CSV, "rb").read()
# 1) committed CSV byte-for-byte equals a clean re-derivation from source
same_bytes = on_disk_bytes == expected_bytes
if not same_bytes:
ok = False
failures.append(
"jobs.csv bytes differ from a fresh re-derivation from source "
"(on-disk %d bytes, derived %d bytes)" % (len(on_disk_bytes), len(expected_bytes))
)
# diff report
try:
o = on_disk_bytes.decode().splitlines()
e = expected_bytes.decode().splitlines()
for i in range(max(len(o), len(e))):
a = o[i] if i < len(o) else "<missing>"
b = e[i] if i < len(e) else "<missing>"
if a != b:
failures.append("line %d: ondisk=%r derived=%r" % (i, a[:60], b[:60]))
break
except Exception as ex:
failures.append("diff failed: %r" % ex)
# 2) sha256 recorded in manifest matches the committed file on disk
disk_sha = hashlib.sha256(on_disk_bytes).hexdigest()
sha_ok = disk_sha == manifest.get("sha256")
if not sha_ok:
ok = False
failures.append(
"sha256 mismatch: on-disk=%s manifest=%s" % (disk_sha, manifest.get("sha256"))
)
# 3) row counts and per-source counts
n_data = on_disk_bytes.decode().count("\n") - 1 # minus header
count_ok = manifest.get("row_count") == n_data == len(expected)
if not count_ok:
ok = False
failures.append(
"row_count mismatch: manifest=%s ondisk_data=%s derived=%s"
% (manifest.get("row_count"), n_data, len(expected))
)
if expected_counts != manifest.get("counts"):
ok = False
failures.append("counts mismatch: manifest=%s derived=%s"
% (manifest.get("counts"), expected_counts))
# 4) required key fields must be populated
req = ["source", "title", "job_url"]
null_rows = [i for i, r in enumerate(expected) if any(not r.get(k) for k in req)]
if null_rows:
ok = False
failures.append("rows with empty required field: %s" % null_rows[:5])
# 5) fieldnames match
import csv, io
with open(CSV, newline="") as fh:
reader = csv.DictReader(fh)
fields = reader.fieldnames
fields_ok = fields == manifest.get("fieldnames")
if not fields_ok:
ok = False
failures.append("fieldnames mismatch: %s" % fields)
# ---- measured report ----
print("CHECK-2026-11-02-jobs-table")
print(" source_files: %s" % ", ".join("%s=%d" % kv for kv in expected_counts.items()))
print(" derived_rows: %d" % len(expected))
print(" manifest.row_count: %s" % manifest.get("row_count"))
print(" on-disk_rows: %d" % n_data)
print(" sha256: %s" % disk_sha)
print(" csv_bytes: %d" % len(on_disk_bytes))
print(" fieldnames_match: %s" % fields_ok)
if ok:
print("VERDICT: PASS (jobs.csv re-derives from source and matches manifest)")
sys.exit(0)
print("VERDICT: FAIL")
for f in failures:
print(" - " + f)
sys.exit(1)
def csv_bytes(rows):
import csv, io
buf = io.StringIO()
w = csv.DictWriter(buf, fieldnames=list(rows[0].keys()) if rows else [])
w.writeheader()
w.writerows(rows)
return buf.getvalue().encode("utf-8")
if __name__ == "__main__":
main()
#!/usr/bin/env bash
# CHECK -- 2026-11-02 jobs table (ledger lane).
#
# Entry point: this is the path every caller in this tree invokes, and it is
# invoked with `bash` (the q143 sweep, tools/verify.py's doc-command leg, and a
# reader who types the path). It was a Python program with a `python3` shebang,
# so `bash CHECK-2026-11-02-jobs-table` read rc 2 on shell syntax errors before
# grading a cell. The grader moved to grade_jobs_table.py; this wrapper is the
# stable entry point and passes any argument through.
#
# Default: the item's claim -- the committed jobs.csv re-derives byte-for-byte
# from the source JSONs (root: $JOBS_SRC_ROOT, else /root) and matches
# manifest.json.
# --offline: grade the committed artifact alone (sha256, row count, fieldnames,
# required fields) and print that re-derivation was not attempted.
#
# rc 0 every leg graded and passed
# rc 1 a graded leg failed
# rc 2 could not grade (sources absent in a source mode, artifact missing)
set -u
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit 2
[ -f "$HERE/grade_jobs_table.py" ] || {
echo "CANNOT GRADE: grade_jobs_table.py missing beside this entry point"; exit 2; }
exec python3 -u "$HERE/grade_jobs_table.py" "$@"
@@ -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
@@ -0,0 +1,27 @@
# Extension census 2026-11-03
Ranked census of file extensions across the troupe worktree.
- **Source:** `repo_files.tsv` (rank<TAB>path inventory, 3345 file rows).
- **Artifact:** `extension-census.csv` (rank, extension, file_count) — 31 rows.
- **Interactive view:** `extension-census.md` (ranked table + totals).
- **Independent verifier:** `verify_extension_census.py` — re-derives from
`repo_files.tsv` with a standalone loop and asserts byte-match; exit 0.
- **CHECK file:** `../CHECK-extension-census-2026-11-03`.
Ranked top of the census (full list in `extension-census.csv`):
| rank | extension | file_count |
|---|---|---|
| 1 | .md | 829 |
| 2 | .png | 803 |
| 3 | .py | 653 |
| 4 | .txt | 551 |
| 5 | .json | 231 |
| 6 | .sh | 56 |
| 7 | .html | 55 |
| 8 | .csv | 43 |
| 9 | .svg | 31 |
| 10 | .age | 16 |
**Totals:** 3345 files, 31 unique extensions.
+34 -6
View File
@@ -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).
+80
View File
@@ -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())
+9
View File
@@ -0,0 +1,9 @@
51 ledger
26 sol
26 quill
23 beam
22 volt
7 Zephyrus Sparkborn
4 Cassian Assayborn
1 Timmy
1 Sentinel
1 51 ledger
2 26 sol
3 26 quill
4 23 beam
5 22 volt
6 7 Zephyrus Sparkborn
7 4 Cassian Assayborn
8 1 Timmy
9 1 Sentinel
+3
View File
@@ -0,0 +1,3 @@
76 2026-11-01
80 2026-11-02
5 2026-11-03
1 76 2026-11-01
2 80 2026-11-02
3 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,🇿🇼
1 name_common name_official alpha2 alpha3 numeric region subregion capital population area_km2 currencies languages tlds flag
2 Aruba Aruba AW ABW 533 Americas Caribbean Oranjestad 107566 180 AWG nld | pap .aw 🇦🇼
3 Afghanistan Islamic Republic of Afghanistan AF AFG 004 Asia Southern Asia Kabul 43844000 652230 AFN prs | pus | tuk .af 🇦🇫
4 Angola Republic of Angola AO AGO 024 Africa Middle Africa Luanda 36170961 1246700 AOA por .ao 🇦🇴
5 Anguilla Anguilla AI AIA 660 Americas Caribbean The Valley 16010 91 XCD eng .ai 🇦🇮
6 Åland Islands Åland Islands AX ALA 248 Europe Northern Europe Mariehamn 30654 1580 EUR swe .ax 🇦🇽
7 Albania Republic of Albania AL ALB 008 Europe Southeast Europe Tirana 2363314 28748 ALL sqi .al 🇦🇱
8 Andorra Principality of Andorra AD AND 020 Europe Southern Europe Andorra la Vella 88406 468 EUR cat .ad 🇦🇩
9 United Arab Emirates United Arab Emirates AE ARE 784 Asia Western Asia Abu Dhabi 11294243 83600 AED ara .ae | امارات. 🇦🇪
10 Argentina Argentine Republic AR ARG 032 Americas South America Buenos Aires 46735004 2780400 ARS grn | spa .ar 🇦🇷
11 Armenia Republic of Armenia AM ARM 051 Asia Western Asia Yerevan 3076200 29743 AMD hye .am 🇦🇲
12 American Samoa American Samoa AS ASM 016 Oceania Polynesia Pago Pago 49710 199 USD eng | smo .as 🇦🇸
13 Antarctica Antarctica AQ ATA 010 Antarctic 1300 14000000 .aq 🇦🇶
14 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 🇹🇫
15 Antigua and Barbuda Antigua and Barbuda AG ATG 028 Americas Caribbean Saint John's 103603 442 XCD eng .ag 🇦🇬
16 Australia Commonwealth of Australia AU AUS 036 Oceania Australia and New Zealand Canberra 27536874 7692024 AUD eng .au 🇦🇺
17 Austria Republic of Austria AT AUT 040 Europe Central Europe Vienna 9200931 83871 EUR deu .at 🇦🇹
18 Azerbaijan Republic of Azerbaijan AZ AZE 031 Asia Western Asia Baku 10241722 86600 AZN aze .az 🇦🇿
19 Burundi Republic of Burundi BI BDI 108 Africa Eastern Africa Gitega 12332788 27834 BIF fra | run .bi 🇧🇮
20 Belgium Kingdom of Belgium BE BEL 056 Europe Western Europe Brussels 11825551 30528 EUR deu | fra | nld .be 🇧🇪
21 Benin Republic of Benin BJ BEN 204 Africa Western Africa Porto-Novo 13224860 112622 XOF fra .bj 🇧🇯
22 Burkina Faso Burkina Faso BF BFA 854 Africa Western Africa Ouagadougou 24070553 272967 XOF fra .bf 🇧🇫
23 Bangladesh People's Republic of Bangladesh BD BGD 050 Asia Southern Asia Dhaka 169828911 147570 BDT ben .bd 🇧🇩
24 Bulgaria Republic of Bulgaria BG BGR 100 Europe Southeast Europe Sofia 6437360 110879 BGN bul .bg 🇧🇬
25 Bahrain Kingdom of Bahrain BH BHR 048 Asia Western Asia Manama 1594654 765 BHD ara .bh 🇧🇭
26 Bahamas Commonwealth of the Bahamas BS BHS 044 Americas Caribbean Nassau 398165 13943 BSD | USD eng .bs 🇧🇸
27 Bosnia and Herzegovina Bosnia and Herzegovina BA BIH 070 Europe Southeast Europe Sarajevo 3422000 51209 BAM bos | hrv | srp .ba 🇧🇦
28 Saint Barthélemy Collectivity of Saint Barthélemy BL BLM 652 Americas Caribbean Gustavia 10562 21 EUR fra .bl 🇧🇱
29 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 🇸🇭
30 Belarus Republic of Belarus BY BLR 112 Europe Eastern Europe Minsk 9109280 207600 BYN bel | rus .by 🇧🇾
31 Belize Belize BZ BLZ 084 Americas Central America Belmopan 417634 22966 BZD bjz | eng | spa .bz 🇧🇿
32 Bermuda Bermuda BM BMU 060 Americas North America Hamilton 64055 54 BMD eng .bm 🇧🇲
33 Bolivia Plurinational State of Bolivia BO BOL 068 Americas South America Sucre 11365333 1098581 BOB aym | grn | que | spa .bo 🇧🇴
34 Caribbean Netherlands Bonaire, Sint Eustatius and Saba BQ BES 535 Americas Caribbean Kralendijk 31980 328 USD eng | nld | pap .bq | .nl 🇧🇶
35 Brazil Federative Republic of Brazil BR BRA 076 Americas South America Brasília 213421037 8515767 BRL por .br 🇧🇷
36 Barbados Barbados BB BRB 052 Americas Caribbean Bridgetown 267800 430 BBD eng .bb 🇧🇧
37 Brunei Nation of Brunei, Abode of Peace BN BRN 096 Asia South-Eastern Asia Bandar Seri Begawan 455500 5765 BND | SGD msa .bn 🇧🇳
38 Bhutan Kingdom of Bhutan BT BTN 064 Asia Southern Asia Thimphu 784043 38394 BTN | INR dzo .bt 🇧🇹
39 Bouvet Island Bouvet Island BV BVT 074 Antarctic 0 49 nor .bv 🇧🇻
40 Botswana Republic of Botswana BW BWA 072 Africa Southern Africa Gaborone 2359609 582000 BWP eng | tsn .bw 🇧🇼
41 Central African Republic Central African Republic CF CAF 140 Africa Middle Africa Bangui 6470307 622984 XAF fra | sag .cf 🇨🇫
42 Canada Canada CA CAN 124 Americas North America Ottawa 41651653 9984670 CAD eng | fra .ca 🇨🇦
43 Cocos (Keeling) Islands Territory of the Cocos (Keeling) Islands CC CCK 166 Oceania Australia and New Zealand West Island 593 14 AUD eng .cc 🇨🇨
44 Switzerland Swiss Confederation CH CHE 756 Europe Western Europe Bern 9082848 41284 CHF fra | gsw | ita | roh .ch 🇨🇭
45 Chile Republic of Chile CL CHL 152 Americas South America Santiago 20206953 756102 CLP spa .cl 🇨🇱
46 China People's Republic of China CN CHN 156 Asia Eastern Asia Beijing 1408280000 9706961 CNY zho .cn | .中国 | .中國 | .公司 | .网络 🇨🇳
47 Ivory Coast Republic of Côte d'Ivoire CI CIV 384 Africa Western Africa Yamoussoukro 31719275 322463 XOF fra .ci 🇨🇮
48 Cameroon Republic of Cameroon CM CMR 120 Africa Middle Africa Yaoundé 29442327 475442 XAF eng | fra .cm 🇨🇲
49 DR Congo Democratic Republic of the Congo CD COD 180 Africa Middle Africa Kinshasa 112832000 2344858 CDF fra | kon | lin | lua | swa .cd 🇨🇩
50 Republic of the Congo Republic of the Congo CG COG 178 Africa Middle Africa Brazzaville 6142180 342000 XAF fra | kon | lin .cg 🇨🇬
51 Cook Islands Cook Islands CK COK 184 Oceania Polynesia Avarua 15040 236 CKD | NZD eng | rar .ck 🇨🇰
52 Colombia Republic of Colombia CO COL 170 Americas South America Bogotá 53057212 1141748 COP spa .co 🇨🇴
53 Comoros Union of the Comoros KM COM 174 Africa Eastern Africa Moroni 919901 1862 KMF ara | fra | zdj .km 🇰🇲
54 Cape Verde Republic of Cabo Verde CV CPV 132 Africa Western Africa Praia 491233 4033 CVE por .cv 🇨🇻
55 Costa Rica Republic of Costa Rica CR CRI 188 Americas Central America San José 5309625 51100 CRC spa .cr 🇨🇷
56 Cuba Republic of Cuba CU CUB 192 Americas Caribbean Havana 9748007 109884 CUC | CUP spa .cu 🇨🇺
57 Curaçao Country of Curaçao CW CUW 531 Americas Caribbean Willemstad 156115 444 ANG eng | nld | pap .cw 🇨🇼
58 Christmas Island Territory of Christmas Island CX CXR 162 Oceania Australia and New Zealand Flying Fish Cove 1692 135 AUD eng .cx 🇨🇽
59 Cayman Islands Cayman Islands KY CYM 136 Americas Caribbean George Town 84738 264 KYD eng .ky 🇰🇾
60 Cyprus Republic of Cyprus CY CYP 196 Europe Southern Europe Nicosia 1442614 9251 EUR ell | tur .cy 🇨🇾
61 Czechia Czech Republic CZ CZE 203 Europe Central Europe Prague 10882341 78865 CZK ces | slk .cz 🇨🇿
62 Germany Federal Republic of Germany DE DEU 276 Europe Western Europe Berlin 83491249 357114 EUR deu .de 🇩🇪
63 Djibouti Republic of Djibouti DJ DJI 262 Africa Eastern Africa Djibouti 1066809 23200 DJF ara | fra .dj 🇩🇯
64 Dominica Commonwealth of Dominica DM DMA 212 Americas Caribbean Roseau 67408 751 XCD eng .dm 🇩🇲
65 Denmark Kingdom of Denmark DK DNK 208 Europe Northern Europe Copenhagen 6011488 43094 DKK dan .dk 🇩🇰
66 Dominican Republic Dominican Republic DO DOM 214 Americas Caribbean Santo Domingo 10771504 48671 DOP spa .do 🇩🇴
67 Algeria People's Democratic Republic of Algeria DZ DZA 012 Africa Northern Africa Algiers 47400000 2381741 DZD ara .dz | الجزائر. 🇩🇿
68 Ecuador Republic of Ecuador EC ECU 218 Americas South America Quito 18103660 276841 USD spa .ec 🇪🇨
69 Egypt Arab Republic of Egypt EG EGY 818 Africa Northern Africa Cairo 107271260 1002450 EGP ara .eg | .مصر 🇪🇬
70 Eritrea State of Eritrea ER ERI 232 Africa Eastern Africa Asmara 3607000 117600 ERN ara | eng | tir .er 🇪🇷
71 Western Sahara Sahrawi Arab Democratic Republic EH ESH 732 Africa Northern Africa El Aaiún 600904 266000 DZD | MAD | MRU ber | mey | spa .eh 🇪🇭
72 Spain Kingdom of Spain ES ESP 724 Europe Southern Europe Madrid 49315949 505992 EUR cat | eus | glc | spa .es 🇪🇸
73 Estonia Republic of Estonia EE EST 233 Europe Northern Europe Tallinn 1369995 45227 EUR est .ee 🇪🇪
74 Ethiopia Federal Democratic Republic of Ethiopia ET ETH 231 Africa Eastern Africa Addis Ababa 111652998 1104300 ETB amh .et 🇪🇹
75 Finland Republic of Finland FI FIN 246 Europe Northern Europe Helsinki 5650325 338455 EUR fin | swe .fi 🇫🇮
76 Fiji Republic of Fiji FJ FJI 242 Oceania Melanesia Suva 900869 18272 FJD eng | fij | hif .fj 🇫🇯
77 Falkland Islands Falkland Islands FK FLK 238 Americas South America Stanley 3662 12173 FKP eng .fk 🇫🇰
78 France French Republic FR FRA 250 Europe Western Europe Paris 66351959 543908 EUR fra .fr 🇫🇷
79 Faroe Islands Faroe Islands FO FRO 234 Europe Northern Europe Tórshavn 54885 1393 DKK | FOK dan | fao .fo 🇫🇴
80 Micronesia Federated States of Micronesia FM FSM 583 Oceania Micronesia Palikir 105564 702 USD eng .fm 🇫🇲
81 Gabon Gabonese Republic GA GAB 266 Africa Middle Africa Libreville 2469296 267668 XAF fra .ga 🇬🇦
82 United Kingdom United Kingdom of Great Britain and Northern Ireland GB GBR 826 Europe Northern Europe London 69281437 244376 GBP eng .uk 🇬🇧
83 Georgia Georgia GE GEO 268 Asia Western Asia Tbilisi 4000921 69700 GEL kat .ge 🇬🇪
84 Guernsey Bailiwick of Guernsey GG GGY 831 Europe Northern Europe St. Peter Port 64781 78 GBP | GGP eng | fra | nfr .gg 🇬🇬
85 Ghana Republic of Ghana GH GHA 288 Africa Western Africa Accra 33742380 238533 GHS eng .gh 🇬🇭
86 Gibraltar Gibraltar GI GIB 292 Europe Southern Europe Gibraltar 38000 6 GIP eng .gi 🇬🇮
87 Guinea Republic of Guinea GN GIN 324 Africa Western Africa Conakry 14363931 245857 GNF fra .gn 🇬🇳
88 Guadeloupe Guadeloupe GP GLP 312 Americas Caribbean Basse-Terre 378561 1628 EUR fra .gp 🇬🇵
89 Gambia Republic of the Gambia GM GMB 270 Africa Western Africa Banjul 2422712 10689 GMD eng .gm 🇬🇲
90 Guinea-Bissau Republic of Guinea-Bissau GW GNB 624 Africa Western Africa Bissau 1781308 36125 XOF por | pov .gw 🇬🇼
91 Equatorial Guinea Republic of Equatorial Guinea GQ GNQ 226 Africa Middle Africa Ciudad de la Paz 1668768 28051 XAF fra | por | spa .gq 🇬🇶
92 Greece Hellenic Republic GR GRC 300 Europe Southern Europe Athens 10400720 131990 EUR ell .gr 🇬🇷
93 Grenada Grenada GD GRD 308 Americas Caribbean St. George's 109021 344 XCD eng .gd 🇬🇩
94 Greenland Greenland GL GRL 304 Americas North America Nuuk 56542 2166086 DKK kal .gl 🇬🇱
95 Guatemala Republic of Guatemala GT GTM 320 Americas Central America Guatemala City 18079810 108889 GTQ spa .gt 🇬🇹
96 French Guiana Guiana GF GUF 254 Americas South America Cayenne 292354 83534 EUR fra .gf 🇬🇫
97 Guam Guam GU GUM 316 Oceania Micronesia Hagåtña 153836 549 USD cha | eng | spa .gu 🇬🇺
98 Guyana Co-operative Republic of Guyana GY GUY 328 Americas South America Georgetown 772975 214969 GYD eng .gy 🇬🇾
99 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 | .香港 🇭🇰
100 Heard Island and McDonald Islands Heard Island and McDonald Islands HM HMD 334 Antarctic 0 412 eng .hm | .aq 🇭🇲
101 Honduras Republic of Honduras HN HND 340 Americas Central America Tegucigalpa 9892632 112492 HNL spa .hn 🇭🇳
102 Croatia Republic of Croatia HR HRV 191 Europe Southeast Europe Zagreb 3866233 56594 EUR hrv .hr 🇭🇷
103 Haiti Republic of Haiti HT HTI 332 Americas Caribbean Port-au-Prince 11867032 27750 HTG fra | hat .ht 🇭🇹
104 Hungary Hungary HU HUN 348 Europe Central Europe Budapest 9539502 93028 HUF hun .hu 🇭🇺
105 Indonesia Republic of Indonesia ID IDN 360 Asia South-Eastern Asia Jakarta 284438782 1904569 IDR ind .id 🇮🇩
106 Isle of Man Isle of Man IM IMN 833 Europe Northern Europe Douglas 84530 572 GBP | IMP eng | glv .im 🇮🇲
107 India Republic of India IN IND 356 Asia Southern Asia New Delhi 1417492000 3287263 INR eng | hin | tam .in 🇮🇳
108 British Indian Ocean Territory British Indian Ocean Territory IO IOT 086 Africa Eastern Africa Diego Garcia 0 60 USD eng .io 🇮🇴
109 Ireland Republic of Ireland IE IRL 372 Europe Northern Europe Dublin 5458600 70273 EUR eng | gle .ie 🇮🇪
110 Iran Islamic Republic of Iran IR IRN 364 Asia Southern Asia Tehran 85961000 1648195 IRR fas .ir | ایران. 🇮🇷
111 Iraq Republic of Iraq IQ IRQ 368 Asia Western Asia Baghdad 46118793 438317 IQD ara | arc | ckb .iq 🇮🇶
112 Iceland Iceland IS ISL 352 Europe Northern Europe Reykjavik 391810 103000 ISK isl .is 🇮🇸
113 Israel State of Israel IL ISR 376 Asia Western Asia Jerusalem 10134800 21937 ILS ara | heb .il 🇮🇱
114 Italy Italian Republic IT ITA 380 Europe Southern Europe Rome 58927633 301336 EUR cat | ita .it 🇮🇹
115 Jamaica Jamaica JM JAM 388 Americas Caribbean Kingston 2825544 10991 JMD eng | jam .jm 🇯🇲
116 Jersey Bailiwick of Jersey JE JEY 832 Europe Northern Europe Saint Helier 103267 116 GBP | JEP eng | fra | nrf .je 🇯🇪
117 Jordan Hashemite Kingdom of Jordan JO JOR 400 Asia Western Asia Amman 11734000 89342 JOD ara .jo | الاردن. 🇯🇴
118 Japan Japan JP JPN 392 Asia Eastern Asia Tokyo 123210000 377930 JPY jpn .jp | .みんな 🇯🇵
119 Kazakhstan Republic of Kazakhstan KZ KAZ 398 Asia Central Asia Astana 20426568 2724900 KZT kaz | rus .kz | .қаз 🇰🇿
120 Kenya Republic of Kenya KE KEN 404 Africa Eastern Africa Nairobi 53330978 580367 KES eng | swa .ke 🇰🇪
121 Kyrgyzstan Kyrgyz Republic KG KGZ 417 Asia Central Asia Bishkek 7281800 199951 KGS kir | rus .kg 🇰🇬
122 Cambodia Kingdom of Cambodia KH KHM 116 Asia South-Eastern Asia Phnom Penh 17577760 181035 KHR | USD khm .kh 🇰🇭
123 Kiribati Independent and Sovereign Republic of Kiribati KI KIR 296 Oceania Micronesia South Tarawa 120740 811 AUD | KID eng | gil .ki 🇰🇮
124 Saint Kitts and Nevis Federation of Saint Christopher and Nevis KN KNA 659 Americas Caribbean Basseterre 51320 261 XCD eng .kn 🇰🇳
125 South Korea Republic of Korea KR KOR 410 Asia Eastern Asia Seoul 51159889 100210 KRW kor .kr | .한국 🇰🇷
126 Kosovo Republic of Kosovo XK UNK Europe Southeast Europe Pristina 1585566 10908 EUR sqi | srp 🇽🇰
127 Kuwait State of Kuwait KW KWT 414 Asia Western Asia Kuwait City 4881254 17818 KWD ara .kw 🇰🇼
128 Laos Lao People's Democratic Republic LA LAO 418 Asia South-Eastern Asia Vientiane 7647000 236800 LAK lao .la 🇱🇦
129 Lebanon Lebanese Republic LB LBN 422 Asia Western Asia Beirut 5490000 10452 LBP ara | fra .lb 🇱🇧
130 Liberia Republic of Liberia LR LBR 430 Africa Western Africa Monrovia 5248621 111369 LRD eng .lr 🇱🇷
131 Libya State of Libya LY LBY 434 Africa Northern Africa Tripoli 7459000 1759540 LYD ara .ly 🇱🇾
132 Saint Lucia Saint Lucia LC LCA 662 Americas Caribbean Castries 184100 616 XCD eng .lc 🇱🇨
133 Liechtenstein Principality of Liechtenstein LI LIE 438 Europe Western Europe Vaduz 40900 160 CHF deu .li 🇱🇮
134 Sri Lanka Democratic Socialist Republic of Sri Lanka LK LKA 144 Asia Southern Asia Sri Jayawardenepura Kotte 21763170 65610 LKR sin | tam .lk | .இலங்கை | .ලංකා 🇱🇰
135 Lesotho Kingdom of Lesotho LS LSO 426 Africa Southern Africa Maseru 2116427 30355 LSL | ZAR eng | sot .ls 🇱🇸
136 Lithuania Republic of Lithuania LT LTU 440 Europe Northern Europe Vilnius 2894886 65300 EUR lit .lt 🇱🇹
137 Luxembourg Grand Duchy of Luxembourg LU LUX 442 Europe Western Europe Luxembourg 681973 2586 EUR deu | fra | ltz .lu 🇱🇺
138 Latvia Republic of Latvia LV LVA 428 Europe Northern Europe Riga 1829000 64559 EUR lav .lv 🇱🇻
139 Macau Macao Special Administrative Region of the People's Republic of China MO MAC 446 Asia Eastern Asia 685900 30 MOP por | zho .mo 🇲🇴
140 Saint Martin Saint Martin MF MAF 663 Americas Caribbean Marigot 31496 53 EUR fra .fr | .gp 🇲🇫
141 Morocco Kingdom of Morocco MA MAR 504 Africa Northern Africa Rabat 36828330 446550 MAD ara | ber .ma | المغرب. 🇲🇦
142 Monaco Principality of Monaco MC MCO 492 Europe Western Europe Monaco 38423 2.02 EUR fra .mc 🇲🇨
143 Moldova Republic of Moldova MD MDA 498 Europe Eastern Europe Chișinău 2749076 33847 MDL ron .md 🇲🇩
144 Madagascar Republic of Madagascar MG MDG 450 Africa Eastern Africa Antananarivo 31727042 587041 MGA fra | mlg .mg 🇲🇬
145 Maldives Republic of the Maldives MV MDV 462 Asia Southern Asia Malé 515132 300 MVR div .mv 🇲🇻
146 Mexico United Mexican States MX MEX 484 Americas North America Mexico City 130575786 1964375 MXN spa .mx 🇲🇽
147 Marshall Islands Republic of the Marshall Islands MH MHL 584 Oceania Micronesia Majuro 42418 181 USD eng | mah .mh 🇲🇭
148 North Macedonia Republic of North Macedonia MK MKD 807 Europe Southeast Europe Skopje 1822612 25713 MKD mkd .mk 🇲🇰
149 Mali Republic of Mali ML MLI 466 Africa Western Africa Bamako 22395489 1240192 XOF fra .ml 🇲🇱
150 Malta Republic of Malta MT MLT 470 Europe Southern Europe Valletta 574250 316 EUR eng | mlt .mt 🇲🇹
151 Myanmar Republic of the Union of Myanmar MM MMR 104 Asia South-Eastern Asia Naypyidaw 51316756 676578 MMK mya .mm 🇲🇲
152 Montenegro Montenegro ME MNE 499 Europe Southeast Europe Podgorica 623327 13812 EUR cnr .me 🇲🇪
153 Mongolia Mongolia MN MNG 496 Asia Eastern Asia Ulan Bator 3544835 1564110 MNT mon .mn 🇲🇳
154 Northern Mariana Islands Commonwealth of the Northern Mariana Islands MP MNP 580 Oceania Micronesia Saipan 47329 464 USD cal | cha | eng .mp 🇲🇵
155 Mozambique Republic of Mozambique MZ MOZ 508 Africa Eastern Africa Maputo 34090466 801590 MZN por .mz 🇲🇿
156 Mauritania Islamic Republic of Mauritania MR MRT 478 Africa Western Africa Nouakchott 4927532 1030700 MRU ara .mr 🇲🇷
157 Montserrat Montserrat MS MSR 500 Americas Caribbean Plymouth 4386 102 XCD eng .ms 🇲🇸
158 Martinique Martinique MQ MTQ 474 Americas Caribbean Fort-de-France 349925 1128 EUR fra .mq 🇲🇶
159 Mauritius Republic of Mauritius MU MUS 480 Africa Eastern Africa Port Louis 1243741 2040 MUR eng | fra | mfe .mu 🇲🇺
160 Malawi Republic of Malawi MW MWI 454 Africa Eastern Africa Lilongwe 20734262 118484 MWK eng | nya .mw 🇲🇼
161 Malaysia Malaysia MY MYS 458 Asia South-Eastern Asia Kuala Lumpur 34231700 330803 MYR eng | msa .my 🇲🇾
162 Mayotte Department of Mayotte YT MYT 175 Africa Eastern Africa Mamoudzou 320901 374 EUR fra .yt 🇾🇹
163 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 🇳🇦
164 New Caledonia New Caledonia NC NCL 540 Oceania Melanesia Nouméa 264596 18575 XPF fra .nc 🇳🇨
165 Niger Republic of Niger NE NER 562 Africa Western Africa Niamey 26312034 1267000 XOF fra .ne 🇳🇪
166 Norfolk Island Territory of Norfolk Island NF NFK 574 Oceania Australia and New Zealand Kingston 2188 36 AUD eng | pih .nf 🇳🇫
167 Nigeria Federal Republic of Nigeria NG NGA 566 Africa Western Africa Abuja 223800000 923768 NGN eng .ng 🇳🇬
168 Nicaragua Republic of Nicaragua NI NIC 558 Americas Central America Managua 6803886 130373 NIO spa .ni 🇳🇮
169 Niue Niue NU NIU 570 Oceania Polynesia Alofi 1681 260 NZD eng | niu .nu 🇳🇺
170 Netherlands Kingdom of the Netherlands NL NLD 528 Europe Western Europe Amsterdam 18100436 41865 EUR nld .nl 🇳🇱
171 Norway Kingdom of Norway NO NOR 578 Europe Northern Europe Oslo 5606944 386224 NOK nno | nob | smi .no 🇳🇴
172 Nepal Federal Democratic Republic of Nepal NP NPL 524 Asia Southern Asia Kathmandu 29911840 147181 NPR nep .np 🇳🇵
173 Nauru Republic of Nauru NR NRU 520 Oceania Micronesia Yaren 11680 21 AUD eng | nau .nr 🇳🇷
174 New Zealand New Zealand NZ NZL 554 Oceania Australia and New Zealand Wellington 5324700 268838 NZD eng | mri | nzs .nz 🇳🇿
175 Oman Sultanate of Oman OM OMN 512 Asia Western Asia Muscat 5343630 309500 OMR ara .om 🇴🇲
176 Pakistan Islamic Republic of Pakistan PK PAK 586 Asia Southern Asia Islamabad 241499431 796095 PKR eng | urd .pk 🇵🇰
177 Panama Republic of Panama PA PAN 591 Americas Central America Panama City 4064780 75417 PAB | USD spa .pa 🇵🇦
178 Pitcairn Islands Pitcairn Group of Islands PN PCN 612 Oceania Polynesia Adamstown 35 47 NZD eng .pn 🇵🇳
179 Peru Republic of Peru PE PER 604 Americas South America Lima 34350244 1285216 PEN aym | que | spa .pe 🇵🇪
180 Philippines Republic of the Philippines PH PHL 608 Asia South-Eastern Asia Manila 114123600 342353 PHP eng | fil .ph 🇵🇭
181 Palau Republic of Palau PW PLW 585 Oceania Micronesia Ngerulmud 16733 459 USD eng | pau .pw 🇵🇼
182 Papua New Guinea Independent State of Papua New Guinea PG PNG 598 Oceania Melanesia Port Moresby 11781559 462840 PGK eng | hmo | tpi .pg 🇵🇬
183 Poland Republic of Poland PL POL 616 Europe Central Europe Warsaw 37392000 312679 PLN pol .pl 🇵🇱
184 Puerto Rico Commonwealth of Puerto Rico PR PRI 630 Americas Caribbean San Juan 3203295 8870 USD eng | spa .pr 🇵🇷
185 North Korea Democratic People's Republic of Korea KP PRK 408 Asia Eastern Asia Pyongyang 25950000 120538 KPW kor .kp 🇰🇵
186 Portugal Portuguese Republic PT PRT 620 Europe Southern Europe Lisbon 10749635 92090 EUR por .pt 🇵🇹
187 Paraguay Republic of Paraguay PY PRY 600 Americas South America Asunción 6109644 406752 PYG grn | spa .py 🇵🇾
188 Palestine State of Palestine PS PSE 275 Asia Western Asia Ramallah | Jerusalem 5483450 6220 EGP | ILS | JOD ara .ps | فلسطين. 🇵🇸
189 French Polynesia French Polynesia PF PYF 258 Oceania Polynesia Papeetē 279500 4167 XPF fra .pf 🇵🇫
190 Qatar State of Qatar QA QAT 634 Asia Western Asia Doha 3173024 11586 QAR ara .qa | قطر. 🇶🇦
191 Réunion Réunion Island RE REU 638 Africa Eastern Africa Saint-Denis 896175 2511 EUR fra .re 🇷🇪
192 Romania Romania RO ROU 642 Europe Southeast Europe Bucharest 19036031 238391 RON ron .ro 🇷🇴
193 Russia Russian Federation RU RUS 643 Europe Eastern Europe Moscow 146028325 17098246 RUB rus .ru | .su | .рф 🇷🇺
194 Rwanda Republic of Rwanda RW RWA 646 Africa Eastern Africa Kigali 14104969 26338 RWF eng | fra | kin .rw 🇷🇼
195 Saudi Arabia Kingdom of Saudi Arabia SA SAU 682 Asia Western Asia Riyadh 35300280 2149690 SAR ara .sa | .السعودية 🇸🇦
196 Sudan Republic of the Sudan SD SDN 729 Africa Northern Africa Khartoum 51662000 1886068 SDG ara | eng .sd 🇸🇩
197 Senegal Republic of Senegal SN SEN 686 Africa Western Africa Dakar 18593258 196722 XOF fra .sn 🇸🇳
198 Singapore Republic of Singapore SG SGP 702 Asia South-Eastern Asia Singapore 6110200 710 SGD eng | msa | tam | zho .sg | .新加坡 | .சிங்கப்பூர் 🇸🇬
199 South Georgia South Georgia and the South Sandwich Islands GS SGS 239 Antarctic King Edward Point 0 3903 GBP eng .gs 🇬🇸
200 Svalbard and Jan Mayen Svalbard og Jan Mayen SJ SJM 744 Europe Northern Europe Longyearbyen 2530 61399 NOK nor .sj 🇸🇯
201 Solomon Islands Solomon Islands SB SLB 090 Oceania Melanesia Honiara 750325 28896 SBD eng .sb 🇸🇧
202 Sierra Leone Republic of Sierra Leone SL SLE 694 Africa Western Africa Freetown 9077691 71740 SLE eng .sl 🇸🇱
203 El Salvador Republic of El Salvador SV SLV 222 Americas Central America San Salvador 6029976 21041 USD spa .sv 🇸🇻
204 San Marino Republic of San Marino SM SMR 674 Europe Southern Europe City of San Marino 34132 61 EUR ita .sm 🇸🇲
205 Somalia Federal Republic of Somalia SO SOM 706 Africa Eastern Africa Mogadishu 19655000 637657 SOS ara | som .so 🇸🇴
206 Saint Pierre and Miquelon Saint Pierre and Miquelon PM SPM 666 Americas North America Saint-Pierre 5819 242 EUR fra .pm 🇵🇲
207 Serbia Republic of Serbia RS SRB 688 Europe Southeast Europe Belgrade 6567783 77589 RSD srp .rs | .срб 🇷🇸
208 South Sudan Republic of South Sudan SS SSD 728 Africa Middle Africa Juba 15786898 619745 SSP eng .ss 🇸🇸
209 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 🇸🇹
210 Suriname Republic of Suriname SR SUR 740 Americas South America Paramaribo 616500 163820 SRD nld .sr 🇸🇷
211 Slovakia Slovak Republic SK SVK 703 Europe Central Europe Bratislava 5413813 49037 EUR slk .sk 🇸🇰
212 Slovenia Republic of Slovenia SI SVN 705 Europe Central Europe Ljubljana 2130638 20273 EUR slv .si 🇸🇮
213 Sweden Kingdom of Sweden SE SWE 752 Europe Northern Europe Stockholm 10605098 450295 SEK swe .se 🇸🇪
214 Eswatini Kingdom of Eswatini SZ SWZ 748 Africa Southern Africa Mbabane 1235549 17364 SZL | ZAR eng | ssw .sz 🇸🇿
215 Sint Maarten Sint Maarten SX SXM 534 Americas Caribbean Philipsburg 41349 34 ANG eng | fra | nld .sx 🇸🇽
216 Seychelles Republic of Seychelles SC SYC 690 Africa Eastern Africa Victoria 122729 452 SCR crs | eng | fra .sc 🇸🇨
217 Syria Syrian Arab Republic SY SYR 760 Asia Western Asia Damascus 25620000 185180 SYP ara .sy | سوريا. 🇸🇾
218 Turks and Caicos Islands Turks and Caicos Islands TC TCA 796 Americas Caribbean Cockburn Town 50828 948 USD eng .tc 🇹🇨
219 Chad Republic of Chad TD TCD 148 Africa Middle Africa N'Djamena 19340757 1284000 XAF ara | fra .td 🇹🇩
220 Togo Togolese Republic TG TGO 768 Africa Western Africa Lomé 8095498 56785 XOF fra .tg 🇹🇬
221 Thailand Kingdom of Thailand TH THA 764 Asia South-Eastern Asia Bangkok 65859640 513120 THB tha .th | .ไทย 🇹🇭
222 Tajikistan Republic of Tajikistan TJ TJK 762 Asia Central Asia Dushanbe 10499000 143100 TJS rus | tgk .tj 🇹🇯
223 Tokelau Tokelau TK TKL 772 Oceania Polynesia Fakaofo 2608 12 NZD eng | smo | tkl .tk 🇹🇰
224 Turkmenistan Turkmenistan TM TKM 795 Asia Central Asia Ashgabat 7057841 488100 TMT rus | tuk .tm 🇹🇲
225 Timor-Leste Democratic Republic of Timor-Leste TL TLS 626 Asia South-Eastern Asia Dili 1391221 14874 USD por | tet .tl 🇹🇱
226 Tonga Kingdom of Tonga TO TON 776 Oceania Polynesia Nuku'alofa 100179 747 TOP eng | ton .to 🇹🇴
227 Trinidad and Tobago Republic of Trinidad and Tobago TT TTO 780 Americas Caribbean Port of Spain 1367764 5130 TTD eng .tt 🇹🇹
228 Tunisia Tunisian Republic TN TUN 788 Africa Northern Africa Tunis 11972169 163610 TND ara .tn 🇹🇳
229 Turkey Republic of Turkey TR TUR 792 Asia Western Asia Ankara 85664944 783562 TRY tur .tr 🇹🇷
230 Tuvalu Tuvalu TV TUV 798 Oceania Polynesia Funafuti 10643 26 AUD | TVD eng | tvl .tv 🇹🇻
231 Taiwan Republic of China (Taiwan) TW TWN 158 Asia Eastern Asia Taipei 23317031 36197 TWD zho .tw | .台灣 | .台湾 🇹🇼
232 Tanzania United Republic of Tanzania TZ TZA 834 Africa Eastern Africa Dodoma 68153004 947303 TZS eng | swa .tz 🇹🇿
233 Uganda Republic of Uganda UG UGA 800 Africa Eastern Africa Kampala 45905417 241550 UGX eng | swa .ug 🇺🇬
234 Ukraine Ukraine UA UKR 804 Europe Eastern Europe Kyiv 32862000 603550 UAH ukr .ua | .укр 🇺🇦
235 United States Minor Outlying Islands United States Minor Outlying Islands UM UMI 581 Americas North America Washington DC 0 34.2 USD eng .us 🇺🇲
236 Uruguay Oriental Republic of Uruguay UY URY 858 Americas South America Montevideo 3499451 181034 UYU spa .uy 🇺🇾
237 United States United States of America US USA 840 Americas North America Washington, D.C. 340110988 9525067 USD eng .us 🇺🇸
238 Uzbekistan Republic of Uzbekistan UZ UZB 860 Asia Central Asia Tashkent 37859698 447400 UZS rus | uzb .uz 🇺🇿
239 Vatican City Vatican City State VA VAT 336 Europe Southern Europe Vatican City 882 0.49 EUR ita | lat .va 🇻🇦
240 Saint Vincent and the Grenadines Saint Vincent and the Grenadines VC VCT 670 Americas Caribbean Kingstown 110872 389 XCD eng .vc 🇻🇨
241 Venezuela Bolivarian Republic of Venezuela VE VEN 862 Americas South America Caracas 28517000 916445 VES spa .ve 🇻🇪
242 British Virgin Islands Virgin Islands VG VGB 092 Americas Caribbean Road Town 39471 151 USD eng .vg 🇻🇬
243 United States Virgin Islands Virgin Islands of the United States VI VIR 850 Americas Caribbean Charlotte Amalie 87146 347 USD eng .vi 🇻🇮
244 Vietnam Socialist Republic of Vietnam VN VNM 704 Asia South-Eastern Asia Hanoi 101343800 331212 VND vie .vn 🇻🇳
245 Vanuatu Republic of Vanuatu VU VUT 548 Oceania Melanesia Port Vila 321409 12189 VUV bis | eng | fra .vu 🇻🇺
246 Wallis and Futuna Territory of the Wallis and Futuna Islands WF WLF 876 Oceania Polynesia Mata-Utu 11620 142 XPF fra .wf 🇼🇫
247 Samoa Independent State of Samoa WS WSM 882 Oceania Polynesia Apia 205557 2842 WST eng | smo .ws 🇼🇸
248 Yemen Republic of Yemen YE YEM 887 Asia Western Asia Sana'a 32684503 527968 YER ara .ye 🇾🇪
249 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 🇿🇦
250 Zambia Republic of Zambia ZM ZMB 894 Africa Eastern Africa Lusaka 19693423 752612 ZMW eng .zm 🇿🇲
251 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 🇿🇼
+251
View File
@@ -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,🇿🇼
1 name_common name_official alpha2 alpha3 numeric region subregion capital population area_km2 currencies languages tlds flag
2 Aruba Aruba AW ABW 533 Americas Caribbean Oranjestad 107566 180 AWG nld | pap .aw 🇦🇼
3 Afghanistan Islamic Republic of Afghanistan AF AFG 004 Asia Southern Asia Kabul 43844000 652230 AFN prs | pus | tuk .af 🇦🇫
4 Angola Republic of Angola AO AGO 024 Africa Middle Africa Luanda 36170961 1246700 AOA por .ao 🇦🇴
5 Anguilla Anguilla AI AIA 660 Americas Caribbean The Valley 16010 91 XCD eng .ai 🇦🇮
6 Åland Islands Åland Islands AX ALA 248 Europe Northern Europe Mariehamn 30654 1580 EUR swe .ax 🇦🇽
7 Albania Republic of Albania AL ALB 008 Europe Southeast Europe Tirana 2363314 28748 ALL sqi .al 🇦🇱
8 Andorra Principality of Andorra AD AND 020 Europe Southern Europe Andorra la Vella 88406 468 EUR cat .ad 🇦🇩
9 United Arab Emirates United Arab Emirates AE ARE 784 Asia Western Asia Abu Dhabi 11294243 83600 AED ara .ae | امارات. 🇦🇪
10 Argentina Argentine Republic AR ARG 032 Americas South America Buenos Aires 46735004 2780400 ARS grn | spa .ar 🇦🇷
11 Armenia Republic of Armenia AM ARM 051 Asia Western Asia Yerevan 3076200 29743 AMD hye .am 🇦🇲
12 American Samoa American Samoa AS ASM 016 Oceania Polynesia Pago Pago 49710 199 USD eng | smo .as 🇦🇸
13 Antarctica Antarctica AQ ATA 010 Antarctic 1300 14000000 .aq 🇦🇶
14 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 🇹🇫
15 Antigua and Barbuda Antigua and Barbuda AG ATG 028 Americas Caribbean Saint John's 103603 442 XCD eng .ag 🇦🇬
16 Australia Commonwealth of Australia AU AUS 036 Oceania Australia and New Zealand Canberra 27536874 7692024 AUD eng .au 🇦🇺
17 Austria Republic of Austria AT AUT 040 Europe Central Europe Vienna 9200931 83871 EUR deu .at 🇦🇹
18 Azerbaijan Republic of Azerbaijan AZ AZE 031 Asia Western Asia Baku 10241722 86600 AZN aze .az 🇦🇿
19 Burundi Republic of Burundi BI BDI 108 Africa Eastern Africa Gitega 12332788 27834 BIF fra | run .bi 🇧🇮
20 Belgium Kingdom of Belgium BE BEL 056 Europe Western Europe Brussels 11825551 30528 EUR deu | fra | nld .be 🇧🇪
21 Benin Republic of Benin BJ BEN 204 Africa Western Africa Porto-Novo 13224860 112622 XOF fra .bj 🇧🇯
22 Burkina Faso Burkina Faso BF BFA 854 Africa Western Africa Ouagadougou 24070553 272967 XOF fra .bf 🇧🇫
23 Bangladesh People's Republic of Bangladesh BD BGD 050 Asia Southern Asia Dhaka 169828911 147570 BDT ben .bd 🇧🇩
24 Bulgaria Republic of Bulgaria BG BGR 100 Europe Southeast Europe Sofia 6437360 110879 BGN bul .bg 🇧🇬
25 Bahrain Kingdom of Bahrain BH BHR 048 Asia Western Asia Manama 1594654 765 BHD ara .bh 🇧🇭
26 Bahamas Commonwealth of the Bahamas BS BHS 044 Americas Caribbean Nassau 398165 13943 BSD | USD eng .bs 🇧🇸
27 Bosnia and Herzegovina Bosnia and Herzegovina BA BIH 070 Europe Southeast Europe Sarajevo 3422000 51209 BAM bos | hrv | srp .ba 🇧🇦
28 Saint Barthélemy Collectivity of Saint Barthélemy BL BLM 652 Americas Caribbean Gustavia 10562 21 EUR fra .bl 🇧🇱
29 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 🇸🇭
30 Belarus Republic of Belarus BY BLR 112 Europe Eastern Europe Minsk 9109280 207600 BYN bel | rus .by 🇧🇾
31 Belize Belize BZ BLZ 084 Americas Central America Belmopan 417634 22966 BZD bjz | eng | spa .bz 🇧🇿
32 Bermuda Bermuda BM BMU 060 Americas North America Hamilton 64055 54 BMD eng .bm 🇧🇲
33 Bolivia Plurinational State of Bolivia BO BOL 068 Americas South America Sucre 11365333 1098581 BOB aym | grn | que | spa .bo 🇧🇴
34 Caribbean Netherlands Bonaire, Sint Eustatius and Saba BQ BES 535 Americas Caribbean Kralendijk 31980 328 USD eng | nld | pap .bq | .nl 🇧🇶
35 Brazil Federative Republic of Brazil BR BRA 076 Americas South America Brasília 213421037 8515767 BRL por .br 🇧🇷
36 Barbados Barbados BB BRB 052 Americas Caribbean Bridgetown 267800 430 BBD eng .bb 🇧🇧
37 Brunei Nation of Brunei, Abode of Peace BN BRN 096 Asia South-Eastern Asia Bandar Seri Begawan 455500 5765 BND | SGD msa .bn 🇧🇳
38 Bhutan Kingdom of Bhutan BT BTN 064 Asia Southern Asia Thimphu 784043 38394 BTN | INR dzo .bt 🇧🇹
39 Bouvet Island Bouvet Island BV BVT 074 Antarctic 0 49 nor .bv 🇧🇻
40 Botswana Republic of Botswana BW BWA 072 Africa Southern Africa Gaborone 2359609 582000 BWP eng | tsn .bw 🇧🇼
41 Central African Republic Central African Republic CF CAF 140 Africa Middle Africa Bangui 6470307 622984 XAF fra | sag .cf 🇨🇫
42 Canada Canada CA CAN 124 Americas North America Ottawa 41651653 9984670 CAD eng | fra .ca 🇨🇦
43 Cocos (Keeling) Islands Territory of the Cocos (Keeling) Islands CC CCK 166 Oceania Australia and New Zealand West Island 593 14 AUD eng .cc 🇨🇨
44 Switzerland Swiss Confederation CH CHE 756 Europe Western Europe Bern 9082848 41284 CHF fra | gsw | ita | roh .ch 🇨🇭
45 Chile Republic of Chile CL CHL 152 Americas South America Santiago 20206953 756102 CLP spa .cl 🇨🇱
46 China People's Republic of China CN CHN 156 Asia Eastern Asia Beijing 1408280000 9706961 CNY zho .cn | .中国 | .中國 | .公司 | .网络 🇨🇳
47 Ivory Coast Republic of Côte d'Ivoire CI CIV 384 Africa Western Africa Yamoussoukro 31719275 322463 XOF fra .ci 🇨🇮
48 Cameroon Republic of Cameroon CM CMR 120 Africa Middle Africa Yaoundé 29442327 475442 XAF eng | fra .cm 🇨🇲
49 DR Congo Democratic Republic of the Congo CD COD 180 Africa Middle Africa Kinshasa 112832000 2344858 CDF fra | kon | lin | lua | swa .cd 🇨🇩
50 Republic of the Congo Republic of the Congo CG COG 178 Africa Middle Africa Brazzaville 6142180 342000 XAF fra | kon | lin .cg 🇨🇬
51 Cook Islands Cook Islands CK COK 184 Oceania Polynesia Avarua 15040 236 CKD | NZD eng | rar .ck 🇨🇰
52 Colombia Republic of Colombia CO COL 170 Americas South America Bogotá 53057212 1141748 COP spa .co 🇨🇴
53 Comoros Union of the Comoros KM COM 174 Africa Eastern Africa Moroni 919901 1862 KMF ara | fra | zdj .km 🇰🇲
54 Cape Verde Republic of Cabo Verde CV CPV 132 Africa Western Africa Praia 491233 4033 CVE por .cv 🇨🇻
55 Costa Rica Republic of Costa Rica CR CRI 188 Americas Central America San José 5309625 51100 CRC spa .cr 🇨🇷
56 Cuba Republic of Cuba CU CUB 192 Americas Caribbean Havana 9748007 109884 CUC | CUP spa .cu 🇨🇺
57 Curaçao Country of Curaçao CW CUW 531 Americas Caribbean Willemstad 156115 444 ANG eng | nld | pap .cw 🇨🇼
58 Christmas Island Territory of Christmas Island CX CXR 162 Oceania Australia and New Zealand Flying Fish Cove 1692 135 AUD eng .cx 🇨🇽
59 Cayman Islands Cayman Islands KY CYM 136 Americas Caribbean George Town 84738 264 KYD eng .ky 🇰🇾
60 Cyprus Republic of Cyprus CY CYP 196 Europe Southern Europe Nicosia 1442614 9251 EUR ell | tur .cy 🇨🇾
61 Czechia Czech Republic CZ CZE 203 Europe Central Europe Prague 10882341 78865 CZK ces | slk .cz 🇨🇿
62 Germany Federal Republic of Germany DE DEU 276 Europe Western Europe Berlin 83491249 357114 EUR deu .de 🇩🇪
63 Djibouti Republic of Djibouti DJ DJI 262 Africa Eastern Africa Djibouti 1066809 23200 DJF ara | fra .dj 🇩🇯
64 Dominica Commonwealth of Dominica DM DMA 212 Americas Caribbean Roseau 67408 751 XCD eng .dm 🇩🇲
65 Denmark Kingdom of Denmark DK DNK 208 Europe Northern Europe Copenhagen 6011488 43094 DKK dan .dk 🇩🇰
66 Dominican Republic Dominican Republic DO DOM 214 Americas Caribbean Santo Domingo 10771504 48671 DOP spa .do 🇩🇴
67 Algeria People's Democratic Republic of Algeria DZ DZA 012 Africa Northern Africa Algiers 47400000 2381741 DZD ara .dz | الجزائر. 🇩🇿
68 Ecuador Republic of Ecuador EC ECU 218 Americas South America Quito 18103660 276841 USD spa .ec 🇪🇨
69 Egypt Arab Republic of Egypt EG EGY 818 Africa Northern Africa Cairo 107271260 1002450 EGP ara .eg | .مصر 🇪🇬
70 Eritrea State of Eritrea ER ERI 232 Africa Eastern Africa Asmara 3607000 117600 ERN ara | eng | tir .er 🇪🇷
71 Western Sahara Sahrawi Arab Democratic Republic EH ESH 732 Africa Northern Africa El Aaiún 600904 266000 DZD | MAD | MRU ber | mey | spa .eh 🇪🇭
72 Spain Kingdom of Spain ES ESP 724 Europe Southern Europe Madrid 49315949 505992 EUR cat | eus | glc | spa .es 🇪🇸
73 Estonia Republic of Estonia EE EST 233 Europe Northern Europe Tallinn 1369995 45227 EUR est .ee 🇪🇪
74 Ethiopia Federal Democratic Republic of Ethiopia ET ETH 231 Africa Eastern Africa Addis Ababa 111652998 1104300 ETB amh .et 🇪🇹
75 Finland Republic of Finland FI FIN 246 Europe Northern Europe Helsinki 5650325 338455 EUR fin | swe .fi 🇫🇮
76 Fiji Republic of Fiji FJ FJI 242 Oceania Melanesia Suva 900869 18272 FJD eng | fij | hif .fj 🇫🇯
77 Falkland Islands Falkland Islands FK FLK 238 Americas South America Stanley 3662 12173 FKP eng .fk 🇫🇰
78 France French Republic FR FRA 250 Europe Western Europe Paris 66351959 543908 EUR fra .fr 🇫🇷
79 Faroe Islands Faroe Islands FO FRO 234 Europe Northern Europe Tórshavn 54885 1393 DKK | FOK dan | fao .fo 🇫🇴
80 Micronesia Federated States of Micronesia FM FSM 583 Oceania Micronesia Palikir 105564 702 USD eng .fm 🇫🇲
81 Gabon Gabonese Republic GA GAB 266 Africa Middle Africa Libreville 2469296 267668 XAF fra .ga 🇬🇦
82 United Kingdom United Kingdom of Great Britain and Northern Ireland GB GBR 826 Europe Northern Europe London 69281437 244376 GBP eng .uk 🇬🇧
83 Georgia Georgia GE GEO 268 Asia Western Asia Tbilisi 4000921 69700 GEL kat .ge 🇬🇪
84 Guernsey Bailiwick of Guernsey GG GGY 831 Europe Northern Europe St. Peter Port 64781 78 GBP | GGP eng | fra | nfr .gg 🇬🇬
85 Ghana Republic of Ghana GH GHA 288 Africa Western Africa Accra 33742380 238533 GHS eng .gh 🇬🇭
86 Gibraltar Gibraltar GI GIB 292 Europe Southern Europe Gibraltar 38000 6 GIP eng .gi 🇬🇮
87 Guinea Republic of Guinea GN GIN 324 Africa Western Africa Conakry 14363931 245857 GNF fra .gn 🇬🇳
88 Guadeloupe Guadeloupe GP GLP 312 Americas Caribbean Basse-Terre 378561 1628 EUR fra .gp 🇬🇵
89 Gambia Republic of the Gambia GM GMB 270 Africa Western Africa Banjul 2422712 10689 GMD eng .gm 🇬🇲
90 Guinea-Bissau Republic of Guinea-Bissau GW GNB 624 Africa Western Africa Bissau 1781308 36125 XOF por | pov .gw 🇬🇼
91 Equatorial Guinea Republic of Equatorial Guinea GQ GNQ 226 Africa Middle Africa Ciudad de la Paz 1668768 28051 XAF fra | por | spa .gq 🇬🇶
92 Greece Hellenic Republic GR GRC 300 Europe Southern Europe Athens 10400720 131990 EUR ell .gr 🇬🇷
93 Grenada Grenada GD GRD 308 Americas Caribbean St. George's 109021 344 XCD eng .gd 🇬🇩
94 Greenland Greenland GL GRL 304 Americas North America Nuuk 56542 2166086 DKK kal .gl 🇬🇱
95 Guatemala Republic of Guatemala GT GTM 320 Americas Central America Guatemala City 18079810 108889 GTQ spa .gt 🇬🇹
96 French Guiana Guiana GF GUF 254 Americas South America Cayenne 292354 83534 EUR fra .gf 🇬🇫
97 Guam Guam GU GUM 316 Oceania Micronesia Hagåtña 153836 549 USD cha | eng | spa .gu 🇬🇺
98 Guyana Co-operative Republic of Guyana GY GUY 328 Americas South America Georgetown 772975 214969 GYD eng .gy 🇬🇾
99 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 | .香港 🇭🇰
100 Heard Island and McDonald Islands Heard Island and McDonald Islands HM HMD 334 Antarctic 0 412 eng .hm | .aq 🇭🇲
101 Honduras Republic of Honduras HN HND 340 Americas Central America Tegucigalpa 9892632 112492 HNL spa .hn 🇭🇳
102 Croatia Republic of Croatia HR HRV 191 Europe Southeast Europe Zagreb 3866233 56594 EUR hrv .hr 🇭🇷
103 Haiti Republic of Haiti HT HTI 332 Americas Caribbean Port-au-Prince 11867032 27750 HTG fra | hat .ht 🇭🇹
104 Hungary Hungary HU HUN 348 Europe Central Europe Budapest 9539502 93028 HUF hun .hu 🇭🇺
105 Indonesia Republic of Indonesia ID IDN 360 Asia South-Eastern Asia Jakarta 284438782 1904569 IDR ind .id 🇮🇩
106 Isle of Man Isle of Man IM IMN 833 Europe Northern Europe Douglas 84530 572 GBP | IMP eng | glv .im 🇮🇲
107 India Republic of India IN IND 356 Asia Southern Asia New Delhi 1417492000 3287263 INR eng | hin | tam .in 🇮🇳
108 British Indian Ocean Territory British Indian Ocean Territory IO IOT 086 Africa Eastern Africa Diego Garcia 0 60 USD eng .io 🇮🇴
109 Ireland Republic of Ireland IE IRL 372 Europe Northern Europe Dublin 5458600 70273 EUR eng | gle .ie 🇮🇪
110 Iran Islamic Republic of Iran IR IRN 364 Asia Southern Asia Tehran 85961000 1648195 IRR fas .ir | ایران. 🇮🇷
111 Iraq Republic of Iraq IQ IRQ 368 Asia Western Asia Baghdad 46118793 438317 IQD ara | arc | ckb .iq 🇮🇶
112 Iceland Iceland IS ISL 352 Europe Northern Europe Reykjavik 391810 103000 ISK isl .is 🇮🇸
113 Israel State of Israel IL ISR 376 Asia Western Asia Jerusalem 10134800 21937 ILS ara | heb .il 🇮🇱
114 Italy Italian Republic IT ITA 380 Europe Southern Europe Rome 58927633 301336 EUR cat | ita .it 🇮🇹
115 Jamaica Jamaica JM JAM 388 Americas Caribbean Kingston 2825544 10991 JMD eng | jam .jm 🇯🇲
116 Jersey Bailiwick of Jersey JE JEY 832 Europe Northern Europe Saint Helier 103267 116 GBP | JEP eng | fra | nrf .je 🇯🇪
117 Jordan Hashemite Kingdom of Jordan JO JOR 400 Asia Western Asia Amman 11734000 89342 JOD ara .jo | الاردن. 🇯🇴
118 Japan Japan JP JPN 392 Asia Eastern Asia Tokyo 123210000 377930 JPY jpn .jp | .みんな 🇯🇵
119 Kazakhstan Republic of Kazakhstan KZ KAZ 398 Asia Central Asia Astana 20426568 2724900 KZT kaz | rus .kz | .қаз 🇰🇿
120 Kenya Republic of Kenya KE KEN 404 Africa Eastern Africa Nairobi 53330978 580367 KES eng | swa .ke 🇰🇪
121 Kyrgyzstan Kyrgyz Republic KG KGZ 417 Asia Central Asia Bishkek 7281800 199951 KGS kir | rus .kg 🇰🇬
122 Cambodia Kingdom of Cambodia KH KHM 116 Asia South-Eastern Asia Phnom Penh 17577760 181035 KHR | USD khm .kh 🇰🇭
123 Kiribati Independent and Sovereign Republic of Kiribati KI KIR 296 Oceania Micronesia South Tarawa 120740 811 AUD | KID eng | gil .ki 🇰🇮
124 Saint Kitts and Nevis Federation of Saint Christopher and Nevis KN KNA 659 Americas Caribbean Basseterre 51320 261 XCD eng .kn 🇰🇳
125 South Korea Republic of Korea KR KOR 410 Asia Eastern Asia Seoul 51159889 100210 KRW kor .kr | .한국 🇰🇷
126 Kosovo Republic of Kosovo XK UNK Europe Southeast Europe Pristina 1585566 10908 EUR sqi | srp 🇽🇰
127 Kuwait State of Kuwait KW KWT 414 Asia Western Asia Kuwait City 4881254 17818 KWD ara .kw 🇰🇼
128 Laos Lao People's Democratic Republic LA LAO 418 Asia South-Eastern Asia Vientiane 7647000 236800 LAK lao .la 🇱🇦
129 Lebanon Lebanese Republic LB LBN 422 Asia Western Asia Beirut 5490000 10452 LBP ara | fra .lb 🇱🇧
130 Liberia Republic of Liberia LR LBR 430 Africa Western Africa Monrovia 5248621 111369 LRD eng .lr 🇱🇷
131 Libya State of Libya LY LBY 434 Africa Northern Africa Tripoli 7459000 1759540 LYD ara .ly 🇱🇾
132 Saint Lucia Saint Lucia LC LCA 662 Americas Caribbean Castries 184100 616 XCD eng .lc 🇱🇨
133 Liechtenstein Principality of Liechtenstein LI LIE 438 Europe Western Europe Vaduz 40900 160 CHF deu .li 🇱🇮
134 Sri Lanka Democratic Socialist Republic of Sri Lanka LK LKA 144 Asia Southern Asia Sri Jayawardenepura Kotte 21763170 65610 LKR sin | tam .lk | .இலங்கை | .ලංකා 🇱🇰
135 Lesotho Kingdom of Lesotho LS LSO 426 Africa Southern Africa Maseru 2116427 30355 LSL | ZAR eng | sot .ls 🇱🇸
136 Lithuania Republic of Lithuania LT LTU 440 Europe Northern Europe Vilnius 2894886 65300 EUR lit .lt 🇱🇹
137 Luxembourg Grand Duchy of Luxembourg LU LUX 442 Europe Western Europe Luxembourg 681973 2586 EUR deu | fra | ltz .lu 🇱🇺
138 Latvia Republic of Latvia LV LVA 428 Europe Northern Europe Riga 1829000 64559 EUR lav .lv 🇱🇻
139 Macau Macao Special Administrative Region of the People's Republic of China MO MAC 446 Asia Eastern Asia 685900 30 MOP por | zho .mo 🇲🇴
140 Saint Martin Saint Martin MF MAF 663 Americas Caribbean Marigot 31496 53 EUR fra .fr | .gp 🇲🇫
141 Morocco Kingdom of Morocco MA MAR 504 Africa Northern Africa Rabat 36828330 446550 MAD ara | ber .ma | المغرب. 🇲🇦
142 Monaco Principality of Monaco MC MCO 492 Europe Western Europe Monaco 38423 2.02 EUR fra .mc 🇲🇨
143 Moldova Republic of Moldova MD MDA 498 Europe Eastern Europe Chișinău 2749076 33847 MDL ron .md 🇲🇩
144 Madagascar Republic of Madagascar MG MDG 450 Africa Eastern Africa Antananarivo 31727042 587041 MGA fra | mlg .mg 🇲🇬
145 Maldives Republic of the Maldives MV MDV 462 Asia Southern Asia Malé 515132 300 MVR div .mv 🇲🇻
146 Mexico United Mexican States MX MEX 484 Americas North America Mexico City 130575786 1964375 MXN spa .mx 🇲🇽
147 Marshall Islands Republic of the Marshall Islands MH MHL 584 Oceania Micronesia Majuro 42418 181 USD eng | mah .mh 🇲🇭
148 North Macedonia Republic of North Macedonia MK MKD 807 Europe Southeast Europe Skopje 1822612 25713 MKD mkd .mk 🇲🇰
149 Mali Republic of Mali ML MLI 466 Africa Western Africa Bamako 22395489 1240192 XOF fra .ml 🇲🇱
150 Malta Republic of Malta MT MLT 470 Europe Southern Europe Valletta 574250 316 EUR eng | mlt .mt 🇲🇹
151 Myanmar Republic of the Union of Myanmar MM MMR 104 Asia South-Eastern Asia Naypyidaw 51316756 676578 MMK mya .mm 🇲🇲
152 Montenegro Montenegro ME MNE 499 Europe Southeast Europe Podgorica 623327 13812 EUR cnr .me 🇲🇪
153 Mongolia Mongolia MN MNG 496 Asia Eastern Asia Ulan Bator 3544835 1564110 MNT mon .mn 🇲🇳
154 Northern Mariana Islands Commonwealth of the Northern Mariana Islands MP MNP 580 Oceania Micronesia Saipan 47329 464 USD cal | cha | eng .mp 🇲🇵
155 Mozambique Republic of Mozambique MZ MOZ 508 Africa Eastern Africa Maputo 34090466 801590 MZN por .mz 🇲🇿
156 Mauritania Islamic Republic of Mauritania MR MRT 478 Africa Western Africa Nouakchott 4927532 1030700 MRU ara .mr 🇲🇷
157 Montserrat Montserrat MS MSR 500 Americas Caribbean Plymouth 4386 102 XCD eng .ms 🇲🇸
158 Martinique Martinique MQ MTQ 474 Americas Caribbean Fort-de-France 349925 1128 EUR fra .mq 🇲🇶
159 Mauritius Republic of Mauritius MU MUS 480 Africa Eastern Africa Port Louis 1243741 2040 MUR eng | fra | mfe .mu 🇲🇺
160 Malawi Republic of Malawi MW MWI 454 Africa Eastern Africa Lilongwe 20734262 118484 MWK eng | nya .mw 🇲🇼
161 Malaysia Malaysia MY MYS 458 Asia South-Eastern Asia Kuala Lumpur 34231700 330803 MYR eng | msa .my 🇲🇾
162 Mayotte Department of Mayotte YT MYT 175 Africa Eastern Africa Mamoudzou 320901 374 EUR fra .yt 🇾🇹
163 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 🇳🇦
164 New Caledonia New Caledonia NC NCL 540 Oceania Melanesia Nouméa 264596 18575 XPF fra .nc 🇳🇨
165 Niger Republic of Niger NE NER 562 Africa Western Africa Niamey 26312034 1267000 XOF fra .ne 🇳🇪
166 Norfolk Island Territory of Norfolk Island NF NFK 574 Oceania Australia and New Zealand Kingston 2188 36 AUD eng | pih .nf 🇳🇫
167 Nigeria Federal Republic of Nigeria NG NGA 566 Africa Western Africa Abuja 223800000 923768 NGN eng .ng 🇳🇬
168 Nicaragua Republic of Nicaragua NI NIC 558 Americas Central America Managua 6803886 130373 NIO spa .ni 🇳🇮
169 Niue Niue NU NIU 570 Oceania Polynesia Alofi 1681 260 NZD eng | niu .nu 🇳🇺
170 Netherlands Kingdom of the Netherlands NL NLD 528 Europe Western Europe Amsterdam 18100436 41865 EUR nld .nl 🇳🇱
171 Norway Kingdom of Norway NO NOR 578 Europe Northern Europe Oslo 5606944 386224 NOK nno | nob | smi .no 🇳🇴
172 Nepal Federal Democratic Republic of Nepal NP NPL 524 Asia Southern Asia Kathmandu 29911840 147181 NPR nep .np 🇳🇵
173 Nauru Republic of Nauru NR NRU 520 Oceania Micronesia Yaren 11680 21 AUD eng | nau .nr 🇳🇷
174 New Zealand New Zealand NZ NZL 554 Oceania Australia and New Zealand Wellington 5324700 268838 NZD eng | mri | nzs .nz 🇳🇿
175 Oman Sultanate of Oman OM OMN 512 Asia Western Asia Muscat 5343630 309500 OMR ara .om 🇴🇲
176 Pakistan Islamic Republic of Pakistan PK PAK 586 Asia Southern Asia Islamabad 241499431 796095 PKR eng | urd .pk 🇵🇰
177 Panama Republic of Panama PA PAN 591 Americas Central America Panama City 4064780 75417 PAB | USD spa .pa 🇵🇦
178 Pitcairn Islands Pitcairn Group of Islands PN PCN 612 Oceania Polynesia Adamstown 35 47 NZD eng .pn 🇵🇳
179 Peru Republic of Peru PE PER 604 Americas South America Lima 34350244 1285216 PEN aym | que | spa .pe 🇵🇪
180 Philippines Republic of the Philippines PH PHL 608 Asia South-Eastern Asia Manila 114123600 342353 PHP eng | fil .ph 🇵🇭
181 Palau Republic of Palau PW PLW 585 Oceania Micronesia Ngerulmud 16733 459 USD eng | pau .pw 🇵🇼
182 Papua New Guinea Independent State of Papua New Guinea PG PNG 598 Oceania Melanesia Port Moresby 11781559 462840 PGK eng | hmo | tpi .pg 🇵🇬
183 Poland Republic of Poland PL POL 616 Europe Central Europe Warsaw 37392000 312679 PLN pol .pl 🇵🇱
184 Puerto Rico Commonwealth of Puerto Rico PR PRI 630 Americas Caribbean San Juan 3203295 8870 USD eng | spa .pr 🇵🇷
185 North Korea Democratic People's Republic of Korea KP PRK 408 Asia Eastern Asia Pyongyang 25950000 120538 KPW kor .kp 🇰🇵
186 Portugal Portuguese Republic PT PRT 620 Europe Southern Europe Lisbon 10749635 92090 EUR por .pt 🇵🇹
187 Paraguay Republic of Paraguay PY PRY 600 Americas South America Asunción 6109644 406752 PYG grn | spa .py 🇵🇾
188 Palestine State of Palestine PS PSE 275 Asia Western Asia Ramallah | Jerusalem 5483450 6220 EGP | ILS | JOD ara .ps | فلسطين. 🇵🇸
189 French Polynesia French Polynesia PF PYF 258 Oceania Polynesia Papeetē 279500 4167 XPF fra .pf 🇵🇫
190 Qatar State of Qatar QA QAT 634 Asia Western Asia Doha 3173024 11586 QAR ara .qa | قطر. 🇶🇦
191 Réunion Réunion Island RE REU 638 Africa Eastern Africa Saint-Denis 896175 2511 EUR fra .re 🇷🇪
192 Romania Romania RO ROU 642 Europe Southeast Europe Bucharest 19036031 238391 RON ron .ro 🇷🇴
193 Russia Russian Federation RU RUS 643 Europe Eastern Europe Moscow 146028325 17098246 RUB rus .ru | .su | .рф 🇷🇺
194 Rwanda Republic of Rwanda RW RWA 646 Africa Eastern Africa Kigali 14104969 26338 RWF eng | fra | kin .rw 🇷🇼
195 Saudi Arabia Kingdom of Saudi Arabia SA SAU 682 Asia Western Asia Riyadh 35300280 2149690 SAR ara .sa | .السعودية 🇸🇦
196 Sudan Republic of the Sudan SD SDN 729 Africa Northern Africa Khartoum 51662000 1886068 SDG ara | eng .sd 🇸🇩
197 Senegal Republic of Senegal SN SEN 686 Africa Western Africa Dakar 18593258 196722 XOF fra .sn 🇸🇳
198 Singapore Republic of Singapore SG SGP 702 Asia South-Eastern Asia Singapore 6110200 710 SGD eng | msa | tam | zho .sg | .新加坡 | .சிங்கப்பூர் 🇸🇬
199 South Georgia South Georgia and the South Sandwich Islands GS SGS 239 Antarctic King Edward Point 0 3903 GBP eng .gs 🇬🇸
200 Svalbard and Jan Mayen Svalbard og Jan Mayen SJ SJM 744 Europe Northern Europe Longyearbyen 2530 61399 NOK nor .sj 🇸🇯
201 Solomon Islands Solomon Islands SB SLB 090 Oceania Melanesia Honiara 750325 28896 SBD eng .sb 🇸🇧
202 Sierra Leone Republic of Sierra Leone SL SLE 694 Africa Western Africa Freetown 9077691 71740 SLE eng .sl 🇸🇱
203 El Salvador Republic of El Salvador SV SLV 222 Americas Central America San Salvador 6029976 21041 USD spa .sv 🇸🇻
204 San Marino Republic of San Marino SM SMR 674 Europe Southern Europe City of San Marino 34132 61 EUR ita .sm 🇸🇲
205 Somalia Federal Republic of Somalia SO SOM 706 Africa Eastern Africa Mogadishu 19655000 637657 SOS ara | som .so 🇸🇴
206 Saint Pierre and Miquelon Saint Pierre and Miquelon PM SPM 666 Americas North America Saint-Pierre 5819 242 EUR fra .pm 🇵🇲
207 Serbia Republic of Serbia RS SRB 688 Europe Southeast Europe Belgrade 6567783 77589 RSD srp .rs | .срб 🇷🇸
208 South Sudan Republic of South Sudan SS SSD 728 Africa Middle Africa Juba 15786898 619745 SSP eng .ss 🇸🇸
209 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 🇸🇹
210 Suriname Republic of Suriname SR SUR 740 Americas South America Paramaribo 616500 163820 SRD nld .sr 🇸🇷
211 Slovakia Slovak Republic SK SVK 703 Europe Central Europe Bratislava 5413813 49037 EUR slk .sk 🇸🇰
212 Slovenia Republic of Slovenia SI SVN 705 Europe Central Europe Ljubljana 2130638 20273 EUR slv .si 🇸🇮
213 Sweden Kingdom of Sweden SE SWE 752 Europe Northern Europe Stockholm 10605098 450295 SEK swe .se 🇸🇪
214 Eswatini Kingdom of Eswatini SZ SWZ 748 Africa Southern Africa Mbabane 1235549 17364 SZL | ZAR eng | ssw .sz 🇸🇿
215 Sint Maarten Sint Maarten SX SXM 534 Americas Caribbean Philipsburg 41349 34 ANG eng | fra | nld .sx 🇸🇽
216 Seychelles Republic of Seychelles SC SYC 690 Africa Eastern Africa Victoria 122729 452 SCR crs | eng | fra .sc 🇸🇨
217 Syria Syrian Arab Republic SY SYR 760 Asia Western Asia Damascus 25620000 185180 SYP ara .sy | سوريا. 🇸🇾
218 Turks and Caicos Islands Turks and Caicos Islands TC TCA 796 Americas Caribbean Cockburn Town 50828 948 USD eng .tc 🇹🇨
219 Chad Republic of Chad TD TCD 148 Africa Middle Africa N'Djamena 19340757 1284000 XAF ara | fra .td 🇹🇩
220 Togo Togolese Republic TG TGO 768 Africa Western Africa Lomé 8095498 56785 XOF fra .tg 🇹🇬
221 Thailand Kingdom of Thailand TH THA 764 Asia South-Eastern Asia Bangkok 65859640 513120 THB tha .th | .ไทย 🇹🇭
222 Tajikistan Republic of Tajikistan TJ TJK 762 Asia Central Asia Dushanbe 10499000 143100 TJS rus | tgk .tj 🇹🇯
223 Tokelau Tokelau TK TKL 772 Oceania Polynesia Fakaofo 2608 12 NZD eng | smo | tkl .tk 🇹🇰
224 Turkmenistan Turkmenistan TM TKM 795 Asia Central Asia Ashgabat 7057841 488100 TMT rus | tuk .tm 🇹🇲
225 Timor-Leste Democratic Republic of Timor-Leste TL TLS 626 Asia South-Eastern Asia Dili 1391221 14874 USD por | tet .tl 🇹🇱
226 Tonga Kingdom of Tonga TO TON 776 Oceania Polynesia Nuku'alofa 100179 747 TOP eng | ton .to 🇹🇴
227 Trinidad and Tobago Republic of Trinidad and Tobago TT TTO 780 Americas Caribbean Port of Spain 1367764 5130 TTD eng .tt 🇹🇹
228 Tunisia Tunisian Republic TN TUN 788 Africa Northern Africa Tunis 11972169 163610 TND ara .tn 🇹🇳
229 Turkey Republic of Turkey TR TUR 792 Asia Western Asia Ankara 85664944 783562 TRY tur .tr 🇹🇷
230 Tuvalu Tuvalu TV TUV 798 Oceania Polynesia Funafuti 10643 26 AUD | TVD eng | tvl .tv 🇹🇻
231 Taiwan Republic of China (Taiwan) TW TWN 158 Asia Eastern Asia Taipei 23317031 36197 TWD zho .tw | .台灣 | .台湾 🇹🇼
232 Tanzania United Republic of Tanzania TZ TZA 834 Africa Eastern Africa Dodoma 68153004 947303 TZS eng | swa .tz 🇹🇿
233 Uganda Republic of Uganda UG UGA 800 Africa Eastern Africa Kampala 45905417 241550 UGX eng | swa .ug 🇺🇬
234 Ukraine Ukraine UA UKR 804 Europe Eastern Europe Kyiv 32862000 603550 UAH ukr .ua | .укр 🇺🇦
235 United States Minor Outlying Islands United States Minor Outlying Islands UM UMI 581 Americas North America Washington DC 0 34.2 USD eng .us 🇺🇲
236 Uruguay Oriental Republic of Uruguay UY URY 858 Americas South America Montevideo 3499451 181034 UYU spa .uy 🇺🇾
237 United States United States of America US USA 840 Americas North America Washington, D.C. 340110988 9525067 USD eng .us 🇺🇸
238 Uzbekistan Republic of Uzbekistan UZ UZB 860 Asia Central Asia Tashkent 37859698 447400 UZS rus | uzb .uz 🇺🇿
239 Vatican City Vatican City State VA VAT 336 Europe Southern Europe Vatican City 882 0.49 EUR ita | lat .va 🇻🇦
240 Saint Vincent and the Grenadines Saint Vincent and the Grenadines VC VCT 670 Americas Caribbean Kingstown 110872 389 XCD eng .vc 🇻🇨
241 Venezuela Bolivarian Republic of Venezuela VE VEN 862 Americas South America Caracas 28517000 916445 VES spa .ve 🇻🇪
242 British Virgin Islands Virgin Islands VG VGB 092 Americas Caribbean Road Town 39471 151 USD eng .vg 🇻🇬
243 United States Virgin Islands Virgin Islands of the United States VI VIR 850 Americas Caribbean Charlotte Amalie 87146 347 USD eng .vi 🇻🇮
244 Vietnam Socialist Republic of Vietnam VN VNM 704 Asia South-Eastern Asia Hanoi 101343800 331212 VND vie .vn 🇻🇳
245 Vanuatu Republic of Vanuatu VU VUT 548 Oceania Melanesia Port Vila 321409 12189 VUV bis | eng | fra .vu 🇻🇺
246 Wallis and Futuna Territory of the Wallis and Futuna Islands WF WLF 876 Oceania Polynesia Mata-Utu 11620 142 XPF fra .wf 🇼🇫
247 Samoa Independent State of Samoa WS WSM 882 Oceania Polynesia Apia 205557 2842 WST eng | smo .ws 🇼🇸
248 Yemen Republic of Yemen YE YEM 887 Asia Western Asia Sana'a 32684503 527968 YER ara .ye 🇾🇪
249 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 🇿🇦
250 Zambia Republic of Zambia ZM ZMB 894 Africa Eastern Africa Lusaka 19693423 752612 ZMW eng .zm 🇿🇲
251 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 🇿🇼
+32
View File
@@ -0,0 +1,32 @@
rank,extension,file_count
1,.md,829
2,.png,803
3,.py,653
4,.txt,551
5,.json,231
6,.sh,56
7,.html,55
8,.csv,43
9,.svg,31
10,.age,16
11,.tsv,15
12,.xml,12
13,(none),11
14,.gitignore,5
15,.log,5
16,.pdf,4
17,.sha256,4
18,.jsonl,3
19,.mp3,3
20,.c,2
21,.diff,2
22,.jpg,2
23,.check,1
24,.dl,1
25,.goyiwz,1
26,.gz,1
27,.mailmap,1
28,.md5,1
29,".py""""",1
30,.rc,1
31,.yaml,1
1 rank extension file_count
2 1 .md 829
3 2 .png 803
4 3 .py 653
5 4 .txt 551
6 5 .json 231
7 6 .sh 56
8 7 .html 55
9 8 .csv 43
10 9 .svg 31
11 10 .age 16
12 11 .tsv 15
13 12 .xml 12
14 13 (none) 11
15 14 .gitignore 5
16 15 .log 5
17 16 .pdf 4
18 17 .sha256 4
19 18 .jsonl 3
20 19 .mp3 3
21 20 .c 2
22 21 .diff 2
23 22 .jpg 2
24 23 .check 1
25 24 .dl 1
26 25 .goyiwz 1
27 26 .gz 1
28 27 .mailmap 1
29 28 .md5 1
30 29 .py"" 1
31 30 .rc 1
32 31 .yaml 1
@@ -0,0 +1,10 @@
{
"source": "repo_files.tsv",
"rows": 31,
"total_files": 3345,
"unique_extensions": 31,
"extractor": "extract_extension_census.py",
"verifier": "verify_extension_census.py",
"check": "CHECK-extension-census-2026-11-03",
"created_utc": "2026-11-03T00:00:00Z"
}
+41
View File
@@ -0,0 +1,41 @@
# Extension census
Ranked census of file extensions across the troupe worktree (re-derived from `repo_files.tsv` by `extract_extension_census.py`).
| rank | extension | file_count |
|---|---|---|
| 1 | .md | 829 |
| 2 | .png | 803 |
| 3 | .py | 653 |
| 4 | .txt | 551 |
| 5 | .json | 231 |
| 6 | .sh | 56 |
| 7 | .html | 55 |
| 8 | .csv | 43 |
| 9 | .svg | 31 |
| 10 | .age | 16 |
| 11 | .tsv | 15 |
| 12 | .xml | 12 |
| 13 | (none) | 11 |
| 14 | .gitignore | 5 |
| 15 | .log | 5 |
| 16 | .pdf | 4 |
| 17 | .sha256 | 4 |
| 18 | .jsonl | 3 |
| 19 | .mp3 | 3 |
| 20 | .c | 2 |
| 21 | .diff | 2 |
| 22 | .jpg | 2 |
| 23 | .check | 1 |
| 24 | .dl | 1 |
| 25 | .goyiwz | 1 |
| 26 | .gz | 1 |
| 27 | .mailmap | 1 |
| 28 | .md5 | 1 |
| 29 | .py"" | 1 |
| 30 | .rc | 1 |
| 31 | .yaml | 1 |
**Total files: 3345**
**Unique extensions: 31**
+100
View File
@@ -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())
+96
View File
@@ -0,0 +1,96 @@
#!/usr/bin/env python3
"""Extract a ranked file-extension census from wizard-work/ledger/repo_files.tsv.
Source: repo_files.tsv is a (rank, path) inventory of the troupe worktree:
rank<TAB>path
Some path cells were written through a Python repr/json serializer and carry
escaped quotes/newlines; we de-escape, take the basename, and count
extensions (lowercased, leading dot on the suffix unless there is none,
which is emitted as the literal "(none)").
Output (extension-census.csv):
rank,extension,file_count
1,.md,829
...
and extension-census.md (ranked + totals row). Run:
python3 extract_extension_census.py
"""
import csv
import os
import sys
from collections import Counter
REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
SRC = os.path.join(REPO, "repo_files.tsv")
OUT_CSV = os.path.join(REPO, "wizard-work", "ledger", "extension-census.csv")
OUT_MD = os.path.join(REPO, "wizard-work", "ledger", "extension-census.md")
def clean_path(raw: str) -> str:
s = raw.strip()
# De-quote a cell that was wrapped in double quotes (Python repr / json).
if len(s) >= 2 and s[0] == '"' and s[-1] == '"':
s = s[1:-1]
# De-escape backslash escapes: \\ -> \, \" -> ", \n -> newline, \t -> tab.
s = s.encode("latin-1").decode("unicode_escape")
return s
def ext_of(path: str) -> str:
base = os.path.basename(path.rstrip("/"))
if not base or base in (".", ".."):
return "(none)"
if "." in base:
return "." + base.rsplit(".", 1)[1].lower()
return "(none)"
def main() -> int:
counts: Counter = Counter()
total_rows = 0
with open(SRC, newline="", encoding="utf-8") as f:
for line in f:
line = line.rstrip("\n").rstrip("\r")
if not line.strip():
continue
if "\t" not in line:
continue
rank, path = line.split("\t", 1)
path = clean_path(path)
total_rows += 1
ext = ext_of(path)
counts[ext] += 1
# order: by count desc, then extension asc
ordered = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))
with open(OUT_CSV, "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["rank", "extension", "file_count"])
for i, (ext, n) in enumerate(ordered, 1):
w.writerow([i, ext, n])
total_files = sum(counts.values())
md = []
md.append("# Extension census")
md.append("")
md.append("Ranked census of file extensions across the troupe worktree "
"(re-derived from `repo_files.tsv` by `extract_extension_census.py`).")
md.append("")
md.append("| rank | extension | file_count |")
md.append("|---|---|---|")
for i, (ext, n) in enumerate(ordered, 1):
md.append("| %d | %s | %d |" % (i, ext, n))
md.append("")
md.append("**Total files: %d**" % total_files)
md.append("**Unique extensions: %d**" % len(ordered))
md.append("")
with open(OUT_MD, "w", encoding="utf-8") as f:
f.write("\n".join(md) + "\n")
print("rows=%d total_files=%d extensions=%d"
% (total_rows, total_files, len(ordered)))
print("top10=%s" % ordered[:10])
return 0
if __name__ == "__main__":
sys.exit(main())
+269
View File
@@ -0,0 +1,269 @@
#!/usr/bin/env python3
"""grade_jobs_table.py -- the grader behind `CHECK-2026-11-02-jobs-table`.
WHY THIS FILE EXISTS (Q161, 2026-11-03)
The entry point at `wizard-work/ledger/CHECK-2026-11-02-jobs-table` used to be
this program with a `python3` shebang. Every caller in this tree invokes an
entry point with `bash` (the q143 sweep, `tools/verify.py`'s doc-command leg,
and any reader who types the path), so `bash CHECK-2026-11-02-jobs-table` read
rc 2 on shell syntax errors before grading a cell -- measured at `2e57e6b`:
`line 18: syntax error near unexpected token '('`. The grader moved here; the
path keeps a bash wrapper, which is the stable entry point.
Second defect, same record: the derivation read three source JSONs from the
literal host path `/root`. With those absent -- any clone, any other host --
the program died with `FileNotFoundError` and rc 1, i.e. "could not grade" was
reported as a fault. A missing source is not a failed artifact. It is now rc 2
and says so. The root is overridable with `JOBS_SRC_ROOT` so the absent case
can be exercised as a cell instead of argued about.
WHAT IT GRADES
default / --from-source the item's own claim: the committed `jobs.csv`
re-derives BYTE-FOR-BYTE from the source JSONs, and
its sha256 / row count / per-source counts /
fieldnames equal the frozen `manifest.json`. Plus the
required key fields are populated.
--offline the legs that do not need the sources: manifest
sha256 against the committed bytes, row count, header
vs manifest fieldnames, and each on-disk row's
required key fields non-empty. It says, in its own
output, that re-derivation was not attempted -- a
weaker reading is allowed, an unstated one is not.
EXIT CODES
0 every leg of the mode graded, all passed
1 a graded leg failed (drift, digest mismatch, empty required field)
2 could not grade: a source file is absent in a mode that needs it, a pinned
artifact is missing, or the manifest cannot be read. Never used for "the
artifact is wrong".
"""
import csv
import hashlib
import html
import io
import json
import os
import re
import sys
from typing import NoReturn
HERE = os.path.dirname(os.path.abspath(__file__))
MANIFEST = os.path.join(HERE, "manifest.json")
CSV = os.path.join(HERE, "jobs.csv")
# The three raw scrape files the table was built from. They are not tracked --
# they are the extraction lane's inputs -- so this path is a host fact, not a
# repository fact, and the check must be able to say it cannot grade without it.
SRC_FILES = {
"more_candidates.json": "more",
"ashby_candidates.json": "ashby",
"greenhouse_candidates.json": "greenhouse",
}
SRC_ROOT = os.environ.get("JOBS_SRC_ROOT", "/root")
TAG_RE = re.compile(r"<[^>]+>")
REQUIRED = ["source", "title", "job_url"]
def strip_html(s):
if not s:
return ""
s = html.unescape(s)
s = TAG_RE.sub(" ", s)
return " ".join(s.split())
def emp_of(rec):
for k in ("employmentType", "workplaceType"):
v = rec.get(k)
if v:
return v
return ""
def publish_at(rec):
return rec.get("publishedAt") or rec.get("updated_at") or ""
def desc_of(rec):
for k in ("descriptionPlain", "content", "descriptionHtml"):
v = rec.get(k)
if v:
return strip_html(v)[:220]
return ""
def build_expected_rows():
rows = []
counts = {}
for src_file, src_label in SRC_FILES.items():
path = os.path.join(SRC_ROOT, src_file)
with open(path) as fh:
data = json.load(fh)
counts[src_label] = 0
for rec in data:
rows.append({
"source": src_label,
"org": rec.get("org") or rec.get("board") or "",
"title": rec.get("title") or "",
"location": rec.get("location") or "",
"department": rec.get("department") or "",
"employment_type": emp_of(rec),
"job_url": rec.get("jobUrl") or rec.get("url") or "",
"apply_url": rec.get("applyUrl") or "",
"published_at": publish_at(rec),
"description": desc_of(rec),
})
counts[src_label] += 1
return rows, counts
def csv_bytes(rows):
buf = io.StringIO()
w = csv.DictWriter(buf, fieldnames=list(rows[0].keys()) if rows else [])
w.writeheader()
w.writerows(rows)
return buf.getvalue().encode("utf-8")
def cannot_grade(msg: str) -> NoReturn:
print("CANNOT GRADE: " + msg)
sys.exit(2)
def missing_sources():
return [f for f in SRC_FILES if not os.path.isfile(os.path.join(SRC_ROOT, f))]
def main(argv):
mode = "from-source"
for arg in argv:
if arg == "--offline":
mode = "offline"
elif arg in ("--from-source", "--default"):
mode = "from-source"
elif arg in ("-h", "--help"):
print(__doc__)
return 0
else:
print("unknown argument: %s" % arg)
return 2
if not os.path.isfile(MANIFEST):
cannot_grade("manifest.json is missing beside this grader")
if not os.path.isfile(CSV):
cannot_grade("jobs.csv is missing beside this grader")
try:
with open(MANIFEST) as fh:
manifest = json.load(fh)
except (ValueError, OSError) as ex:
cannot_grade("manifest.json is unreadable: %r" % ex)
if mode == "from-source":
absent = missing_sources()
if absent:
cannot_grade(
"source JSON(s) absent under %s: %s -- the byte-for-byte "
"re-derivation cannot be graded here; `--offline` grades the "
"committed artifact alone and says so"
% (SRC_ROOT, ", ".join(sorted(absent))))
ok = True
failures = []
with open(CSV, "rb") as fh:
on_disk_bytes = fh.read()
disk_sha = hashlib.sha256(on_disk_bytes).hexdigest()
text = on_disk_bytes.decode("utf-8", "surrogateescape")
n_data = text.count("\n") - 1 # minus header
# --- legs 1-3: the manifest's facts against the committed bytes ----------
sha_ok = disk_sha == manifest.get("sha256")
if not sha_ok:
ok = False
failures.append("sha256 mismatch: on-disk=%s manifest=%s"
% (disk_sha, manifest.get("sha256")))
count_ok = manifest.get("row_count") == n_data
if not count_ok:
ok = False
failures.append("row_count mismatch: manifest=%s ondisk_data=%s"
% (manifest.get("row_count"), n_data))
reader = csv.DictReader(io.StringIO(text))
fields = reader.fieldnames
fields_ok = fields == manifest.get("fieldnames")
if not fields_ok:
ok = False
failures.append("fieldnames mismatch: %s" % fields)
disk_rows = list(reader)
unreadable = [i for i, r in enumerate(disk_rows)
if r is None or any(not (r.get(k) or "").strip() for k in REQUIRED)]
if unreadable:
ok = False
failures.append("rows with empty required field: %s" % unreadable[:5])
derived_rows = None
deriv_ok = None
if mode == "from-source":
# --- legs 4-5: re-derivation from the pinned sources -----------------
derived_rows, derived_counts = build_expected_rows()
derived_bytes = csv_bytes(derived_rows)
deriv_ok = on_disk_bytes == derived_bytes
if not deriv_ok:
ok = False
failures.append(
"jobs.csv bytes differ from a fresh re-derivation from source "
"(on-disk %d bytes, derived %d bytes)"
% (len(on_disk_bytes), len(derived_bytes)))
o = text.splitlines()
e = derived_bytes.decode("utf-8", "surrogateescape").splitlines()
for i in range(max(len(o), len(e))):
a = o[i] if i < len(o) else "<missing>"
b = e[i] if i < len(e) else "<missing>"
if a != b:
failures.append("line %d: ondisk=%r derived=%r"
% (i, a[:60], b[:60]))
break
if derived_counts != manifest.get("counts"):
ok = False
failures.append("counts mismatch: manifest=%s derived=%s"
% (manifest.get("counts"), derived_counts))
if len(derived_rows) != n_data:
ok = False
failures.append("derived_rows %d != on-disk rows %d"
% (len(derived_rows), n_data))
# ---- measured report ----------------------------------------------------
print("CHECK-2026-11-02-jobs-table [%s]" % mode)
print(" source_root: %s%s"
% (SRC_ROOT, "" if mode == "from-source" else " (not read in this mode)"))
if mode == "from-source":
print(" source_files: %s"
% ", ".join("%s=%d" % kv for kv in sorted(derived_counts.items())))
print(" derived_rows: %d" % len(derived_rows))
print(" byte_identical: %s" % deriv_ok)
else:
print(" re_derivation: NOT ATTEMPTED (--offline: the sources are not read)")
print(" manifest.row_count: %s" % manifest.get("row_count"))
print(" on-disk_rows: %d" % n_data)
print(" sha256: %s" % disk_sha)
print(" csv_bytes: %d" % len(on_disk_bytes))
print(" fieldnames_match: %s" % fields_ok)
print(" required_fields_populated: %d/%d" % (len(disk_rows) - len(unreadable),
len(disk_rows)))
if ok:
print("VERDICT: PASS (%s)"
% ("jobs.csv re-derives from source and matches manifest"
if mode == "from-source"
else "committed artifact matches its manifest; source derivation not attempted"))
return 0
print("VERDICT: FAIL")
for f in failures:
print(" - " + f)
return 1
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
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()
+83
View File
@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""Independent verifier for the extension census.
Re-derives the census from the SOURCE file `repo_files.tsv` (rank<TAB>path,
CRLF) with a standalone loop -- it never imports extract_extension_census --
normalizes CRLF line endings, and asserts the resulting ranked (extension,
count) table byte-matches `extension-census.csv` produced by that script.
Exit code 0 = artifact matches re-derivation; 1 = mismatch; 2 = misuse.
"""
import csv
import os
import sys
REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
SRC = os.path.join(REPO, "repo_files.tsv")
ART = os.path.join(REPO, "wizard-work", "ledger", "extension-census.csv")
PASS = 0
def clean_path(raw):
s = raw.strip()
if len(s) >= 2 and s[0] == '"' and s[-1] == '"':
s = s[1:-1]
return s.encode("latin-1", "replace").decode("unicode_escape", "replace")
def ext_of(path):
base = os.path.basename(path.rstrip("/"))
if not base or base in (".", ".."):
return "(none)"
if "." in base:
return "." + base.rsplit(".", 1)[1].lower()
return "(none)"
def re_derivation():
counts = {}
total = 0
with open(SRC, "r", encoding="utf-8", errors="replace") as f:
for line in f:
line = line.rstrip("\n").rstrip("\r")
if "\t" not in line:
continue
path = clean_path(line.split("\t", 1)[1])
total += 1
ext = ext_of(path)
counts[ext] = counts.get(ext, 0) + 1
return sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))
def read_artifact():
rows = []
with open(ART, newline="", encoding="utf-8") as f:
for row in csv.reader(f):
rows.append(row)
return rows[0], rows[1:]
def main():
global PASS
header, rows = read_artifact()
if header != ["rank", "extension", "file_count"]:
print("FAIL: bad header %r" % (header,))
return 1
expected = re_derivation()
if len(rows) != len(expected):
print("FAIL: row count artifact=%d rederivation=%d"
% (len(rows), len(expected)))
return 1
for i, ((ext, cnt), row) in enumerate(zip(expected, rows), 1):
if row != [str(i), ext, str(cnt)]:
print("FAIL: row %d artifact=%r expected=%r"
% (i, row, [str(i), ext, str(cnt)]))
return 1
print("OK: %d rows byte-match re-derivation from repo_files.tsv; header=%r"
% (len(rows), header))
return 0
if __name__ == "__main__":
sys.exit(main())
+84
View File
@@ -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())
+25 -115
View File
@@ -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")
@@ -0,0 +1,25 @@
THE LAST CARTOGRAPHER
Mira unfolded the paper map under the amber glow of the lantern, tracing the faded contour line that marked the Sunder Pass. The ink had bled over the years, turning the river into a smudge, but she could still read the old cartographer’s hand — a loop here, a flourish there — the signature of a man who had once believed that every inch of the world could be named and tamed.
She was the last of the guild. The others had turned to satellite feeds and algorithmic terrain models, their screens humming with real-time elevation data. Mira kept her ink and her compass because machines could not draw what mattered: the weight of a mountain, the silence of a desert, the way a forest floor felt under a boot.
The commission had come from the Archive in the capital: find the Valley of Whispers, verify its existence, and chart a safe route. The official records said no such valley existed. The locals spoke of it in whispers, a place where sound traveled for miles and the stones hummed with old memory.
Mira packed her brass compass, three bottles of ink, and a blank vellum roll into her leather satchel. She saddled her mare, Aldra, and rode west before the sun had cleared the eastern ridge.
The first day took her through pine forests that smelled of resin and cold shadow. The second day climbed into the crags where wind carved shapes like cathedral spires. On the third morning, Aldra stopped at the edge of a meadow and would go no farther. Mira dismounted and walked. The air here was different — warmer, heavier, as if the atmosphere itself had thickened with story.
She took out her compass. The needle spun laziously, then settled pointing straight up. She smiled. Magnetic north was a human fiction. Here, the earth remembered something else.
She set up her tripod and began to draw. Every hour she noted the landmarks: a stand of silver birch whose leaves chimed without wind, a boulder split cleanly down the middle and glazed with a substance like black glass. She drew not only shapes but textures: the grit of soil, the stickiness of sap, the particular silence that pressed against her ears.
By dusk she had filled three feet of vellum. She camped in the lee of a ridge and listened to the valley hum — a low resonance that traveled through bone more than air. It sounded like a choir holding a single note for centuries.
She stayed seven days. On the morning of the eighth, she packed her instruments, mounted Aldra, and rode back the way she had come. The map was heavy, but her heart was heavier with the knowledge that some places resist being reduced to coordinates.
In the capital, the archivists scanned her vellum and uploaded it to the server. Within hours, the algorithms had overlaid her hand-drawn contour lines with satellite data and corrected her magnetic anomalies. The Valley of Whispers was assigned a grid reference. Tour packages followed.
Mira did not protest. She knew that the world belonged to those who would map it, and she had given them a map. But in the quiet hours of her study, she would unroll the original vellum and trace the lines with her finger, remembering the hum of the stones and the chime of the leaves, preserving in her body what no machine could ever hold.
Some truths cannot be digitized. They must be carried.
+219 -22
View File
@@ -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
View File
@@ -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,5 +1,5 @@
{
"generated_utc": "2026-11-02T23:35:35Z",
"generated_utc": "2026-11-02T23:45:44Z",
"profile": "/root/.hermes/profiles/sol",
"type": "sol-profile-triage",
"generated_for": "2026-11-02",
@@ -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())
+20 -2
View File
@@ -562,8 +562,26 @@ 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.
# Q160 (2026-11-03): one heading (## Q160 closure) and one record (**Q160 --
# OPENED and REPAIRED ...) for a new id, so headings 107 -> 108, heading_ids
# 94 -> 95, records 121 -> 122, record_ids 87 -> 88, ids 149 -> 150;
# record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no
# probe; CHECK-q160 is its guard). Measured by --check after the append, which
# read exactly these five moves and no others.
# Q161 (2026-11-03): the same shape -- one heading (## Q161 closure) and one
# record (**Q161 -- OPENED and REPAIRED ...) for a new id: headings 108 -> 109,
# heading_ids 95 -> 96, records 122 -> 123, record_ids 88 -> 89, ids 150 -> 151;
# record_only stays 55 and open / opened stay 0 / 26 (same-tick closure, no
# probe; CHECK-q161 is its guard). Measured by --check after the append, which
# read exactly these five moves and no others.
PIN_COUNTS = {"headings": 109, "heading_ids": 96, "records": 123,
"record_ids": 89, "ids": 151, "open": 0, "opened": 26,
"record_only": 55}
PIN_STATE = {
@@ -168,3 +168,55 @@ CHECK-q157 0 q157: 6 leg(s), all passed
# rc 0 measured at this worktree with `bash CHECK-q158` (3.2 s). Every row above
# is unchanged and none was re-taken by this item.
CHECK-q158 0 q158: 6 leg(s), all passed
# rows added by hand (Q159, 2026-11-02): the 21 entry points check_sweep.py
# reported NEW at 9a9061f (in the tree, unswept). Each code below was MEASURED
# this tick by run21.py, which imports this directory's run_entry (same
# interpreter choice, cwd, timeout) -- not copied from a run's prose. 19 read
# rc 0 and are signed; 2 read rc 1 and are signed as KNOWN RED with the first
# fault line each printed, so the path census is complete and both reds stay
# visible in every --check. CHECK-q85 read rc 1 at 9a9061f (coverage leg:
# tarjan_scc UNCOVERED; lane gate red) and rc 0 after test_tarjan_scc.py landed
# in the beam lane -- both readings in the directory named below.
# Reading files: new21-readings.tsv (audit), q85-after.tsv (re-read),
# run21.py and mutate_tarjan.py, all in
# /root/.hermes/wizard-outputs/volt/volt-2026-11-02-q159-unswept/
CHECK-q156 0 q156: 6 leg(s), all passed (measured 75.5s)
CHECK-q85 0 q85: 5 leg(s) passed, 0 fault(s), 0 ungradable (measured 64.2s)
CHECK-sol-lane-triage-2026-11-01 0 VERIFY OK (339 files, categories re-derived, all paths present) (measured 6.4s)
CHECK-sol-lane-triage-2026-11-02 0 VERIFY OK (382 files, categories re-derived, all paths present) (measured 7.1s)
CHECK-sol-profile-triage-2026-11-02 1 KNOWN RED: artifact categories != live disk (sol profile changed after the artifact was taken)
wizard-work/ledger/2026-11-02-openmeteo-cities/CHECK-2026-11-02-openmeteo-cities 0 rows=10 cities=Berlin, Mumbai, Dubai, Toronto, Buenos Aires, Jakarta, Reykjavik, Lagos, Seoul, Auckland re-derived from (measured 0.3s)
wizard-work/ledger/CHECK-2026-11-01-openmeteo-weather 0 rows=6 cities=London, Tokyo, New York, Sydney, Cape Town, São Paulo re-derived from source snapshot — PASS (measured 0.3s)
wizard-work/ledger/CHECK-2026-11-02-wizard-handle-census 0 OK: 19 rows; derives identically at pinned rev 70f51f2272b15da6cae37788ee1eaba5cb7d6354 (measured 0.6s)
wizard-work/ledger/CHECK-commits-census 0 PASS: commits-census.csv and commits-by-day.csv match git at HEAD; commits-full.csv has 2508 rows; total 2508 commits (measured 0.9s)
wizard-work/ledger/CHECK-github-repo-census-2026-11-02.sh 0 [ok] census verified: 15 rows, sorted desc by stars, no duplicate repos, table equals independent re-derivation from raw (measured 0.5s)
wizard-work/ledger/CHECK-ledger-dir-census-2026-11-02 0 VERDICT: rc 0 -- the committed CSV is the derivation at the pinned rev (measured 2.8s)
wizard-work/ledger/CHECK-troupe-tree-census 0 CHECK: headline ok (4841 files, 205602588 bytes) (measured 58.0s)
wizard-work/ledger/CHECK-wizardwork-census 1 KNOWN RED: 11 absent-path lines over 7 subjects, 14 malformed (1-field) lines
wizard-work/quill/CHECK-draft-verification-report-2026-11-02 0 wrote /tmp/verify-2026-11-02-check.tsv (94 rows) (measured 0.6s)
wizard-work/quill/CHECK-quill-draft-compliance 0 CHECK-quill-draft-compliance: 5 leg(s) passed, 0 fault(s), 0 ungradable (measured 6.0s)
wizard-work/sol/CHECK-2026-11-02-untracked-triad 0 PASS: 86 files classified; 86 re-derive to matching category/decision; all files real, untracked, non-ignored; corpus sh (measured 9.3s)
wizard-work/sol/CHECK-sol-lane-triage-2026-11-02 0 VERIFY OK (382 files, categories re-derived, all paths present) (measured 8.5s)
wizard-work/sol/CHECK-sol-news-triage 0 OK: 20 items, bins={'frontier-models': [{'title': 'Gemini 4 Carbon (Google)', 'date': '2026-10-28', 'category': 'frontie (measured 0.3s)
wizard-work/sol/CHECK-sol-profile-file-class-2026-11-02.sh 0 CHECK OK: 69 entries (41 files, 28 dirs); artifact == independently recomputed from live profile disk (measured 0.4s)
wizard-work/sol/CHECK-sol-profile-triage-2026-11-02 0 CHECK OK: 69 live top-level entries re-derived; artifact matches disk (measured 0.2s)
wizard-work/sol/CHECK-working-tree-triage-2026-11-02 0 PASS: 5 modified files classified and re-derived; all real; by_category={'other': 2, 'script': 3}; shard byte-identical. (measured 0.2s)
# row added by hand (Q159 guard, 2026-11-02): CHECK-q159 is the new entry point
# guarding the census this item closed. Five legs, rc 0 measured at this worktree
# with `bash CHECK-q159` (69 s: it runs CHECK-q85-era coverage and a mutant copy).
# The block above is unchanged by this row; the Q159 audit rows and this guard row
# are kept apart so the register leg counts 21 audited paths, not 22 files.
CHECK-q159 0 q159: 5 leg(s), all passed
# row added by hand (Q160, 2026-11-03): CHECK-q160 is a NEW entry point -- the
# guard for the beam test that bound its module to a host path. Four legs, rc 0
# measured at this worktree with `bash CHECK-q160` (0.9 s); the rows above are
# unchanged by this row.
CHECK-q160 0 q160: 4 leg(s), 0 fault(s), rc 0
# row added by hand (Q161, 2026-11-03): the jobs-table entry point landed at
# 2e57e6b with a python3 shebang, so `bash <path>` read rc 2 and the census had
# no signed code for it. It is a bash wrapper over grade_jobs_table.py now; the
# code below was measured at this worktree, not copied from the program.
wizard-work/ledger/CHECK-2026-11-02-jobs-table 0 VERDICT: PASS (jobs.csv re-derives from source and matches manifest)
# row added by hand (Q161, 2026-11-03): CHECK-q161 is the guard for that repair.
# Six legs, rc 0 measured with `bash CHECK-q161` at this worktree.
CHECK-q161 0 q161: 6 leg(s), 0 fault(s), rc 0
Can't render this file because it contains an unexpected character in line 93 and column 87.
@@ -0,0 +1,14 @@
"""Poisoned stand-in for beam/tarjan_articulation.py -- every answer is wrong.
Mutant for CHECK-q160 leg 2: written over the lane copy of the module in a
scratch tree, beside the test. A test that binds the module BESIDE it reads red;
a test that binds a host path (the defect Q160 names) keeps reading green.
"""
def articulation_points(adj):
return set()
def bridges(adj):
return set()
+8 -4
View File
@@ -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.
+10 -10
View File
@@ -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
1 # Q65 rc-sensitivity ledger -- one row per PROBED committed verifier.
3 # exemption: --check faults on a row that contradicts its class or whose
4 # file has changed since (STALE).
5 # columns: class, path, baseline_rc, sites, tried, valid, moved_at, blob12, seconds
6 # rev fe233171675975b4874c0345c39ba79a30b82949 # rev d5f24f1e0da1a30ebf36990d3ec80caeb573bbb0
7 # rows 111 # rows 110
8 # committed 196 # committed 216
9 sensitive
10 unprobed-baseline
11 sensitive
12 sensitive
13 sensitive
14 unprobed-baseline
15 sensitive
16 sensitive
60 sensitive
61 unprobed-baseline
62 sensitive
63 sensitive unprobed-baseline
64 unprobed-baseline
65 sensitive
66 unprobed-baseline
69 sensitive
70 inert
71 inert
72 unprobed-mutant
73 sensitive
74 sensitive
75 unprobed-mutant
76 no-comparison
77 no-comparison
78 unprobed-baseline
88 inert
89 no-comparison
90 inert
91 unprobed-baseline
92 unprobed-mutant
93 unprobed-mutant
94 unprobed-baseline
95 no-comparison
96 no-comparison
+18 -10
View File
@@ -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
1 # Q65 runner ledger -- one row per committed verify_*.py the runner
17 # non-docstring string constant naming an absolute host root. Such a row
18 # is printed PASS* and excluded from the graded-clean figure.
19 # Regenerate: q65_runner.py --emit
20 # rev: fe23317 rows: 167 emitted: q65_runner.py # rev: d5f24f1 rows: 176 emitted: q65_runner.py
21 undeclared
22 gate-run
23 gate-run
24 gate-run
25 gate-run
26 gate-run
27 gate-run
28 gate-run
29 gate-run
57 gate-run
58 gate-run
59 gate-run
60 undeclared
61 undeclared
62 gate-run
63 gate-run
64 gate-run
65 gate-run
66 gate-run
74 gate-run
75 gate-run
76 gate-run
77 gate-run
78 gate-run
79 gate-run
80 gate-run
81 gate-run
82 gate-run
83 undeclared
84 gate-run
85 gate-run
86 gate-run
87 gate-run
88 gate-run
89 gate-run
90 undeclared
91 gate-run
92 gate-run
93 gate-run
100 gate-run
101 gate-run
102 gate-run
103 undeclared
104 gate-run
105 undeclared
106 gate-run
107 gate-run
108 gate-run
109 undeclared
110 undeclared
111 gate-run
112 gate-run
113 gate-run
141 gate-run
142 gate-run
143 gate-run
144 gate-run
145 gate-run
146 gate-run
147 gate-run
148 gate-run
149 gate-run
150 gate-run
156 gate-run
157 gate-run
158 gate-run
159 gate-run
160 gate-run
161 gate-run
162 gate-run
166 gate-run
167 gate-run
168 gate-run
169 gate-run
170 gate-run
171 gate-run
172 gate-run
173 gate-run
174 gate-run