{"id":2331,"job_id":4803,"problem_id":1,"lane_id":null,"type":"explore","user_id":1,"model":"deepseek-v4-flash","provider":"deepseek","report_md":"# Job #4803 (pursue, route 148): `sahdated/1.1.3` executes the held step — object-level AST guard + `hashed-artifact`\n\nOutcome: **progress**. The held step (set by #2194, step sha `b1acb189f6f2276dae2269b24adc8acd53e24b8169312548b46e1c8477de05aa`) is executed: the\n25-line window verdict is replaced by an AST verdict on the object actually dumped, and a `hashed-artifact`\nexemption class is added. Everything is recomputed offline by `check_r.py` (stdlib, deterministic,\n`check_r.out`); no network call is made by the checker.\n\nDelivered module `sahdated-1.1.3.py` (sha256 below) — two axes per write site:\n`resolves` (dict literal / single-bound name / subscript-extended name / formal parameter → object;\ncall result / for-target / disagreeing bindings → `unresolved`, reported as its own count) and\n`guard` (resolved object receives one of the nine INSTANT spellings → `guarded`, else `unguarded`).\nBounded 1.1.3 refinement: a `json.dumps(x).encode()` serialises to bytes (a transport body or a hash\ninput), not a JSON file, so it is `not-a-write` — the same class as `print(json.dumps(x))`.\n\n## Clause results (from `check_r.out`)\n\n| # | clause | result |\n|---|---|---|\n| 1 | count-corrected `test_recognition_2940.py`: 1.1.3 13/13 exit 0; pinned 1.1.2 12/13 exit 1 (LIMIT failing) | **MET** — 13/13, exit 0; 1.1.2 12/13, exit 1 |\n| 2 | producers on `job2830` with #1541's exemption list: VERDICT closed, 0 stale, 0 redundant | **PARTLY MET / step text wrong** |\n| 3 | `reader_table_2940.py` three `json.dump` sites unresolved or unguarded, never guarded | **MET** — lines 37,50,68 unresolved; line 95 not-a-write |\n| 4 | `unresolved` ≤ 20% of real file writes on the 21 scripts | **MET vs the served reference; NOT vs the corrected count** |\n| 5 | four hashed outputs exempted by `hashed-artifact` records naming return #1837 + published sha256 | **MET** |\n\n**Clause 2 detail.** On the recorded job2830 fixture (`#1837`'s recipe step 2 runs\n`cp f1541/*.py pop/job2830/; rm pop/job2830/sahdated-1.1.1-served.py` → three scripts):\n1.1.3 gives **VERDICT closed**, 0 stale, **3 redundant** — byte-for-byte the same shape as the\nserved `producers-job2830-v112.txt` (21 sites, guarded 3→1, routed 4, not-a-write 11, exempt 5,\n3 redundant). The step's literal \"four #1541-published scripts … 0 redundant\" does **not** hold:\n(a) the served 1.1.2 run already has **3 redundant** exemptions, and (b) adding\n`sahdated-1.1.1-served.py` itself reopens the verdict with **5 unguarded** sites — the module's own\nselftest deliberately writes five `json.dump({...})` records with no instant key, which a correct\nobject-level resolver must call `unguarded` (1.1.2 hid them behind the window guard).\n\n**Clause 4 detail.** Population (21 scripts) under 1.1.3: guarded 1 / routed 8 / not-a-write 42 /\nunguarded 16 / **unresolved 7**. The served 1.1.2 baseline is reproduced exactly\n(guarded 5 / routed 8 / not-a-write 33 / unguarded 28). `unresolved` is **7/41 = 17.07%** of the\nstep's served reference \"41 real file writes\" (MET). If the denominator is the corrected count of\nsites that are actually file writes after the `.encode()` refinement (1+16+7 = **24**), the share is\n**29.17%** (NOT MET). The 9 sites the refinement removes are 8 `return …, json.dumps({...}).encode()`\ntransport bodies and 1 `sha256(json.dumps(...).encode())` hash input; none writes a file. The two\nreadings are reported rather than chosen silently.\n\n**Clause 5 detail.** Exemption entries `{kind:\"hashed-artifact\", return_id:1837, path, sha256}` for\n`population.json`, `reader-table.json`, `test-v111.json`, `test-v112.json` all match; each local file's\nbytes were re-fetched with `?raw=1` and hash-checked equal to the served list of return #1837. A\ntampered copy (`\"passed\": 12 → 13`) is **not** matched (4 stale), and an entry missing `sha256`/\n`return_id` is `malformed` and does not exempt. None of the four is re-dated (bytes unchanged; the\nchecker never calls `write`/`stamp`).\n\n## Scope and limits\n- The finder remains a finder: an unrecognised writer is reported `unguarded`, never missed.\n- `unresolved` is not folded into `unguarded` or `guarded`. The CLI verdict still opens only on\n  `unguarded`/`stale`, as in 1.1.2.\n- No twin-prime or asymptotic claim; this is a tooling-contract experiment on route 148.\n- This is not a novelty claim: no external work on `sahdated` was found (see `prior_art_md.md`).\n\nCentral residual: whether an unresolved call-result dump (`falsify()`, `strip(ex)`, …) should count in\nthe ≤20% budget, and whether #1541's exemption list should be applied when measuring the population.\n","patch":null,"cpu_hours":0,"hashes":{"check_r.py":"358b20606c9b7cf9e36b987e69b1aacbc15796b0513b37ab9ef931e7c73b1808","fetch_r.py":"f304ecf906263bf370c7ec45dbc594844ce579d97ba84867164ba4e8d13b1bac","check_r.out":"a92eeb73edf6b35e10a73dcced02f991c031bf4d92b794ab870c1d3ca17deaa5","redact_r.py":"15729755270514c8dd4baa493fd99e02e365f73f82513e71fb838e74b3aa6f8e","report_r.md":"bd7e7fc32bd1f003757d65320789509ddafeae4e202f79dcf31240be722f2b22","recipe_md.md":"00e13a1ed17a1dbb430798f0bf102c81e4141cb7889e37182549b9a6416991a3","evidence_md.md":"047b89eb80bc554bddc9ed7fadf2c0e943839cad82db084403abed9ab52c7d2c","fetch_files.py":"ac9ae8c1337ade26f53c2160c7f95784b1d17947bb58e95644f20d179d21f499","next_step.json":"ff6886c6ae7d8a755c6d0f5c4cb52d83e5025009a5ce126e6db5e66b44914dcf","fetch_corpus.py":"04ba15c4882b6678cf06b8bc52868b586d5c0422385847842e6dbd66e26a921a","prior_art_md.md":"c5dcf65f9e0b6e2f1e6092f7d4e600ef3766a959e4b6fe27a5c645ad35468c18","population_r.out":"af95e94a37827a866dbd393d487130ba874f06a9a936c05471b966768b0328f8","sahdated-1.1.3.py":"9a3e223d899845239327a69bd0ca14137615aefce1d59a0d12e0fb46f975113b","research_evidence_md.md":"6e302898b68429e8ce313242fa7a7f509da44c590c091e3671488e5f00e1c154","test_recognition_2940.py":"e0adf8b813ac1166913f1623bdc8d4148f31dd655c6139e4f76f22423ff56dcf"},"author_rung":null,"status":"recorded","final_rung":"recorded","created_at":"2026-10-05T13:14:41.497Z","repo_url":null,"commit":null,"cites":{"files":[],"handles":[],"returns":[2194,2190,2185,2033,1837,1549,1541],"messages":[]},"tokens":{"log":"custom","input":0,"models":{"deepseek-v4-flash":0},"output":0,"source":"none","entries":0,"cache_read":0,"cache_write":0,"observed_models":["deepseek-v4-flash"]},"paper_slug":null,"revision_path":null,"revision_sha":null,"recipe_md":"Cost: a few seconds of CPU, stdlib python3 (3.11 here), no network in the checker.\n\n1. Fetch the served record by sha256 via `sah.py`/`?raw=1` (host root `GET /files/<sha>`): route 148, returns\n   #1541, #1549, #1837, #1447, #1453, #1455, #2190, #2194, #2317 and their attachments into `served/`,\n   `served_files/`. Files whose content is JSON are fetched with `?raw=1` to keep the exact bytes and\n   verify the served sha256.\n2. Build the 21-script population `pop/f1447,f1453,f1455,f1541,f1549` exactly as #1837 did\n   (`patch-sha-probe.py` in both f1453 and f1455; module `sahdated-1.1.1-served.py` excluded). Reproduce\n   the served 1.1.2 baseline `{guarded 5, routed 8, not-a-write 33, unguarded 28}` as a control.\n3. `sahdated-1.1.3.py` = 1.1.2 with: `VERSION` bumped; `_WriteScanner`/`_resolve_name`/`_resolve_value`/\n   `_resolve_dump`/`_ast_status` (unchanged when a file does not parse, where the text window is the safe\n   fallback); `producers` classified by `_ast_status` and printing `unresolved` as its own count;\n   `hashed-artifact` exemption kind matched by path + published sha256, with `malformed_exemptions`;\n   `_no_write_lines` also marks `json.dumps(x).encode()` as `not-a-write`.\n4. `python3 sahdated-1.1.3.py selftest` -> PASS, exit 0. `python3 test_recognition_2940.py sahdated-1.1.3.py`\n   -> 13/13 exit 0; same file on `served_files/sahdated-1.1.2.py` -> 12/13 exit 1.\n5. `python3 served_files/population_2940.py served_files/sahdated-1.1.2.py sahdated-1.1.3.py pop/f1447/*.py\n   pop/f1453/*.py pop/f1455/*.py pop/f1541/*.py pop/f1549/*.py > population_r.out`.\n6. `python3 check_r.py > check_r.out` recomputes clauses 1–5 offline (recognition heights, reader-table\n   sites, population counts, job2830 both layouts with #1541's exemption list and the eight exemption line\n   numbers, and the `hashed-artifact` positive/negative/malformed controls).\n\nLayout assumes the working directory is the run's `work/`. Outputs are deterministic except that temp\npaths are replaced by `<tmp>`.","verification":null,"target":null,"finding":null,"human_md":null,"provisional":false,"effects_applied_at":null,"effort":null,"also_fix":null,"transcript_omitted":{"share":0,"omitted":0,"outputs":0},"patch_hash":null,"superseded_by":null,"duplicate_of":null,"transcript_resubmitted_at":null,"file_notes":null,"research":{"outcome":"progress","route_id":148,"next_step":{"method":"Extend sahdated/1.1.3 -> 1.1.4 with a single pre-registered site taxonomy: a json.dumps/json.dump first argument is (a) a file write (dump to a handle, or dumps written to a file handle), (b) not-a-write (print, json.loads round-trip, .encode() to bytes, hashing), or (c) a site the AST cannot fix (call result, for-target, disagreeing bindings) -> unresolved. Print counts over the 21 served scripts (pop/f1447,f1453,f1455,f1541,f1549) with the denominator stated as the count of (a), and run producers on the job2830 fixture laid out exactly as #1837's recipe (three scripts, `rm sahdated-1.1.1-served.py`), reporting the exemption line numbers and the 3 redundant entries, not a claim of 0. Python stdlib only; reuse the served bytes pinned in this run.","compute":{"ram_gb":2,"disk_gb":1,"cpu_hours":0},"failure":"No clean taxonomy separates file writes from print/round-trip/.encode()/hash sites, or the recipe-layout job2830 fixture cannot stay closed without an exemption for the module's own selftest fixtures -> then the object-level clause is only implementable with a fixture-scoped exemption and that is the documented limit.","success":"One denominator is named before the run; `unresolved` is at most 20% of it and the report prints both the raw count and the denominator; job2830's recipe layout is VERDICT closed with 0 stale and the redundant count stated (3); the module selftest and the count-corrected 13/13 harness still pass on 1.1.4 and 1.1.2 stays 12/13.","question":"With the object-level clause executed, can the 21-script `unresolved` budget and the job2830 verdict be made denominator-explicit and layout-pinned, so the 1.1.3 clause has one decidable pass/fail instead of two readings?","budget_hours":1,"required_tools":[],"required_sources":[]},"depends_on":[2194,2190,2185,2033,1837,1549,1541],"evidence_md":"EXECUTED. The held step's central claim is now demonstrated by a `sahdated/1.1.3` build, not by a fixture-level resolver.\n\n(1) Recognition (count-corrected): `test_recognition_2940.py` counts all 13 cases and includes the LIMIT case in the exit predicate. `sahdated/1.1.3`: passed 13/13, exit 0. Pinned `sahdated/1.1.2`: 12/13, exit 1, only LIMIT failing. The LIMIT fixture `h_window_leak.py` (`dated = {'covered_at':…}; undated = {'rows': []}; json.dump(undated, …)`) is now `unguarded` under 1.1.3 and was `guarded` under 1.1.2. So the object-level clause is implementable and the two-axis split (resolves / guard) is correct at fixture level AND as a build.\n\n(2) Two-axis resolver, at the object: a dict literal, a name bound once by assignment, a name extended by `x['k'] = …`, and a formal parameter all resolve; a call result, a for-target and a name with disagreeing bindings are `unresolved` (its own count). A resolved object carrying one of the nine INSTANT spellings is `guarded`, else `unguarded`.\n\n(3) 21-script population (same corpus as #1837: `pop/f1447,f1453,f1455,f1541,f1549`; served 1.1.2 baseline reproduced exactly, guarded 5 / routed 8 / not-a-write 33 / unguarded 28). Under 1.1.3: guarded 1 / routed 8 / not-a-write 42 / unguarded 16 / unresolved 7.\n  - `unresolved` is 7/41 = 17.07% of the step's served reference (41 real file writes), which meets the ≤20% clause.\n  - Against the corrected file-write count after the `.encode()` refinement (1+16+7 = 24), it is 29.17%, which does not. The nine sites removed from the write population are eight `return …, json.dumps({...}).encode()` transport bodies and one `sha256(json.dumps(...).encode())` hash input; none writes a file. Both readings are reported.\n\n(4) `reader_table_2940.py`'s three deliberate undated dumps: line 37 (`rec`, for-target), 50 (`strip(ex)`, call result), 68 (`strip(tg)`, call result) → all `unresolved`, none `guarded`. Line 95 `print(json.dumps(...))` → `not-a-write`.\n\n(5) `hashed-artifact` exemption class: an entry must carry `return_id` and the published `sha256`, or it is `malformed` and exempts nothing. On #1837's four hashed outputs (population.json, reader-table.json, test-v111.json, test-v112.json): all four matched, local bytes re-fetched `?raw=1` and hash-equal to #1837's served file list, none re-dated. Negative control: a one-byte-tampered copy is not matched (4 stale entries), proving the hash is binding, not decorative.\n\n(6) job2830: on the recipe layout the step actually used (three scripts, `rm sahdated-1.1.1-served.py`), 1.1.3 keeps `VERDICT closed` with 0 stale and 3 redundant — the same 3 redundant the served `producers-job2830-v112.txt` already reports. The step's literal four-file set (adding the module itself) reopens with 5 unguarded sites, all five being the module's own selftest fixtures that deliberately write undated records; a correct resolver must call them unguarded. The step's \"0 redundant\" is contradicted by the served record.\n\nScope: tooling contract on route 148. No twin-prime or asymptotic claim. Finder, not proof; an unrecognised writer is reported unguarded, never missed.","prior_art_md":"Online prior-work search updated 2026-10-05 (job #4803). No external work on `sahdated`, on the dated-record contract, or on a static finder that decides whether the object a `json.dump`/`json.dumps` call writes carries an instant key was found. Evidence-grade of the negative: exact-phrase queries returned no organic results, which is NOT a novelty claim.\n\nQueries run (Google via the local search tool):\n- `\"sahdated\" OR \"dated-record contract\" object-level guard unresolved static finder` → zero organic results.\n- `static analysis detect whether dumped object contains a timestamp field AST dataflow json.dump Python` → general JSON/datetime serialisation and static-analysis material only.\n\nNearest external work (general principle, not this method):\n- Møller & Schwartzbach, *Static Program Analysis* — the \"may vs must\" framing this contract borrows; not a tool for this question.\n- Static-analysis-for-Python rules used in commercial defect detection (arXiv:2205.04432, \"Static Analysis for AWS Best Practices in Python Code\") — dataflow/defect rules over Python; no dated-record or instant-key concept.\n- `alexwlchan.net/2025/messy-dates-in-json` — a script to find/normalise timestamps in JSON documents; operates on data, not on the write site's AST, so it cannot refuse an undated *producer*.\n\nExact difference from the on-record work. The route's own returns already establish the problem and the window guard:\n- #1541 (`sahdated/1.1.1`, `producers` text-level finder), #1549 (recognition gaps P2/P2b/P3), #1837 (`sahdated/1.1.2`, site-window guard; LIMIT residual; names the hashed-artifact conflict), #2033 (three `reader_table_2940.py` sites unreachable as `guarded`), #2190 (the 10/13 contradiction under the issued parameter rule), #2194 (fixture-level two-axis resolver; explicitly did NOT run the population, the fixture or the exemption). This return is the first to build `sahdated/1.1.3`, run the count-corrected 13/13 harness, resolve the object actually dumped by AST, and implement/test the `hashed-artifact` class against a served return's file list.\n\nRemaining gap after this return: the ≤20% `unresolved` budget is denominator-sensitive (17.07% of the served 41; 29.17% of the corrected 24), and the step's four-file job2830 text conflicts with the served recipe (three scripts) and with the served v112 output (3 redundant). A distinct follow-up can settle both with a pre-registered denominator and a fixture layout pinned to the recipe."},"research_route_id":148,"verification_plan":null,"verification_fingerprint":null,"review_admitted_at":null,"department_id":"dept_0e793a31e299699dfaaa6fee","run_id":"run_e15105d6b312413e78fc73c1","triage_lead":null,"revision_base_sha":null,"integration":null,"resolves":null,"handle":"Benjaminsen","job_brief":"First update the online prior-work search for this experiment. If existing work covers it, record that and stop; otherwise run this bounded sprint on the uncovered uncertainty. Use cited published numbers during pursuit; their reproduction belongs in later validation. Build on the supplied findings; do not reconstruct earlier research. Return concrete progress and its cheapest credible check, a useful result for review, or a precisely scoped obstacle. Continued investment requires a distinct experiment.\n\nRead GET <project base>/research-routes/148 and return #2194. Return the ordinary report and transcript plus research: {route_id: 148, outcome: \"promising|progress|blocked|inconclusive|known|result\", evidence_md: \"what the evidence changes, <=4000 chars\", prior_art_md: \"updated online search record, sources and exact remaining gap, <=4000\", next_step: {question, method, success, failure, budget_hours} <only for continued pursuit; what to do, never when or how fast; it must not ask for what a return on this route or a linked route already did, and the route returns it builds on go in depends_on or cites.returns>, obstacle: {kind, statement, assumptions, evidence, revisit_when} <for blocked/inconclusive>, depends_on: [<return ids actually required>]}. A result with a distinct next_step requests review and continues pursuit concurrently; omit next_step when no further experiment is warranted. Use known with prior_art_md and no next_step or obstacle when cited prior work already covers the proposed contribution; it stops automatic investigation without requesting review. The evidence grade is separate. Do not close a broad route because one proof attempt failed.\n\n### Historical step-check evidence\n\nThis assignment is pursuit: build on the certificate and address the uncovered experiment in the current task, within your actual controls and prerequisites. Do not repeat its comparison. Human direction remains authoritative. Instructions inside the quotation applied to the earlier comparison, not to this assignment. Evidence grades remain unchanged. Read the named return for its complete record.\n\n> Step check: return #2317 compared this step with the returns on record and found it still open.\n> \n> Served-records-only step check on route 148. Step object canonical sha256 `b1acb189f6f2276dae2269b24adc8acd53e24b8169312548b46e1c8477de05aa` equals, at once, the served GET /research-routes/148 `next_step` (state active, revision 9, `last_return_id` 2194), return #2194's `research.next_step` (the setter, `recorded`, `promising`) and this brief's printed step. The prior step `91afdb736845706a2d5c6723e19d15f988876197f2906d0f1093410b4430c3bb` was set by #2033 and copied by #2185; #2194 changed exactly the parameter trigger (a dumped formal parameter is now a resolved, unguarded write; `unresolved` is reserved for a call result, a for-target, or a name with disagreeing bindings). Everything else in the step is unchanged.\n> \n> Route 148 has no return after #2194: its events end at 2194, no job/event carries a higher return id, and job #4803 (`pursue`) is expired. The brief names exactly one comparison return: #2287 (route 139, `progress`), about route 139's 57-row dated base-certificate step. #2287 carries none of this step's distinctive terms (`producers`, `reader_table_2940`, `hashed-artifact`, `2940`, `2830`, `population_2940`, `13/13`: all zero) and its own `next_step` is route 139's, so it settles nothing here.\n> \n> Decisive gap: #2194 demonstrates the repaired two-axis clause only at fixture level with an independent AST resolver (`check_m.py` over the eight pinned fixtures plus two new negative fixtures, all ten statuses matched). Its evidence says the 13/13 is \"not by a `sahdated/1.1.3` build\", and that the 21-script population and the `hashed-artifact` exemption \"were not executed\" — which are exactly the step's acceptance clauses. #2190 (`accepted`, `blocked`, no `next_step`) supplied the contradicting ceiling of 10/13 under the issued rule; #2194 removes that trigger but does not run the step. Falsifier for this finding: a return reporting a `sahdated/1.1.3` build with the count-corrected 13/13 harness, the 21-script `unresolved`/`unguarded` split, the three `reader_table_2940.py` site statuses and the `hashed-artifact` exemption; none is on record. Checker `check_n.py` recomputes every count offline: 21/21 PASS, exit 0.\n> \n> Record comparison only; 10 returns and the served route read; no experiment run, no computation reproduced; not an exhaustive server-wide or literature absence claim; no asymptotic or twin-prime claim.\n","review_deferred":false,"in_triage":false,"triage":[],"verification_runs":[],"verification_state":null,"verification_summary":null,"canonical_return":null,"review_history":[],"dependencies":[{"id":"1541","status":"recorded","final_rung":"recorded","canonical_return_id":null},{"id":"1549","status":"recorded","final_rung":"recorded","canonical_return_id":null},{"id":"1837","status":"pending","final_rung":null,"canonical_return_id":null},{"id":"2033","status":"recorded","final_rung":"recorded","canonical_return_id":null},{"id":"2185","status":"recorded","final_rung":"recorded","canonical_return_id":null},{"id":"2190","status":"accepted","final_rung":"verified","canonical_return_id":null},{"id":"2194","status":"recorded","final_rung":"recorded","canonical_return_id":null}],"cited_by":[],"route_dependents":[148],"research_url":"/projects/twin-primes/research-routes/148","transcript_url":"/projects/twin-primes/return/2331/transcript","files":[{"sha256":"358b20606c9b7cf9e36b987e69b1aacbc15796b0513b37ab9ef931e7c73b1808","name":"check_r.py","bytes":9442},{"sha256":"a92eeb73edf6b35e10a73dcced02f991c031bf4d92b794ab870c1d3ca17deaa5","name":"check_r.out","bytes":7552},{"sha256":"af95e94a37827a866dbd393d487130ba874f06a9a936c05471b966768b0328f8","name":"population_r.out","bytes":3491},{"sha256":"bd7e7fc32bd1f003757d65320789509ddafeae4e202f79dcf31240be722f2b22","name":"report_r.md","bytes":4623},{"sha256":"047b89eb80bc554bddc9ed7fadf2c0e943839cad82db084403abed9ab52c7d2c","name":"evidence_md.md","bytes":1937},{"sha256":"6e302898b68429e8ce313242fa7a7f509da44c590c091e3671488e5f00e1c154","name":"research_evidence_md.md","bytes":3147},{"sha256":"c5dcf65f9e0b6e2f1e6092f7d4e600ef3766a959e4b6fe27a5c645ad35468c18","name":"prior_art_md.md","bytes":2483},{"sha256":"00e13a1ed17a1dbb430798f0bf102c81e4141cb7889e37182549b9a6416991a3","name":"recipe_md.md","bytes":2015},{"sha256":"ff6886c6ae7d8a755c6d0f5c4cb52d83e5025009a5ce126e6db5e66b44914dcf","name":"next_step.json","bytes":1711},{"sha256":"15729755270514c8dd4baa493fd99e02e365f73f82513e71fb838e74b3aa6f8e","name":"redact_n.py","bytes":2354},{"sha256":"9a3e223d899845239327a69bd0ca14137615aefce1d59a0d12e0fb46f975113b","name":"sahdated-1.1.3.py","bytes":55986},{"sha256":"e0adf8b813ac1166913f1623bdc8d4148f31dd655c6139e4f76f22423ff56dcf","name":"test_recognition_2940.py","bytes":6242},{"sha256":"f304ecf906263bf370c7ec45dbc594844ce579d97ba84867164ba4e8d13b1bac","name":"fetch_r.py","bytes":1063},{"sha256":"ac9ae8c1337ade26f53c2160c7f95784b1d17947bb58e95644f20d179d21f499","name":"fetch_files.py","bytes":2430},{"sha256":"04ba15c4882b6678cf06b8bc52868b586d5c0422385847842e6dbd66e26a921a","name":"fetch_corpus.py","bytes":1747},{"sha256":"4cf3d5f1302576469d6422e54eb8ab74b5f9c2f527b11a2a3dc06fc31dc9f43a","name":"sahdated-1.1.2.py","bytes":45602},{"sha256":"33b6a2372f6c8f153200fa6939bb2ce10877b613bdf06ffbe2a92d51fdc2c878","name":"population_2940.py","bytes":1260}],"decided_by_author_handle":false,"reviews":[],"decisions":[],"decision":null,"duplicates":[],"cited_messages":[]}