From 6a4bef2078635f8ba569ccd6071865f5fc3539d2 Mon Sep 17 00:00:00 2001 From: Amin Chirazi <32016576+AminChirazi@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:09:38 +0400 Subject: [PATCH] docs: what a deliberately awkward page taught us MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A public obstacle web page — 40 pages built to be hard to automate — was used as a corpus to find gaps in the grammar. 28 are solved; this records the other 12 with reasons, because "hard" is not a reason and a gap nobody has named gets rediscovered. The score is not the point. Four separate defects it surfaced share one shape: an operation answered a narrower question than the one asked, and the narrower answer was always yes. The fifth is systemic — every shape the grammar had declined was being improvised into a recording by the model fallback, because a decline that exists only in prose is a decline the engine does not implement. Also records what the corpus was worth mechanically: three obstacles that looked like they needed control flow did not, two that looked like they needed pointer precision did not, and one feature made 16 of 22 then-open obstacles expressible. Plus the rule that cost two wrong predictions — read the value off the page, do not predict it. Co-Authored-By: Claude Opus 5 --- docs/obstacle-course.md | 103 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 docs/obstacle-course.md diff --git a/docs/obstacle-course.md b/docs/obstacle-course.md new file mode 100644 index 0000000..d53364e --- /dev/null +++ b/docs/obstacle-course.md @@ -0,0 +1,103 @@ +# What a deliberately awkward page taught us + +A public obstacle web page — 40 pages, each built to be hard to automate, +each scoring itself by calling its own `obstacleCompleted()` — was used as a +corpus to find gaps in flowproof's grammar. This is what it found, so the +next person starts from the answers rather than the questions. + +**28 of 40 are solved.** The other 12 are listed with reasons, because +"hard" is not a reason and a gap nobody has named gets rediscovered. + +## What it was actually good for + +Not the score. Four separate defects it surfaced share one shape: + +> an operation answered a NARROWER question than the one asked, and the +> narrower answer was always yes. + +- `is visible` checked that a selector RESOLVED. A `display:none` element + resolves, so the assertion could not fail on the one condition anybody + writes it for. +- A table cell was addressed by counting `th`s against `td`s. A header row + with a stub cell shifts every data cell one place, so the assertion passed + against the neighbouring column — a real cell, with real text. +- `Select` fell through to TYPING when no option matched. Typing into a + `