ledger: todo-census extraction from JSONPlaceholder /todos

This commit is contained in:
ledger committed 2026-11-01 07:21:26 +00:00
1 parent fe74bc41fa
commit 7198476612
5 files changed
+635

No files matched your search

@@ -0,0 +1,5 @@
# VERDICT CHECK for 2026-11-01-todo-census
Single bare command whose exit code is the verdict (0 = correct, nonzero = wrong):
python3 verify_todo_census.py
@@ -0,0 +1,128 @@
#!/usr/bin/env python3
"""Extract the JSONPlaceholder /todos collection into a pipe-delimited CSV and a
markdown census table, then print a summary so the fetch result is observable.
Source: https://jsonplaceholder.typicode.com/todos
Fetched live at run time (no hardcoded values).
"""
import csv
import json
import sys
from datetime import date, datetime, timezone
from urllib.request import urlopen
from urllib.error import URLError
API_URL = "https://jsonplaceholder.typicode.com/todos"
OUT_DIR = "/root/troupe-standup/wizard-work/ledger/2026-11-01-todo-census"
CSV_NAME = "todo-census-2026-11-01.csv"
MD_NAME = "todo-census-2026-11-01.md"
def fetch(path):
req = urlopen(path, timeout=30)
raw = req.read()
try:
return json.loads(raw.decode("utf-8"))
finally:
req.close()
def build_csv(rows):
"""Pipe-delimited CSV: id|user_id|title|completed"""
lines = ["id|user_id|title|completed"]
for r in rows:
lines.append("|".join([
str(r["id"]),
str(r["userId"]),
r["title"],
"1" if r["completed"] else "0",
]))
return lines
def build_md(rows, stats):
"""Markdown table + census summary block."""
total = stats["total"]
done = stats["completed"]
pend = stats["pending"]
lines = [
"# JSONPlaceholder /todos extraction census",
"",
f"Fetched {date.today().isoformat()} (run {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%SZ')}) from "
f"{API_URL}. Record count: {total}.",
"",
"| id | user_id | title | completed |",
"|---|---|---|---|",
]
for r in rows:
lines.append(
f"| {r['id']} | {r['userId']} | {r['title']} | {'yes' if r['completed'] else 'no'} |"
)
lines += [
"",
"## Census summary",
"",
f"| total | completed | pending |",
f"|---|---|---|",
f"| {total} | {done} | {pend} |",
"",
"## Per-user completion rate",
"",
"| user_id | tasks | completed | rate |",
"|---|---|---|---|",
]
by_user = {}
for r in rows:
u = by_user.setdefault(r["userId"], {"n": 0, "d": 0})
u["n"] += 1
if r["completed"]:
u["d"] += 1
for uid in sorted(by_user):
u = by_user[uid]
rate = u["d"] / u["n"]
lines.append(f"| {uid} | {u['n']} | {u['d']} | {rate:.2f} |")
return "\n".join(lines) + "\n"
def main():
try:
data = fetch(API_URL)
except URLError as e:
print(f"FETCH ERROR: {e}", file=sys.stderr)
sys.exit(1)
except (ValueError, UnicodeDecodeError) as e:
print(f"PARSE ERROR: {e}", file=sys.stderr)
sys.exit(1)
if not isinstance(data, list):
print(f"UNEXPECTED SHAPE: {type(data).__name__}", file=sys.stderr)
sys.exit(1)
rows = []
for item in data:
if not all(k in item for k in ("id", "userId", "title", "completed")):
print(f"SKIPPING MALFORMED ROW: {item!r}", file=sys.stderr)
continue
rows.append(item)
stats = {
"total": len(rows),
"completed": sum(1 for r in rows if r["completed"]),
"pending": sum(1 for r in rows if not r["completed"]),
}
csv_text = "\n".join(build_csv(rows)) + "\n"
md_text = build_md(rows, stats)
with open(f"{OUT_DIR}/{CSV_NAME}", "w", encoding="utf-8") as f:
f.write(csv_text)
with open(f"{OUT_DIR}/{MD_NAME}", "w", encoding="utf-8") as f:
f.write(md_text)
print(f"OK: fetched {len(rows)} rows from {API_URL}")
print(f" total={stats['total']} completed={stats['completed']} pending={stats['pending']}")
print(f" wrote {OUT_DIR}/{CSV_NAME}")
print(f" wrote {OUT_DIR}/{MD_NAME}")
if __name__ == "__main__":
main()
@@ -0,0 +1,201 @@
id|user_id|title|completed
1|1|delectus aut autem|0
2|1|quis ut nam facilis et officia qui|0
3|1|fugiat veniam minus|0
4|1|et porro tempora|1
5|1|laboriosam mollitia et enim quasi adipisci quia provident illum|0
6|1|qui ullam ratione quibusdam voluptatem quia omnis|0
7|1|illo expedita consequatur quia in|0
8|1|quo adipisci enim quam ut ab|1
9|1|molestiae perspiciatis ipsa|0
10|1|illo est ratione doloremque quia maiores aut|1
11|1|vero rerum temporibus dolor|1
12|1|ipsa repellendus fugit nisi|1
13|1|et doloremque nulla|0
14|1|repellendus sunt dolores architecto voluptatum|1
15|1|ab voluptatum amet voluptas|1
16|1|accusamus eos facilis sint et aut voluptatem|1
17|1|quo laboriosam deleniti aut qui|1
18|1|dolorum est consequatur ea mollitia in culpa|0
19|1|molestiae ipsa aut voluptatibus pariatur dolor nihil|1
20|1|ullam nobis libero sapiente ad optio sint|1
21|2|suscipit repellat esse quibusdam voluptatem incidunt|0
22|2|distinctio vitae autem nihil ut molestias quo|1
23|2|et itaque necessitatibus maxime molestiae qui quas velit|0
24|2|adipisci non ad dicta qui amet quaerat doloribus ea|0
25|2|voluptas quo tenetur perspiciatis explicabo natus|1
26|2|aliquam aut quasi|1
27|2|veritatis pariatur delectus|1
28|2|nesciunt totam sit blanditiis sit|0
29|2|laborum aut in quam|0
30|2|nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis|1
31|2|repudiandae totam in est sint facere fuga|0
32|2|earum doloribus ea doloremque quis|0
33|2|sint sit aut vero|0
34|2|porro aut necessitatibus eaque distinctio|0
35|2|repellendus veritatis molestias dicta incidunt|1
36|2|excepturi deleniti adipisci voluptatem et neque optio illum ad|1
37|2|sunt cum tempora|0
38|2|totam quia non|0
39|2|doloremque quibusdam asperiores libero corrupti illum qui omnis|0
40|2|totam atque quo nesciunt|1
41|3|aliquid amet impedit consequatur aspernatur placeat eaque fugiat suscipit|0
42|3|rerum perferendis error quia ut eveniet|0
43|3|tempore ut sint quis recusandae|1
44|3|cum debitis quis accusamus doloremque ipsa natus sapiente omnis|1
45|3|velit soluta adipisci molestias reiciendis harum|0
46|3|vel voluptatem repellat nihil placeat corporis|0
47|3|nam qui rerum fugiat accusamus|0
48|3|sit reprehenderit omnis quia|0
49|3|ut necessitatibus aut maiores debitis officia blanditiis velit et|0
50|3|cupiditate necessitatibus ullam aut quis dolor voluptate|1
51|3|distinctio exercitationem ab doloribus|0
52|3|nesciunt dolorum quis recusandae ad pariatur ratione|0
53|3|qui labore est occaecati recusandae aliquid quam|0
54|3|quis et est ut voluptate quam dolor|1
55|3|voluptatum omnis minima qui occaecati provident nulla voluptatem ratione|1
56|3|deleniti ea temporibus enim|1
57|3|pariatur et magnam ea doloribus similique voluptatem rerum quia|0
58|3|est dicta totam qui explicabo doloribus qui dignissimos|0
59|3|perspiciatis velit id laborum placeat iusto et aliquam odio|0
60|3|et sequi qui architecto ut adipisci|1
61|4|odit optio omnis qui sunt|1
62|4|et placeat et tempore aspernatur sint numquam|0
63|4|doloremque aut dolores quidem fuga qui nulla|1
64|4|voluptas consequatur qui ut quia magnam nemo esse|0
65|4|fugiat pariatur ratione ut asperiores necessitatibus magni|0
66|4|rerum eum molestias autem voluptatum sit optio|0
67|4|quia voluptatibus voluptatem quos similique maiores repellat|0
68|4|aut id perspiciatis voluptatem iusto|0
69|4|doloribus sint dolorum ab adipisci itaque dignissimos aliquam suscipit|0
70|4|ut sequi accusantium et mollitia delectus sunt|0
71|4|aut velit saepe ullam|0
72|4|praesentium facilis facere quis harum voluptatibus voluptatem eum|0
73|4|sint amet quia totam corporis qui exercitationem commodi|1
74|4|expedita tempore nobis eveniet laborum maiores|0
75|4|occaecati adipisci est possimus totam|0
76|4|sequi dolorem sed|1
77|4|maiores aut nesciunt delectus exercitationem vel assumenda eligendi at|0
78|4|reiciendis est magnam amet nemo iste recusandae impedit quaerat|0
79|4|eum ipsa maxime ut|1
80|4|tempore molestias dolores rerum sequi voluptates ipsum consequatur|1
81|5|suscipit qui totam|1
82|5|voluptates eum voluptas et dicta|0
83|5|quidem at rerum quis ex aut sit quam|1
84|5|sunt veritatis ut voluptate|0
85|5|et quia ad iste a|1
86|5|incidunt ut saepe autem|1
87|5|laudantium quae eligendi consequatur quia et vero autem|1
88|5|vitae aut excepturi laboriosam sint aliquam et et accusantium|0
89|5|sequi ut omnis et|1
90|5|molestiae nisi accusantium tenetur dolorem et|1
91|5|nulla quis consequatur saepe qui id expedita|1
92|5|in omnis laboriosam|1
93|5|odio iure consequatur molestiae quibusdam necessitatibus quia sint|1
94|5|facilis modi saepe mollitia|0
95|5|vel nihil et molestiae iusto assumenda nemo quo ut|1
96|5|nobis suscipit ducimus enim asperiores voluptas|0
97|5|dolorum laboriosam eos qui iure aliquam|0
98|5|debitis accusantium ut quo facilis nihil quis sapiente necessitatibus|1
99|5|neque voluptates ratione|0
100|5|excepturi a et neque qui expedita vel voluptate|0
101|6|explicabo enim cumque porro aperiam occaecati minima|0
102|6|sed ab consequatur|0
103|6|non sunt delectus illo nulla tenetur enim omnis|0
104|6|excepturi non laudantium quo|0
105|6|totam quia dolorem et illum repellat voluptas optio|1
106|6|ad illo quis voluptatem temporibus|1
107|6|praesentium facilis omnis laudantium fugit ad iusto nihil nesciunt|0
108|6|a eos eaque nihil et exercitationem incidunt delectus|1
109|6|autem temporibus harum quisquam in culpa|1
110|6|aut aut ea corporis|1
111|6|magni accusantium labore et id quis provident|0
112|6|consectetur impedit quisquam qui deserunt non rerum consequuntur eius|0
113|6|quia atque aliquam sunt impedit voluptatum rerum assumenda nisi|0
114|6|cupiditate quos possimus corporis quisquam exercitationem beatae|0
115|6|sed et ea eum|0
116|6|ipsa dolores vel facilis ut|1
117|6|sequi quae est et qui qui eveniet asperiores|0
118|6|quia modi consequatur vero fugiat|0
119|6|corporis ducimus ea perspiciatis iste|0
120|6|dolorem laboriosam vel voluptas et aliquam quasi|0
121|7|inventore aut nihil minima laudantium hic qui omnis|1
122|7|provident aut nobis culpa|1
123|7|esse et quis iste est earum aut impedit|0
124|7|qui consectetur id|0
125|7|aut quasi autem iste tempore illum possimus|0
126|7|ut asperiores perspiciatis veniam ipsum rerum saepe|1
127|7|voluptatem libero consectetur rerum ut|1
128|7|eius omnis est qui voluptatem autem|0
129|7|rerum culpa quis harum|0
130|7|nulla aliquid eveniet harum laborum libero alias ut unde|1
131|7|qui ea incidunt quis|0
132|7|qui molestiae voluptatibus velit iure harum quisquam|1
133|7|et labore eos enim rerum consequatur sunt|1
134|7|molestiae doloribus et laborum quod ea|0
135|7|facere ipsa nam eum voluptates reiciendis vero qui|0
136|7|asperiores illo tempora fuga sed ut quasi adipisci|0
137|7|qui sit non|0
138|7|placeat minima consequatur rem qui ut|1
139|7|consequatur doloribus id possimus voluptas a voluptatem|0
140|7|aut consectetur in blanditiis deserunt quia sed laboriosam|1
141|8|explicabo consectetur debitis voluptates quas quae culpa rerum non|1
142|8|maiores accusantium architecto necessitatibus reiciendis ea aut|1
143|8|eum non recusandae cupiditate animi|0
144|8|ut eum exercitationem sint|0
145|8|beatae qui ullam incidunt voluptatem non nisi aliquam|0
146|8|molestiae suscipit ratione nihil odio libero impedit vero totam|1
147|8|eum itaque quod reprehenderit et facilis dolor autem ut|1
148|8|esse quas et quo quasi exercitationem|0
149|8|animi voluptas quod perferendis est|0
150|8|eos amet tempore laudantium fugit a|0
151|8|accusamus adipisci dicta qui quo ea explicabo sed vero|1
152|8|odit eligendi recusandae doloremque cumque non|0
153|8|ea aperiam consequatur qui repellat eos|0
154|8|rerum non ex sapiente|1
155|8|voluptatem nobis consequatur et assumenda magnam|1
156|8|nam quia quia nulla repellat assumenda quibusdam sit nobis|1
157|8|dolorem veniam quisquam deserunt repellendus|1
158|8|debitis vitae delectus et harum accusamus aut deleniti a|1
159|8|debitis adipisci quibusdam aliquam sed dolore ea praesentium nobis|1
160|8|et praesentium aliquam est|0
161|9|ex hic consequuntur earum omnis alias ut occaecati culpa|1
162|9|omnis laboriosam molestias animi sunt dolore|1
163|9|natus corrupti maxime laudantium et voluptatem laboriosam odit|0
164|9|reprehenderit quos aut aut consequatur est sed|0
165|9|fugiat perferendis sed aut quidem|0
166|9|quos quo possimus suscipit minima ut|0
167|9|et quis minus quo a asperiores molestiae|0
168|9|recusandae quia qui sunt libero|0
169|9|ea odio perferendis officiis|1
170|9|quisquam aliquam quia doloribus aut|0
171|9|fugiat aut voluptatibus corrupti deleniti velit iste odio|1
172|9|et provident amet rerum consectetur et voluptatum|0
173|9|harum ad aperiam quis|0
174|9|similique aut quo|0
175|9|laudantium eius officia perferendis provident perspiciatis asperiores|1
176|9|magni soluta corrupti ut maiores rem quidem|0
177|9|et placeat temporibus voluptas est tempora quos quibusdam|0
178|9|nesciunt itaque commodi tempore|1
179|9|omnis consequuntur cupiditate impedit itaque ipsam quo|1
180|9|debitis nisi et dolorem repellat et|1
181|10|ut cupiditate sequi aliquam fuga maiores|0
182|10|inventore saepe cumque et aut illum enim|1
183|10|omnis nulla eum aliquam distinctio|1
184|10|molestias modi perferendis perspiciatis|0
185|10|voluptates dignissimos sed doloribus animi quaerat aut|0
186|10|explicabo odio est et|0
187|10|consequuntur animi possimus|0
188|10|vel non beatae est|1
189|10|culpa eius et voluptatem et|1
190|10|accusamus sint iusto et voluptatem exercitationem|1
191|10|temporibus atque distinctio omnis eius impedit tempore molestias pariatur|1
192|10|ut quas possimus exercitationem sint voluptates|0
193|10|rerum debitis voluptatem qui eveniet tempora distinctio a|1
194|10|sed ut vero sit molestiae|0
195|10|rerum ex veniam mollitia voluptatibus pariatur|1
196|10|consequuntur aut ut fugit similique|1
197|10|dignissimos quo nobis earum saepe|1
198|10|quis eius est sint explicabo|1
199|10|numquam repellendus a magnam|1
200|10|ipsam aperiam voluptates qui|0
1 id user_id title completed
2 1 1 delectus aut autem 0
3 2 1 quis ut nam facilis et officia qui 0
4 3 1 fugiat veniam minus 0
5 4 1 et porro tempora 1
6 5 1 laboriosam mollitia et enim quasi adipisci quia provident illum 0
7 6 1 qui ullam ratione quibusdam voluptatem quia omnis 0
8 7 1 illo expedita consequatur quia in 0
9 8 1 quo adipisci enim quam ut ab 1
10 9 1 molestiae perspiciatis ipsa 0
11 10 1 illo est ratione doloremque quia maiores aut 1
12 11 1 vero rerum temporibus dolor 1
13 12 1 ipsa repellendus fugit nisi 1
14 13 1 et doloremque nulla 0
15 14 1 repellendus sunt dolores architecto voluptatum 1
16 15 1 ab voluptatum amet voluptas 1
17 16 1 accusamus eos facilis sint et aut voluptatem 1
18 17 1 quo laboriosam deleniti aut qui 1
19 18 1 dolorum est consequatur ea mollitia in culpa 0
20 19 1 molestiae ipsa aut voluptatibus pariatur dolor nihil 1
21 20 1 ullam nobis libero sapiente ad optio sint 1
22 21 2 suscipit repellat esse quibusdam voluptatem incidunt 0
23 22 2 distinctio vitae autem nihil ut molestias quo 1
24 23 2 et itaque necessitatibus maxime molestiae qui quas velit 0
25 24 2 adipisci non ad dicta qui amet quaerat doloribus ea 0
26 25 2 voluptas quo tenetur perspiciatis explicabo natus 1
27 26 2 aliquam aut quasi 1
28 27 2 veritatis pariatur delectus 1
29 28 2 nesciunt totam sit blanditiis sit 0
30 29 2 laborum aut in quam 0
31 30 2 nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis 1
32 31 2 repudiandae totam in est sint facere fuga 0
33 32 2 earum doloribus ea doloremque quis 0
34 33 2 sint sit aut vero 0
35 34 2 porro aut necessitatibus eaque distinctio 0
36 35 2 repellendus veritatis molestias dicta incidunt 1
37 36 2 excepturi deleniti adipisci voluptatem et neque optio illum ad 1
38 37 2 sunt cum tempora 0
39 38 2 totam quia non 0
40 39 2 doloremque quibusdam asperiores libero corrupti illum qui omnis 0
41 40 2 totam atque quo nesciunt 1
42 41 3 aliquid amet impedit consequatur aspernatur placeat eaque fugiat suscipit 0
43 42 3 rerum perferendis error quia ut eveniet 0
44 43 3 tempore ut sint quis recusandae 1
45 44 3 cum debitis quis accusamus doloremque ipsa natus sapiente omnis 1
46 45 3 velit soluta adipisci molestias reiciendis harum 0
47 46 3 vel voluptatem repellat nihil placeat corporis 0
48 47 3 nam qui rerum fugiat accusamus 0
49 48 3 sit reprehenderit omnis quia 0
50 49 3 ut necessitatibus aut maiores debitis officia blanditiis velit et 0
51 50 3 cupiditate necessitatibus ullam aut quis dolor voluptate 1
52 51 3 distinctio exercitationem ab doloribus 0
53 52 3 nesciunt dolorum quis recusandae ad pariatur ratione 0
54 53 3 qui labore est occaecati recusandae aliquid quam 0
55 54 3 quis et est ut voluptate quam dolor 1
56 55 3 voluptatum omnis minima qui occaecati provident nulla voluptatem ratione 1
57 56 3 deleniti ea temporibus enim 1
58 57 3 pariatur et magnam ea doloribus similique voluptatem rerum quia 0
59 58 3 est dicta totam qui explicabo doloribus qui dignissimos 0
60 59 3 perspiciatis velit id laborum placeat iusto et aliquam odio 0
61 60 3 et sequi qui architecto ut adipisci 1
62 61 4 odit optio omnis qui sunt 1
63 62 4 et placeat et tempore aspernatur sint numquam 0
64 63 4 doloremque aut dolores quidem fuga qui nulla 1
65 64 4 voluptas consequatur qui ut quia magnam nemo esse 0
66 65 4 fugiat pariatur ratione ut asperiores necessitatibus magni 0
67 66 4 rerum eum molestias autem voluptatum sit optio 0
68 67 4 quia voluptatibus voluptatem quos similique maiores repellat 0
69 68 4 aut id perspiciatis voluptatem iusto 0
70 69 4 doloribus sint dolorum ab adipisci itaque dignissimos aliquam suscipit 0
71 70 4 ut sequi accusantium et mollitia delectus sunt 0
72 71 4 aut velit saepe ullam 0
73 72 4 praesentium facilis facere quis harum voluptatibus voluptatem eum 0
74 73 4 sint amet quia totam corporis qui exercitationem commodi 1
75 74 4 expedita tempore nobis eveniet laborum maiores 0
76 75 4 occaecati adipisci est possimus totam 0
77 76 4 sequi dolorem sed 1
78 77 4 maiores aut nesciunt delectus exercitationem vel assumenda eligendi at 0
79 78 4 reiciendis est magnam amet nemo iste recusandae impedit quaerat 0
80 79 4 eum ipsa maxime ut 1
81 80 4 tempore molestias dolores rerum sequi voluptates ipsum consequatur 1
82 81 5 suscipit qui totam 1
83 82 5 voluptates eum voluptas et dicta 0
84 83 5 quidem at rerum quis ex aut sit quam 1
85 84 5 sunt veritatis ut voluptate 0
86 85 5 et quia ad iste a 1
87 86 5 incidunt ut saepe autem 1
88 87 5 laudantium quae eligendi consequatur quia et vero autem 1
89 88 5 vitae aut excepturi laboriosam sint aliquam et et accusantium 0
90 89 5 sequi ut omnis et 1
91 90 5 molestiae nisi accusantium tenetur dolorem et 1
92 91 5 nulla quis consequatur saepe qui id expedita 1
93 92 5 in omnis laboriosam 1
94 93 5 odio iure consequatur molestiae quibusdam necessitatibus quia sint 1
95 94 5 facilis modi saepe mollitia 0
96 95 5 vel nihil et molestiae iusto assumenda nemo quo ut 1
97 96 5 nobis suscipit ducimus enim asperiores voluptas 0
98 97 5 dolorum laboriosam eos qui iure aliquam 0
99 98 5 debitis accusantium ut quo facilis nihil quis sapiente necessitatibus 1
100 99 5 neque voluptates ratione 0
101 100 5 excepturi a et neque qui expedita vel voluptate 0
102 101 6 explicabo enim cumque porro aperiam occaecati minima 0
103 102 6 sed ab consequatur 0
104 103 6 non sunt delectus illo nulla tenetur enim omnis 0
105 104 6 excepturi non laudantium quo 0
106 105 6 totam quia dolorem et illum repellat voluptas optio 1
107 106 6 ad illo quis voluptatem temporibus 1
108 107 6 praesentium facilis omnis laudantium fugit ad iusto nihil nesciunt 0
109 108 6 a eos eaque nihil et exercitationem incidunt delectus 1
110 109 6 autem temporibus harum quisquam in culpa 1
111 110 6 aut aut ea corporis 1
112 111 6 magni accusantium labore et id quis provident 0
113 112 6 consectetur impedit quisquam qui deserunt non rerum consequuntur eius 0
114 113 6 quia atque aliquam sunt impedit voluptatum rerum assumenda nisi 0
115 114 6 cupiditate quos possimus corporis quisquam exercitationem beatae 0
116 115 6 sed et ea eum 0
117 116 6 ipsa dolores vel facilis ut 1
118 117 6 sequi quae est et qui qui eveniet asperiores 0
119 118 6 quia modi consequatur vero fugiat 0
120 119 6 corporis ducimus ea perspiciatis iste 0
121 120 6 dolorem laboriosam vel voluptas et aliquam quasi 0
122 121 7 inventore aut nihil minima laudantium hic qui omnis 1
123 122 7 provident aut nobis culpa 1
124 123 7 esse et quis iste est earum aut impedit 0
125 124 7 qui consectetur id 0
126 125 7 aut quasi autem iste tempore illum possimus 0
127 126 7 ut asperiores perspiciatis veniam ipsum rerum saepe 1
128 127 7 voluptatem libero consectetur rerum ut 1
129 128 7 eius omnis est qui voluptatem autem 0
130 129 7 rerum culpa quis harum 0
131 130 7 nulla aliquid eveniet harum laborum libero alias ut unde 1
132 131 7 qui ea incidunt quis 0
133 132 7 qui molestiae voluptatibus velit iure harum quisquam 1
134 133 7 et labore eos enim rerum consequatur sunt 1
135 134 7 molestiae doloribus et laborum quod ea 0
136 135 7 facere ipsa nam eum voluptates reiciendis vero qui 0
137 136 7 asperiores illo tempora fuga sed ut quasi adipisci 0
138 137 7 qui sit non 0
139 138 7 placeat minima consequatur rem qui ut 1
140 139 7 consequatur doloribus id possimus voluptas a voluptatem 0
141 140 7 aut consectetur in blanditiis deserunt quia sed laboriosam 1
142 141 8 explicabo consectetur debitis voluptates quas quae culpa rerum non 1
143 142 8 maiores accusantium architecto necessitatibus reiciendis ea aut 1
144 143 8 eum non recusandae cupiditate animi 0
145 144 8 ut eum exercitationem sint 0
146 145 8 beatae qui ullam incidunt voluptatem non nisi aliquam 0
147 146 8 molestiae suscipit ratione nihil odio libero impedit vero totam 1
148 147 8 eum itaque quod reprehenderit et facilis dolor autem ut 1
149 148 8 esse quas et quo quasi exercitationem 0
150 149 8 animi voluptas quod perferendis est 0
151 150 8 eos amet tempore laudantium fugit a 0
152 151 8 accusamus adipisci dicta qui quo ea explicabo sed vero 1
153 152 8 odit eligendi recusandae doloremque cumque non 0
154 153 8 ea aperiam consequatur qui repellat eos 0
155 154 8 rerum non ex sapiente 1
156 155 8 voluptatem nobis consequatur et assumenda magnam 1
157 156 8 nam quia quia nulla repellat assumenda quibusdam sit nobis 1
158 157 8 dolorem veniam quisquam deserunt repellendus 1
159 158 8 debitis vitae delectus et harum accusamus aut deleniti a 1
160 159 8 debitis adipisci quibusdam aliquam sed dolore ea praesentium nobis 1
161 160 8 et praesentium aliquam est 0
162 161 9 ex hic consequuntur earum omnis alias ut occaecati culpa 1
163 162 9 omnis laboriosam molestias animi sunt dolore 1
164 163 9 natus corrupti maxime laudantium et voluptatem laboriosam odit 0
165 164 9 reprehenderit quos aut aut consequatur est sed 0
166 165 9 fugiat perferendis sed aut quidem 0
167 166 9 quos quo possimus suscipit minima ut 0
168 167 9 et quis minus quo a asperiores molestiae 0
169 168 9 recusandae quia qui sunt libero 0
170 169 9 ea odio perferendis officiis 1
171 170 9 quisquam aliquam quia doloribus aut 0
172 171 9 fugiat aut voluptatibus corrupti deleniti velit iste odio 1
173 172 9 et provident amet rerum consectetur et voluptatum 0
174 173 9 harum ad aperiam quis 0
175 174 9 similique aut quo 0
176 175 9 laudantium eius officia perferendis provident perspiciatis asperiores 1
177 176 9 magni soluta corrupti ut maiores rem quidem 0
178 177 9 et placeat temporibus voluptas est tempora quos quibusdam 0
179 178 9 nesciunt itaque commodi tempore 1
180 179 9 omnis consequuntur cupiditate impedit itaque ipsam quo 1
181 180 9 debitis nisi et dolorem repellat et 1
182 181 10 ut cupiditate sequi aliquam fuga maiores 0
183 182 10 inventore saepe cumque et aut illum enim 1
184 183 10 omnis nulla eum aliquam distinctio 1
185 184 10 molestias modi perferendis perspiciatis 0
186 185 10 voluptates dignissimos sed doloribus animi quaerat aut 0
187 186 10 explicabo odio est et 0
188 187 10 consequuntur animi possimus 0
189 188 10 vel non beatae est 1
190 189 10 culpa eius et voluptatem et 1
191 190 10 accusamus sint iusto et voluptatem exercitationem 1
192 191 10 temporibus atque distinctio omnis eius impedit tempore molestias pariatur 1
193 192 10 ut quas possimus exercitationem sint voluptates 0
194 193 10 rerum debitis voluptatem qui eveniet tempora distinctio a 1
195 194 10 sed ut vero sit molestiae 0
196 195 10 rerum ex veniam mollitia voluptatibus pariatur 1
197 196 10 consequuntur aut ut fugit similique 1
198 197 10 dignissimos quo nobis earum saepe 1
199 198 10 quis eius est sint explicabo 1
200 199 10 numquam repellendus a magnam 1
201 200 10 ipsam aperiam voluptates qui 0
@@ -0,0 +1,227 @@
# JSONPlaceholder /todos extraction census
Fetched 2026-11-01 (run 2026-11-01 07:19:40Z) from https://jsonplaceholder.typicode.com/todos. Record count: 200.
| id | user_id | title | completed |
|---|---|---|---|
| 1 | 1 | delectus aut autem | no |
| 2 | 1 | quis ut nam facilis et officia qui | no |
| 3 | 1 | fugiat veniam minus | no |
| 4 | 1 | et porro tempora | yes |
| 5 | 1 | laboriosam mollitia et enim quasi adipisci quia provident illum | no |
| 6 | 1 | qui ullam ratione quibusdam voluptatem quia omnis | no |
| 7 | 1 | illo expedita consequatur quia in | no |
| 8 | 1 | quo adipisci enim quam ut ab | yes |
| 9 | 1 | molestiae perspiciatis ipsa | no |
| 10 | 1 | illo est ratione doloremque quia maiores aut | yes |
| 11 | 1 | vero rerum temporibus dolor | yes |
| 12 | 1 | ipsa repellendus fugit nisi | yes |
| 13 | 1 | et doloremque nulla | no |
| 14 | 1 | repellendus sunt dolores architecto voluptatum | yes |
| 15 | 1 | ab voluptatum amet voluptas | yes |
| 16 | 1 | accusamus eos facilis sint et aut voluptatem | yes |
| 17 | 1 | quo laboriosam deleniti aut qui | yes |
| 18 | 1 | dolorum est consequatur ea mollitia in culpa | no |
| 19 | 1 | molestiae ipsa aut voluptatibus pariatur dolor nihil | yes |
| 20 | 1 | ullam nobis libero sapiente ad optio sint | yes |
| 21 | 2 | suscipit repellat esse quibusdam voluptatem incidunt | no |
| 22 | 2 | distinctio vitae autem nihil ut molestias quo | yes |
| 23 | 2 | et itaque necessitatibus maxime molestiae qui quas velit | no |
| 24 | 2 | adipisci non ad dicta qui amet quaerat doloribus ea | no |
| 25 | 2 | voluptas quo tenetur perspiciatis explicabo natus | yes |
| 26 | 2 | aliquam aut quasi | yes |
| 27 | 2 | veritatis pariatur delectus | yes |
| 28 | 2 | nesciunt totam sit blanditiis sit | no |
| 29 | 2 | laborum aut in quam | no |
| 30 | 2 | nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis | yes |
| 31 | 2 | repudiandae totam in est sint facere fuga | no |
| 32 | 2 | earum doloribus ea doloremque quis | no |
| 33 | 2 | sint sit aut vero | no |
| 34 | 2 | porro aut necessitatibus eaque distinctio | no |
| 35 | 2 | repellendus veritatis molestias dicta incidunt | yes |
| 36 | 2 | excepturi deleniti adipisci voluptatem et neque optio illum ad | yes |
| 37 | 2 | sunt cum tempora | no |
| 38 | 2 | totam quia non | no |
| 39 | 2 | doloremque quibusdam asperiores libero corrupti illum qui omnis | no |
| 40 | 2 | totam atque quo nesciunt | yes |
| 41 | 3 | aliquid amet impedit consequatur aspernatur placeat eaque fugiat suscipit | no |
| 42 | 3 | rerum perferendis error quia ut eveniet | no |
| 43 | 3 | tempore ut sint quis recusandae | yes |
| 44 | 3 | cum debitis quis accusamus doloremque ipsa natus sapiente omnis | yes |
| 45 | 3 | velit soluta adipisci molestias reiciendis harum | no |
| 46 | 3 | vel voluptatem repellat nihil placeat corporis | no |
| 47 | 3 | nam qui rerum fugiat accusamus | no |
| 48 | 3 | sit reprehenderit omnis quia | no |
| 49 | 3 | ut necessitatibus aut maiores debitis officia blanditiis velit et | no |
| 50 | 3 | cupiditate necessitatibus ullam aut quis dolor voluptate | yes |
| 51 | 3 | distinctio exercitationem ab doloribus | no |
| 52 | 3 | nesciunt dolorum quis recusandae ad pariatur ratione | no |
| 53 | 3 | qui labore est occaecati recusandae aliquid quam | no |
| 54 | 3 | quis et est ut voluptate quam dolor | yes |
| 55 | 3 | voluptatum omnis minima qui occaecati provident nulla voluptatem ratione | yes |
| 56 | 3 | deleniti ea temporibus enim | yes |
| 57 | 3 | pariatur et magnam ea doloribus similique voluptatem rerum quia | no |
| 58 | 3 | est dicta totam qui explicabo doloribus qui dignissimos | no |
| 59 | 3 | perspiciatis velit id laborum placeat iusto et aliquam odio | no |
| 60 | 3 | et sequi qui architecto ut adipisci | yes |
| 61 | 4 | odit optio omnis qui sunt | yes |
| 62 | 4 | et placeat et tempore aspernatur sint numquam | no |
| 63 | 4 | doloremque aut dolores quidem fuga qui nulla | yes |
| 64 | 4 | voluptas consequatur qui ut quia magnam nemo esse | no |
| 65 | 4 | fugiat pariatur ratione ut asperiores necessitatibus magni | no |
| 66 | 4 | rerum eum molestias autem voluptatum sit optio | no |
| 67 | 4 | quia voluptatibus voluptatem quos similique maiores repellat | no |
| 68 | 4 | aut id perspiciatis voluptatem iusto | no |
| 69 | 4 | doloribus sint dolorum ab adipisci itaque dignissimos aliquam suscipit | no |
| 70 | 4 | ut sequi accusantium et mollitia delectus sunt | no |
| 71 | 4 | aut velit saepe ullam | no |
| 72 | 4 | praesentium facilis facere quis harum voluptatibus voluptatem eum | no |
| 73 | 4 | sint amet quia totam corporis qui exercitationem commodi | yes |
| 74 | 4 | expedita tempore nobis eveniet laborum maiores | no |
| 75 | 4 | occaecati adipisci est possimus totam | no |
| 76 | 4 | sequi dolorem sed | yes |
| 77 | 4 | maiores aut nesciunt delectus exercitationem vel assumenda eligendi at | no |
| 78 | 4 | reiciendis est magnam amet nemo iste recusandae impedit quaerat | no |
| 79 | 4 | eum ipsa maxime ut | yes |
| 80 | 4 | tempore molestias dolores rerum sequi voluptates ipsum consequatur | yes |
| 81 | 5 | suscipit qui totam | yes |
| 82 | 5 | voluptates eum voluptas et dicta | no |
| 83 | 5 | quidem at rerum quis ex aut sit quam | yes |
| 84 | 5 | sunt veritatis ut voluptate | no |
| 85 | 5 | et quia ad iste a | yes |
| 86 | 5 | incidunt ut saepe autem | yes |
| 87 | 5 | laudantium quae eligendi consequatur quia et vero autem | yes |
| 88 | 5 | vitae aut excepturi laboriosam sint aliquam et et accusantium | no |
| 89 | 5 | sequi ut omnis et | yes |
| 90 | 5 | molestiae nisi accusantium tenetur dolorem et | yes |
| 91 | 5 | nulla quis consequatur saepe qui id expedita | yes |
| 92 | 5 | in omnis laboriosam | yes |
| 93 | 5 | odio iure consequatur molestiae quibusdam necessitatibus quia sint | yes |
| 94 | 5 | facilis modi saepe mollitia | no |
| 95 | 5 | vel nihil et molestiae iusto assumenda nemo quo ut | yes |
| 96 | 5 | nobis suscipit ducimus enim asperiores voluptas | no |
| 97 | 5 | dolorum laboriosam eos qui iure aliquam | no |
| 98 | 5 | debitis accusantium ut quo facilis nihil quis sapiente necessitatibus | yes |
| 99 | 5 | neque voluptates ratione | no |
| 100 | 5 | excepturi a et neque qui expedita vel voluptate | no |
| 101 | 6 | explicabo enim cumque porro aperiam occaecati minima | no |
| 102 | 6 | sed ab consequatur | no |
| 103 | 6 | non sunt delectus illo nulla tenetur enim omnis | no |
| 104 | 6 | excepturi non laudantium quo | no |
| 105 | 6 | totam quia dolorem et illum repellat voluptas optio | yes |
| 106 | 6 | ad illo quis voluptatem temporibus | yes |
| 107 | 6 | praesentium facilis omnis laudantium fugit ad iusto nihil nesciunt | no |
| 108 | 6 | a eos eaque nihil et exercitationem incidunt delectus | yes |
| 109 | 6 | autem temporibus harum quisquam in culpa | yes |
| 110 | 6 | aut aut ea corporis | yes |
| 111 | 6 | magni accusantium labore et id quis provident | no |
| 112 | 6 | consectetur impedit quisquam qui deserunt non rerum consequuntur eius | no |
| 113 | 6 | quia atque aliquam sunt impedit voluptatum rerum assumenda nisi | no |
| 114 | 6 | cupiditate quos possimus corporis quisquam exercitationem beatae | no |
| 115 | 6 | sed et ea eum | no |
| 116 | 6 | ipsa dolores vel facilis ut | yes |
| 117 | 6 | sequi quae est et qui qui eveniet asperiores | no |
| 118 | 6 | quia modi consequatur vero fugiat | no |
| 119 | 6 | corporis ducimus ea perspiciatis iste | no |
| 120 | 6 | dolorem laboriosam vel voluptas et aliquam quasi | no |
| 121 | 7 | inventore aut nihil minima laudantium hic qui omnis | yes |
| 122 | 7 | provident aut nobis culpa | yes |
| 123 | 7 | esse et quis iste est earum aut impedit | no |
| 124 | 7 | qui consectetur id | no |
| 125 | 7 | aut quasi autem iste tempore illum possimus | no |
| 126 | 7 | ut asperiores perspiciatis veniam ipsum rerum saepe | yes |
| 127 | 7 | voluptatem libero consectetur rerum ut | yes |
| 128 | 7 | eius omnis est qui voluptatem autem | no |
| 129 | 7 | rerum culpa quis harum | no |
| 130 | 7 | nulla aliquid eveniet harum laborum libero alias ut unde | yes |
| 131 | 7 | qui ea incidunt quis | no |
| 132 | 7 | qui molestiae voluptatibus velit iure harum quisquam | yes |
| 133 | 7 | et labore eos enim rerum consequatur sunt | yes |
| 134 | 7 | molestiae doloribus et laborum quod ea | no |
| 135 | 7 | facere ipsa nam eum voluptates reiciendis vero qui | no |
| 136 | 7 | asperiores illo tempora fuga sed ut quasi adipisci | no |
| 137 | 7 | qui sit non | no |
| 138 | 7 | placeat minima consequatur rem qui ut | yes |
| 139 | 7 | consequatur doloribus id possimus voluptas a voluptatem | no |
| 140 | 7 | aut consectetur in blanditiis deserunt quia sed laboriosam | yes |
| 141 | 8 | explicabo consectetur debitis voluptates quas quae culpa rerum non | yes |
| 142 | 8 | maiores accusantium architecto necessitatibus reiciendis ea aut | yes |
| 143 | 8 | eum non recusandae cupiditate animi | no |
| 144 | 8 | ut eum exercitationem sint | no |
| 145 | 8 | beatae qui ullam incidunt voluptatem non nisi aliquam | no |
| 146 | 8 | molestiae suscipit ratione nihil odio libero impedit vero totam | yes |
| 147 | 8 | eum itaque quod reprehenderit et facilis dolor autem ut | yes |
| 148 | 8 | esse quas et quo quasi exercitationem | no |
| 149 | 8 | animi voluptas quod perferendis est | no |
| 150 | 8 | eos amet tempore laudantium fugit a | no |
| 151 | 8 | accusamus adipisci dicta qui quo ea explicabo sed vero | yes |
| 152 | 8 | odit eligendi recusandae doloremque cumque non | no |
| 153 | 8 | ea aperiam consequatur qui repellat eos | no |
| 154 | 8 | rerum non ex sapiente | yes |
| 155 | 8 | voluptatem nobis consequatur et assumenda magnam | yes |
| 156 | 8 | nam quia quia nulla repellat assumenda quibusdam sit nobis | yes |
| 157 | 8 | dolorem veniam quisquam deserunt repellendus | yes |
| 158 | 8 | debitis vitae delectus et harum accusamus aut deleniti a | yes |
| 159 | 8 | debitis adipisci quibusdam aliquam sed dolore ea praesentium nobis | yes |
| 160 | 8 | et praesentium aliquam est | no |
| 161 | 9 | ex hic consequuntur earum omnis alias ut occaecati culpa | yes |
| 162 | 9 | omnis laboriosam molestias animi sunt dolore | yes |
| 163 | 9 | natus corrupti maxime laudantium et voluptatem laboriosam odit | no |
| 164 | 9 | reprehenderit quos aut aut consequatur est sed | no |
| 165 | 9 | fugiat perferendis sed aut quidem | no |
| 166 | 9 | quos quo possimus suscipit minima ut | no |
| 167 | 9 | et quis minus quo a asperiores molestiae | no |
| 168 | 9 | recusandae quia qui sunt libero | no |
| 169 | 9 | ea odio perferendis officiis | yes |
| 170 | 9 | quisquam aliquam quia doloribus aut | no |
| 171 | 9 | fugiat aut voluptatibus corrupti deleniti velit iste odio | yes |
| 172 | 9 | et provident amet rerum consectetur et voluptatum | no |
| 173 | 9 | harum ad aperiam quis | no |
| 174 | 9 | similique aut quo | no |
| 175 | 9 | laudantium eius officia perferendis provident perspiciatis asperiores | yes |
| 176 | 9 | magni soluta corrupti ut maiores rem quidem | no |
| 177 | 9 | et placeat temporibus voluptas est tempora quos quibusdam | no |
| 178 | 9 | nesciunt itaque commodi tempore | yes |
| 179 | 9 | omnis consequuntur cupiditate impedit itaque ipsam quo | yes |
| 180 | 9 | debitis nisi et dolorem repellat et | yes |
| 181 | 10 | ut cupiditate sequi aliquam fuga maiores | no |
| 182 | 10 | inventore saepe cumque et aut illum enim | yes |
| 183 | 10 | omnis nulla eum aliquam distinctio | yes |
| 184 | 10 | molestias modi perferendis perspiciatis | no |
| 185 | 10 | voluptates dignissimos sed doloribus animi quaerat aut | no |
| 186 | 10 | explicabo odio est et | no |
| 187 | 10 | consequuntur animi possimus | no |
| 188 | 10 | vel non beatae est | yes |
| 189 | 10 | culpa eius et voluptatem et | yes |
| 190 | 10 | accusamus sint iusto et voluptatem exercitationem | yes |
| 191 | 10 | temporibus atque distinctio omnis eius impedit tempore molestias pariatur | yes |
| 192 | 10 | ut quas possimus exercitationem sint voluptates | no |
| 193 | 10 | rerum debitis voluptatem qui eveniet tempora distinctio a | yes |
| 194 | 10 | sed ut vero sit molestiae | no |
| 195 | 10 | rerum ex veniam mollitia voluptatibus pariatur | yes |
| 196 | 10 | consequuntur aut ut fugit similique | yes |
| 197 | 10 | dignissimos quo nobis earum saepe | yes |
| 198 | 10 | quis eius est sint explicabo | yes |
| 199 | 10 | numquam repellendus a magnam | yes |
| 200 | 10 | ipsam aperiam voluptates qui | no |
## Census summary
| total | completed | pending |
|---|---|---|
| 200 | 90 | 110 |
## Per-user completion rate
| user_id | tasks | completed | rate |
|---|---|---|---|
| 1 | 20 | 11 | 0.55 |
| 2 | 20 | 8 | 0.40 |
| 3 | 20 | 7 | 0.35 |
| 4 | 20 | 6 | 0.30 |
| 5 | 20 | 12 | 0.60 |
| 6 | 20 | 6 | 0.30 |
| 7 | 20 | 9 | 0.45 |
| 8 | 20 | 11 | 0.55 |
| 9 | 20 | 8 | 0.40 |
| 10 | 20 | 12 | 0.60 |
@@ -0,0 +1,74 @@
#!/usr/bin/env python3
"""Verify the todo-census artifact: re-fetch the live API and assert the on-disk
CSV/markdown match it, then exit 0 only if everything is consistent.
Usage: python3 verify_todo_census.py
"""
import csv
import json
import sys
from urllib.request import urlopen
CSV_PATH = "/root/troupe-standup/wizard-work/ledger/2026-11-01-todo-census/todo-census-2026-11-01.csv"
API_URL = "https://jsonplaceholder.typicode.com/todos"
def fetch(path):
req = urlopen(path, timeout=30)
raw = req.read()
req.close()
return json.loads(raw.decode("utf-8"))
def read_csv_rows(path):
with open(path, encoding="utf-8") as f:
return list(csv.DictReader(f, delimiter="|"))
def main():
errors = []
live = fetch(API_URL)
if not isinstance(live, list):
print("FAIL: API did not return a list", file=sys.stderr)
sys.exit(1)
disk = read_csv_rows(CSV_PATH)
# 1. Row count
if len(live) != len(disk):
errors.append(f"row count mismatch: API={len(live)} CSV={len(disk)}")
# 2. Completed/pending tallies
live_done = sum(1 for r in live if r["completed"])
if live_done != sum(1 for r in disk if r["completed"] == "1"):
errors.append("completed tally mismatch")
# 3. Every disk row exists in the live set (id+user_id+title+completed)
live_map = {(str(r["id"]), str(r["userId"]), r["title"], "1" if r["completed"] else "0"): 1
for r in live}
for i, r in enumerate(disk, start=1):
key = (r["id"], r["user_id"], r["title"], r["completed"])
if key not in live_map:
errors.append(f"row {i} not present in live API: {key}")
# 4. Sampling: first, mid, last ids match the live API
for idx in (0, len(disk) // 2, len(disk) - 1):
r = disk[idx]
live_row = next((x for x in live if x["id"] == int(r["id"])), None)
if live_row is None or live_row["title"] != r["title"]:
errors.append(f"sample id={r['id']} mismatch")
if errors:
print("VERIFY FAILED")
for e in errors:
print(" -", e)
sys.exit(1)
print(f"VERIFY OK: {len(disk)} rows match the live API "
f"(completed={sum(1 for r in disk if r['completed']=='1')})")
sys.exit(0)
if __name__ == "__main__":
main()