|
4 | 4 | records what happened when its success predicate was executed for real, keyless, against |
5 | 5 | live sites — and the defect that found. |
6 | 6 |
|
7 | | -**Status: local keyless live predicate verified.** Not "live-collection verified". The |
8 | | -distinction is the point of this file. |
| 7 | +**Status: local live predicate verified on BOTH routes — keyless and metered.** Not |
| 8 | +"live-collection verified": the GitHub Actions path has still never run. The distinction |
| 9 | +is the point of this file. |
9 | 10 |
|
10 | 11 | ## Method |
11 | 12 |
|
@@ -84,3 +85,76 @@ real fetch. |
84 | 85 | The gap is now "the CI wiring and the metered route are untested" rather than "the whole |
85 | 86 | thing is untested", which is smaller and specific. Closing the rest needs the |
86 | 87 | `live-collection` environment and one real dispatch. |
| 88 | + |
| 89 | + |
| 90 | +--- |
| 91 | + |
| 92 | +# The metered run — 2026-09-21, later the same day |
| 93 | + |
| 94 | +The keyless run proved the predicate logic. It could not touch the paid route, the |
| 95 | +credential path, or `cliCompatibility` against a real installed CLI. This did, with a |
| 96 | +real key and real credits. |
| 97 | + |
| 98 | +## The meter is the proof |
| 99 | + |
| 100 | +``` |
| 101 | +credits before 900 / 1000 |
| 102 | +credits after 898 / 1000 |
| 103 | +``` |
| 104 | + |
| 105 | +Two pages, two credits. Nothing about this run was simulated. |
| 106 | + |
| 107 | +## Every condition, on the metered route |
| 108 | + |
| 109 | +| condition | result | |
| 110 | +|---|---| |
| 111 | +| `cliCompatibility()` against the installed CLI | `supported: Firecrawl CLI 1.23.3, the version this adapter is tested against` | |
| 112 | +| `research.mjs --dry-run` | exit 0, spent nothing | |
| 113 | +| `research.mjs` — 2 pages, `firecrawl-cli` | exit 0, 2 collected, 0 failed | |
| 114 | +| ledger exists, parses, records successful fetches | 2 entries, 2 successful | |
| 115 | +| `handoff.mjs` | exit 0 — "every cited capture on disk, chain verifies" | |
| 116 | +| `provenance` | pass | |
| 117 | +| `corpus-shape` | pass | |
| 118 | +| `citations` | pass | |
| 119 | +| `transport-provenance` | pass | |
| 120 | +| `hygiene` | pass | |
| 121 | +| repository unchanged | `git status --porcelain` empty | |
| 122 | + |
| 123 | +## Two things the metered route showed that keyless could not |
| 124 | + |
| 125 | +**Completeness grading distinguishes the transports.** The same predicate, different |
| 126 | +routes: |
| 127 | + |
| 128 | +``` |
| 129 | +keyless docs.github.com partial |
| 130 | +keyless example.com partial |
| 131 | +metered docs.firecrawl.dev FULL |
| 132 | +metered example.com partial |
| 133 | +``` |
| 134 | + |
| 135 | +The metered route got a complete capture where the keyless one got a partial. That is the |
| 136 | +difference the two adapters exist to express, and it is graded honestly rather than |
| 137 | +claimed — `example.com` stayed `partial` on both, because it genuinely is a stub page. |
| 138 | + |
| 139 | +**The credential never reached the ledger.** The ledger's `cmd` field, which is committed |
| 140 | +with a corpus, reads: |
| 141 | + |
| 142 | +``` |
| 143 | +firecrawl scrape https://docs.firecrawl.dev/rate-limits --only-main-content --json |
| 144 | +``` |
| 145 | + |
| 146 | +No key, in any field, in either entry — checked by scanning the whole serialised ledger |
| 147 | +for key-shaped strings. The CLI reads its credential from its own config; the kit never |
| 148 | +puts it on a command line it renders. |
| 149 | + |
| 150 | +## What is now established, and what is still not |
| 151 | + |
| 152 | +**Established with a real credential and real spend:** the compatibility gate passes a |
| 153 | +real CLI; the metered adapter collects; the ledger records and hashes real bodies; the |
| 154 | +chain verifies; all five integrity checks hold on a metered corpus; completeness grading |
| 155 | +discriminates between routes; the credential does not leak into recorded evidence; and |
| 156 | +collection writes nothing into the repository it runs from. |
| 157 | + |
| 158 | +**Still not established:** the GitHub Actions runner path. `workflow_dispatch` has never |
| 159 | +fired, the `live-collection` environment does not exist, and the secret has never been |
| 160 | +wired. What remains unproven is the CI plumbing — not the kit. |
0 commit comments