The quality rubric
The founder's own words about the existing extensions: "all with different levels of quality." A site that says so without a way to measure it is asserting. Every row below comes from a specific incident in the four guides, so a score is a claim about which failures the extension can still suffer — not a style opinion. Grade with three values only: yes · no · not applicable. Never a number out of ten.
The grades in the three columns below are reported from what the guides themselves claim, not independently verified by re-reading source. The recorder's ~3,400 lines live in a separate vault this site does not have access to (gap G2); a real pass would read it (G5, open question Q3). The recorder is graded yes throughout because every check describes behaviour the guides attribute to it. The March Key Vault and September secrets-manager efforts are graded n/a throughout because neither has code to check — a design is read at best, never measured.
| # | Check | Why | Recorder | Key Vault | Secrets mgr |
|---|---|---|---|---|---|
| A. Does it stay safe to leave running? | |||||
| A1 | Never originates a request | "Every fact in the dataset is something the target volunteered to a real user in a real session" | yes | n/a | n/a |
| A2 | Never blocks, delays or alters a response | "A recorder that alters a response can break the page it is watching and you will spend a day thinking the target changed" | yes | n/a | n/a |
| A3 | Every hook wrapped in try/catch; never throws into the page | An exception in a wrapper is a bug in the target's app, from the target's point of view | yes | n/a | n/a |
| A4 | Never transmits; export is a manual download | The invariant that makes the tool defensible | yes | n/a | n/a |
| A5 | A deny list that is a privacy floor, re-derived per transport | Message content never captured in any mode, including all | yes | n/a | n/a |
| B. Can it prove what it saw? | |||||
| B1 | Build version stamped into every artefact | Ten days lost to a browser running an old build; "a quiet week on the target" | yes | n/a | n/a |
| B2 | Running build shown in the UI, on the surface opened first, coloured when stale | The badge shipped to the side panel while the popup "went on saying nothing for two versions — exactly the wrong way round" | yes | n/a | n/a |
| B3 | Coverage reported per surface, including zeroes | "A surface absent reads as 'nothing happened'. A surface listed with zero reads as 'we never looked'" | yes | n/a | n/a |
| B4 | Truncation flagged, with the original length stored | "A record that says truncated: true with 4 MiB of content is a fact you can act on. A dropped record is silence" | yes | n/a | n/a |
| B5 | Skips counted by endpoint in an unparsed tally | That tally is the to-do list for the next parser | yes | n/a | n/a |
| B6 | An observations log recording what was refused, and why | Twice settled questions nothing else could, including proving an old build was running | yes | n/a | n/a |
| C. Does it fail in the right direction? | |||||
| C1 | Missing is null; never 0, '' or {} | res || {} turned "no answer" into "an answer with nothing in it" and cost two runs | yes | n/a | n/a |
| C2 | No file constructed from an unchecked value | new Blob([undefined]) writes the word "undefined" and calls it undefined.json | yes | n/a | n/a |
| C3 | Records with no stable identifier yield nothing, never the previous id | "Losing two is correct; mislabelling two is not" | yes | n/a | n/a |
| C4 | Bulk data never crosses a size-limited channel | 113 MB export vs chrome.runtime.sendMessage; the fix is to remove the boundary, not widen it | yes | n/a | n/a |
| C5 | A circuit breaker over live counters, with generous thresholds | Three runs lost silently; "a breaker that trips on noise gets ignored, and an ignored breaker is worse than none" | yes | n/a | n/a |
| C6 | Failures loud at mechanisms, quiet at data | Quiet-and-counted for what you did not understand; loud-and-stop for what did not work | yes | n/a | n/a |
| D. Is the evidence separable from the interpretation? | |||||
| D1 | Phase 0 first — a recorder with no parsers | "This is not the product." The best decision in the project | yes | n/a | n/a |
| D2 | captures/ read-only; everything else regenerable | Being wrong costs a re-derive, not a re-capture | yes | n/a | n/a |
| D3 | Derived format versioned, and refused when unknown | Silently reading a v1 file understates the dataset without saying so | yes | n/a | n/a |
| D4 | Code and data in separate stores, with a per-folder publication rule | Different sensitivity, lifecycle, size and failure mode | yes | n/a | n/a |
| D5 | Exports split full / skeleton / debug, with a redaction verifier | The verifier counts what it checked, so "0 leaks" means something | yes | n/a | n/a |
| E. Is it built on evidence rather than one example? | |||||
| E1 | A shape survey written before the parser | Found 58 distinct type names in one run and answered a week-old question | yes | n/a | n/a |
| E2 | Routing on what the response says about itself | Request-side ids are "the caller's opinion"; three result sets shared a path and a prefix | yes | n/a | n/a |
| E3 | Derived facts verified against an artefact the system produced | "Two independent clocks agreeing to within a round trip is strong. One clock agreeing with itself is nothing" | yes | n/a | n/a |
| E4 | Structural markers read instead of rendered English | Parsing the sentence works "until the string is localised, pluralised, or A/B tested" | yes | n/a | n/a |
| E5 | Types in structured identifiers read as data, with branching | A variant means loosen; a different type means branch | yes | n/a | n/a |
| E6 | Sample caps checked for selecting against the evidence | 59 of 70 whole — because the whole ones were the small ones | yes | n/a | n/a |
| E7 | Timestamp provenance labelled (urn vs captured) | Lets consumers filter on evidence quality | yes | n/a | n/a |
| F. Do the tests pin the lessons? | |||||
| F1 | Test files auto-discovered; exits non-zero on zero found | "'No tests found' and 'all tests passed' must never look the same" | yes | n/a | n/a |
| F2 | Optional-dependency suites print SKIPPED loudly | A suite silently dropping 11 tests will eventually be why a bug ships | yes | n/a | n/a |
| F3 | Test names state decisions, not behaviours | "the label goes with the value" tells the next reader why the code looks that way | yes | n/a | n/a |
| F4 | Fixtures hand-authored and synthetic; real captures never become test data | A privacy rule that turned out to be a design rule | yes | n/a | n/a |
| F5 | A real browser drives anything with a real browser boundary | The 113 MB messaging bug was "invisible to unit tests by construction" | yes | n/a | n/a |
Why grade this project's own work
Publishing it means the recorder scores well, the March pack is a plan and mostly not-applicable, and the September brief has no code to grade. A rubric its author's own work does not pass everywhere is the only kind worth trusting — and the honest caveat above (reported, not computed) is itself an instance of the claim-state discipline the rest of this site asks of every number.