sgit newsroom v0.1.29 · snapshot 2026-09-24

Reading room · chrome-extensions.sgit.ai

Reading room / chrome-extensions.sgit.ai · raw text · live ↗

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