{
 "what": "The map of what a reader runs, as a layered graph (site, pages, views, files, contracts, findings); drawn by assets/site.js on /review/map/.",
 "release": "v0.12.50",
 "layers": [
  "the site",
  "the pages",
  "the views",
  "the files",
  "the contracts",
  "the findings"
 ],
 "nodes": [
  {
   "id": "site",
   "layer": 0,
   "label": "newsroom.sgit.ai",
   "kind": "site"
  },
  {
   "id": "page:account/index.html",
   "layer": 1,
   "label": "account/index.html",
   "kind": "page",
   "what": "the reading account"
  },
  {
   "id": "page:account/newsroom.html",
   "layer": 1,
   "label": "account/newsroom.html",
   "kind": "page",
   "what": "the reader's newsroom"
  },
  {
   "id": "page:account/personas.html",
   "layer": 1,
   "label": "account/personas.html",
   "kind": "page",
   "what": "the personas"
  },
  {
   "id": "page:account/share.html",
   "layer": 1,
   "label": "account/share.html",
   "kind": "page",
   "what": "send us your reading"
  },
  {
   "id": "page:account/top-up.html",
   "layer": 1,
   "label": "account/top-up.html",
   "kind": "page",
   "what": "the top-up"
  },
  {
   "id": "page:account/topped-up.html",
   "layer": 1,
   "label": "account/topped-up.html",
   "kind": "page",
   "what": "the page a payment returns to"
  },
  {
   "id": "page:subscribe/index.html",
   "layer": 1,
   "label": "subscribe/index.html",
   "kind": "page",
   "what": "subscribe"
  },
  {
   "id": "page:persona/index.html",
   "layer": 1,
   "label": "persona/index.html",
   "kind": "page",
   "what": "the persona picker"
  },
  {
   "id": "page:persona/founder/index.html",
   "layer": 1,
   "label": "persona/founder/index.html",
   "kind": "page",
   "what": "a persona link"
  },
  {
   "id": "page:persona/journalist/index.html",
   "layer": 1,
   "label": "persona/journalist/index.html",
   "kind": "page",
   "what": "a persona link"
  },
  {
   "id": "page:persona/security/index.html",
   "layer": 1,
   "label": "persona/security/index.html",
   "kind": "page",
   "what": "a persona link"
  },
  {
   "id": "page:persona/builder/index.html",
   "layer": 1,
   "label": "persona/builder/index.html",
   "kind": "page",
   "what": "a persona link"
  },
  {
   "id": "page:persona/board/index.html",
   "layer": 1,
   "label": "persona/board/index.html",
   "kind": "page",
   "what": "a persona link"
  },
  {
   "id": "page:for/index.html",
   "layer": 1,
   "label": "for/index.html",
   "kind": "page",
   "what": "a reading list"
  },
  {
   "id": "page:for/make.html",
   "layer": 1,
   "label": "for/make.html",
   "kind": "page",
   "what": "make a reading list"
  },
  {
   "id": "page:wire/index.html",
   "layer": 1,
   "label": "wire/index.html",
   "kind": "page",
   "what": "the Industry Wire's edition"
  },
  {
   "id": "page:wire/sources.html",
   "layer": 1,
   "label": "wire/sources.html",
   "kind": "page",
   "what": "the wire's sources"
  },
  {
   "id": "page:wire/how.html",
   "layer": 1,
   "label": "wire/how.html",
   "kind": "page",
   "what": "how the wire is read, and its documents"
  },
  {
   "id": "page:wire/owasp/index.html",
   "layer": 1,
   "label": "wire/owasp/index.html",
   "kind": "page",
   "what": "the OWASP Wire's edition, with the projects graph"
  },
  {
   "id": "page:wire/aws/index.html",
   "layer": 1,
   "label": "wire/aws/index.html",
   "kind": "page",
   "what": "the AWS Wire's edition, with the stack and its deadlines"
  },
  {
   "id": "page:wire/portugal/index.html",
   "layer": 1,
   "label": "wire/portugal/index.html",
   "kind": "page",
   "what": "the Portugal Wire's edition, in English and Portuguese, with the ecosystem map"
  },
  {
   "id": "page:wire/days.html",
   "layer": 1,
   "label": "wire/days.html",
   "kind": "page",
   "what": "every wire day by day"
  },
  {
   "id": "page:wire/charter.html",
   "layer": 1,
   "label": "wire/charter.html",
   "kind": "page",
   "what": "the charter of the wires"
  },
  {
   "id": "page:wire/desk-brief.html",
   "layer": 1,
   "label": "wire/desk-brief.html",
   "kind": "page",
   "what": "the brief for the desks"
  },
  {
   "id": "page:wire/reach.html",
   "layer": 1,
   "label": "wire/reach.html",
   "kind": "page",
   "what": "who should know, by organisation route"
  },
  {
   "id": "page:vault/index.html",
   "layer": 1,
   "label": "vault/index.html",
   "kind": "page",
   "what": "your vault: the reading account carried between devices, with the pane open"
  },
  {
   "id": "page:meter/index.html",
   "layer": 1,
   "label": "meter/index.html",
   "kind": "page",
   "what": "SG Meter, documented"
  },
  {
   "id": "page:meter/security.html",
   "layer": 1,
   "label": "meter/security.html",
   "kind": "page",
   "what": "the meter's security model"
  },
  {
   "id": "page:demos/vaults/newsroom-synthetic-users/index.html",
   "layer": 1,
   "label": "demos/vaults/newsroom-synthetic-users/index.html",
   "kind": "page",
   "what": "the synthetic-readers study, with the embedded vault"
  },
  {
   "id": "view:account",
   "layer": 2,
   "label": "view account",
   "kind": "view",
   "what": "the meter's account view, on 1 page(s)"
  },
  {
   "id": "view:landing",
   "layer": 2,
   "label": "view landing",
   "kind": "view",
   "what": "the meter's landing view, on 6 page(s)"
  },
  {
   "id": "view:newsroom",
   "layer": 2,
   "label": "view newsroom",
   "kind": "view",
   "what": "the meter's newsroom view, on 1 page(s)"
  },
  {
   "id": "view:page",
   "layer": 2,
   "label": "view page",
   "kind": "view",
   "what": "the meter's page view, on 606 page(s)"
  },
  {
   "id": "view:personas",
   "layer": 2,
   "label": "view personas",
   "kind": "view",
   "what": "the meter's personas view, on 1 page(s)"
  },
  {
   "id": "view:share",
   "layer": 2,
   "label": "view share",
   "kind": "view",
   "what": "the meter's share view, on 1 page(s)"
  },
  {
   "id": "view:topped-up",
   "layer": 2,
   "label": "view topped-up",
   "kind": "view",
   "what": "the meter's topped-up view, on 1 page(s)"
  },
  {
   "id": "view:topup",
   "layer": 2,
   "label": "view topup",
   "kind": "view",
   "what": "the meter's topup view, on 1 page(s)"
  },
  {
   "id": "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "layer": 3,
   "label": "sg-meter.js",
   "kind": "file",
   "path": "assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "lines": 817,
   "what": "SG Meter, the element: twelve views, the reader card, the share form, the graph"
  },
  {
   "id": "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "layer": 3,
   "label": "sg-meter-core.js",
   "kind": "file",
   "path": "assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "lines": 513,
   "what": "SG Meter, the meter: prices, the charge, ratings, declining, credit, personas, picks, the share text"
  },
  {
   "id": "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.css",
   "layer": 3,
   "label": "sg-meter.css",
   "kind": "file",
   "path": "assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.css",
   "lines": 192,
   "what": "SG Meter styles, adopted into the shadow root"
  },
  {
   "id": "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.tpl",
   "layer": 3,
   "label": "sg-meter.tpl",
   "kind": "file",
   "path": "assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.tpl",
   "lines": 1,
   "what": "SG Meter markup (one div)"
  },
  {
   "id": "file:assets/components/base/v1/v1.0/v1.0.0/sg-component.js",
   "layer": 3,
   "label": "sg-component.js",
   "kind": "file",
   "path": "assets/components/base/v1/v1.0/v1.0.0/sg-component.js",
   "lines": 118,
   "what": "The component base: fetches the .tpl and .css beside a component and calls onReady()"
  },
  {
   "id": "file:for/reading-list.js",
   "layer": 3,
   "label": "reading-list.js",
   "kind": "file",
   "path": "for/reading-list.js",
   "lines": 343,
   "what": "A reading list in a link: parse, build, show, open as a persona"
  },
  {
   "id": "file:for/make.js",
   "layer": 3,
   "label": "make.js",
   "kind": "file",
   "path": "for/make.js",
   "lines": 254,
   "what": "The page that makes a reading list and previews it"
  },
  {
   "id": "file:for/for.css",
   "layer": 3,
   "label": "for.css",
   "kind": "file",
   "path": "for/for.css",
   "lines": 109,
   "what": "Styles for the two reading-list pages"
  },
  {
   "id": "file:assets/subscribe.js",
   "layer": 3,
   "label": "subscribe.js",
   "kind": "file",
   "path": "assets/subscribe.js",
   "lines": 117,
   "what": "The subscribe form: encrypts the address and posts it to the lane"
  },
  {
   "id": "file:wire/vault-reader.js",
   "layer": 3,
   "label": "vault-reader.js",
   "kind": "file",
   "path": "wire/vault-reader.js",
   "lines": 182,
   "what": "Reads an sgit vault in the browser with a published read key: ref, commit, tree, blobs, decrypted with Web Crypto; the markdown renderer"
  },
  {
   "id": "file:wire/graphs.js",
   "layer": 3,
   "label": "graphs.js",
   "kind": "file",
   "path": "wire/graphs.js",
   "lines": 356,
   "what": "The wires' graphs: a provenance strip per story, stories per day by beat, the threads on a date axis, the entities stories share, a sources tally, a story-by-persona matrix; SVG from the bundle, text nodes only, colours as theme tokens"
  },
  {
   "id": "file:admin/build/infographics.py",
   "layer": 3,
   "label": "infographics.py",
   "kind": "file",
   "path": "admin/build/infographics.py",
   "lines": 617,
   "what": "One card per story and one hero per edition through dev.tools.sgraph.ai, with a cost ledger per edition and per wire; the key from the environment only, a dry run without it"
  },
  {
   "id": "file:wire/wire.js",
   "layer": 3,
   "label": "wire.js",
   "kind": "file",
   "path": "wire/wire.js",
   "lines": 519,
   "what": "The wires: the edition with its lens, release notes and corrections, a map or a stack when the vault has one, the sources, the documents, drawn from the vault as text; one code for every wire"
  },
  {
   "id": "file:wire/wire.css",
   "layer": 3,
   "label": "wire.css",
   "kind": "file",
   "path": "wire/wire.css",
   "lines": 176,
   "what": "Styles for the wire pages"
  },
  {
   "id": "file:wire/subscribe.js",
   "layer": 3,
   "label": "subscribe.js",
   "kind": "file",
   "path": "wire/subscribe.js",
   "lines": 103,
   "what": "Subscribe to one wire alone: the newsletter's envelope and lane (assets/subscribe.js, unedited), with X-SGit-List naming the wire"
  },
  {
   "id": "file:admin/build/wire-reach.json",
   "layer": 3,
   "label": "wire-reach.json",
   "kind": "file",
   "path": "admin/build/wire-reach.json",
   "lines": 109,
   "what": "The organisation routes this site found for each wire's reach page, under the published contact rules: page, date, hash, role addresses"
  },
  {
   "id": "file:admin/build/wire-vault.json",
   "layer": 3,
   "label": "wire-vault.json",
   "kind": "file",
   "path": "admin/build/wire-vault.json",
   "lines": 14,
   "what": "The Industry Wire's vault: endpoint, vault id, the public read key (the only kind of key on this site)"
  },
  {
   "id": "file:admin/build/wire-vault.owasp.json",
   "layer": 3,
   "label": "wire-vault.owasp.json",
   "kind": "file",
   "path": "admin/build/wire-vault.owasp.json",
   "lines": 17,
   "what": "The OWASP Wire's vault (wire/owasp/): the same contract, its own public read key"
  },
  {
   "id": "file:admin/build/wire-vault.aws.json",
   "layer": 3,
   "label": "wire-vault.aws.json",
   "kind": "file",
   "path": "admin/build/wire-vault.aws.json",
   "lines": 17,
   "what": "The AWS Wire's vault (wire/aws/): the same contract, its own public read key"
  },
  {
   "id": "file:admin/build/wire-vault.portugal.json",
   "layer": 3,
   "label": "wire-vault.portugal.json",
   "kind": "file",
   "path": "admin/build/wire-vault.portugal.json",
   "lines": 17,
   "what": "The Portugal Wire's vault (wire/portugal/): the same contract, its own public read key; the bundle is bilingual"
  },
  {
   "id": "file:wire/snapshot.json",
   "layer": 3,
   "label": "snapshot.json",
   "kind": "file",
   "path": "wire/snapshot.json",
   "lines": 717,
   "what": "The Industry Wire as it was in the vault at the last release: headlines, primary links, corrections, the latest release note; the fallback and the agents' index"
  },
  {
   "id": "file:wire/owasp/snapshot.json",
   "layer": 3,
   "label": "snapshot.json",
   "kind": "file",
   "path": "wire/owasp/snapshot.json",
   "lines": 284,
   "what": "The OWASP Wire at the last release, the same shape"
  },
  {
   "id": "file:wire/aws/snapshot.json",
   "layer": 3,
   "label": "snapshot.json",
   "kind": "file",
   "path": "wire/aws/snapshot.json",
   "lines": 936,
   "what": "The AWS Wire at the last release, the same shape, with the stack's deadlines"
  },
  {
   "id": "file:wire/portugal/snapshot.json",
   "layer": 3,
   "label": "snapshot.json",
   "kind": "file",
   "path": "wire/portugal/snapshot.json",
   "lines": 507,
   "what": "The Portugal Wire at the last release, the same shape, with each headline in Portuguese too"
  },
  {
   "id": "file:assets/vault-ui-embed.js",
   "layer": 3,
   "label": "vault-ui-embed.js",
   "kind": "file",
   "path": "assets/vault-ui-embed.js",
   "lines": 126,
   "what": "The study page: embeds the vault browser from dev.vault.sgraph.ai and hands it a read key"
  },
  {
   "id": "file:assets/shots.js",
   "layer": 3,
   "label": "shots.js",
   "kind": "file",
   "path": "assets/shots.js",
   "lines": 278,
   "what": "Figures: sets each image's address at runtime"
  },
  {
   "id": "file:assets/site.js",
   "layer": 3,
   "label": "site.js",
   "kind": "file",
   "path": "assets/site.js",
   "lines": 81,
   "what": "Page behaviour: nav, copy buttons, reveal-on-scroll"
  },
  {
   "id": "file:assets/nav.js",
   "layer": 3,
   "label": "nav.js",
   "kind": "file",
   "path": "assets/nav.js",
   "lines": 42,
   "what": "Nav behaviour on the pages this site writes"
  },
  {
   "id": "file:.well-known/sgit-subscribe.json",
   "layer": 3,
   "label": "sgit-subscribe.json",
   "kind": "file",
   "path": ".well-known/sgit-subscribe.json",
   "lines": 25,
   "what": "The lane and the public key the share and the subscription are encrypted to and written into"
  },
  {
   "id": "file:articles/ids.json",
   "layer": 3,
   "label": "ids.json",
   "kind": "file",
   "path": "articles/ids.json",
   "lines": 1849,
   "what": "A number for every article: the contract reading lists are built on"
  },
  {
   "id": "file:persona/links.json",
   "layer": 3,
   "label": "links.json",
   "kind": "file",
   "path": "persona/links.json",
   "lines": 268,
   "what": "The persona links, for whoever writes to someone"
  },
  {
   "id": "file:articles/graphs.json",
   "layer": 3,
   "label": "graphs.json",
   "kind": "file",
   "path": "articles/graphs.json",
   "lines": 31261,
   "what": "The feed the picks and the graph read: every article with topics, tags and citations"
  },
  {
   "id": "file:assets/newsroom-vault.js",
   "layer": 3,
   "label": "newsroom-vault.js",
   "kind": "file",
   "path": "assets/newsroom-vault.js",
   "lines": 255,
   "what": "The newsroom's vault module: create, open, read, write and publish through the vendored library; the door, master and reader vaults; unlock; add a door"
  },
  {
   "id": "file:assets/door.js",
   "layer": 3,
   "label": "door.js",
   "kind": "file",
   "path": "assets/door.js",
   "lines": 139,
   "what": "From a passkey's PRF bytes (or a recovery code) to a door vault's key: the article's derivation, shared by the lab and the pane"
  },
  {
   "id": "file:assets/vault-pane/vault-pane.js",
   "layer": 3,
   "label": "vault-pane.js",
   "kind": "file",
   "path": "assets/vault-pane/vault-pane.js",
   "lines": 784,
   "what": "The vault pane on every page with the meter, in three tabs: this page (the notes, send to the newsroom, the lane's read key), the vault (enable with the passkey, create or join, update the vault, the table across devices, bring their activity here), the keys (every vault of the account)"
  },
  {
   "id": "file:assets/vault-pane/notes.js",
   "layer": 3,
   "label": "notes.js",
   "kind": "file",
   "path": "assets/vault-pane/notes.js",
   "lines": 137,
   "what": "The reader's notes as records: one tap at a piece (done, read later, not for me, more like this, liked, wrong, fix this, idea) with words and the selected phrase, kept in localStorage sgit.notes.v1; keep, add words, remove, mark sent; the decision at a page"
  },
  {
   "id": "file:assets/search/search.js",
   "layer": 3,
   "label": "search.js",
   "kind": "file",
   "path": "assets/search/search.js",
   "lines": 318,
   "what": "Search in the browser: the index from search/docs.json and search/text.json, BM25 over fields and paragraphs, phrases, numbers, prefixes, snippets; the search page"
  },
  {
   "id": "file:assets/search/search.css",
   "layer": 3,
   "label": "search.css",
   "kind": "file",
   "path": "assets/search/search.css",
   "lines": 25,
   "what": "Styles for the search page"
  },
  {
   "id": "file:assets/search/ask.js",
   "layer": 3,
   "label": "ask.js",
   "kind": "file",
   "path": "assets/search/ask.js",
   "lines": 184,
   "what": "Ask: the top passages, numbered, given to Chrome's built-in model or to openrouter.ai with the reader's own key, answered with citations; the key in the tab unless kept"
  },
  {
   "id": "file:assets/search/ask.css",
   "layer": 3,
   "label": "ask.css",
   "kind": "file",
   "path": "assets/search/ask.css",
   "lines": 23,
   "what": "Styles for Ask on the search page"
  },
  {
   "id": "file:assets/vault-pane/inbox.js",
   "layer": 3,
   "label": "inbox.js",
   "kind": "file",
   "path": "assets/vault-pane/inbox.js",
   "lines": 227,
   "what": "The inbox (049): the reader's RSA-OAEP key pair, the link (sgi1.<vault>.<token>.<key>), sgit's hybrid envelope, the append routes (configure, write, list, fetch, mark-processed), the drain, the QR code"
  },
  {
   "id": "file:assets/vault-pane/send.js",
   "layer": 3,
   "label": "send.js",
   "kind": "file",
   "path": "assets/vault-pane/send.js",
   "lines": 104,
   "what": "The sending side of the inbox, for a browser with the link and no passkey: its own records as one device file, sealed and appended"
  },
  {
   "id": "file:assets/vendor/qrcode-generator/2.0.4/qrcode.mjs",
   "layer": 3,
   "label": "qrcode.mjs",
   "kind": "file",
   "path": "assets/vendor/qrcode-generator/2.0.4/qrcode.mjs",
   "lines": 2237,
   "what": "QR code generator (Kazuhiko Arase, MIT), vendored unchanged, for the inbox link"
  },
  {
   "id": "file:assets/search/search-nav.css",
   "layer": 3,
   "label": "search-nav.css",
   "kind": "file",
   "path": "assets/search/search-nav.css",
   "lines": 5,
   "what": "The Search link in the nav, on every page"
  },
  {
   "id": "file:assets/vault-pane/wire-state.js",
   "layer": 3,
   "label": "wire-state.js",
   "kind": "file",
   "path": "assets/vault-pane/wire-state.js",
   "lines": 78,
   "what": "What this browser knows about the wire: stories seen and when, the visit, the lens chosen; and which of the vault's releases to show"
  },
  {
   "id": "file:assets/vault-pane/pending.js",
   "layer": 3,
   "label": "pending.js",
   "kind": "file",
   "path": "assets/vault-pane/pending.js",
   "lines": 47,
   "what": "What this browser holds that the reader vault does not yet: reads, top-ups, notes and stories seen since the last update"
  },
  {
   "id": "file:assets/vault-pane/reading.js",
   "layer": 3,
   "label": "reading.js",
   "kind": "file",
   "path": "assets/vault-pane/reading.js",
   "lines": 41,
   "what": "What this browser knows about what it has read, from the meter's records: one page summed up (times, when, how far, cost, rating) and the reading history"
  },
  {
   "id": "file:assets/vault-pane/sync.js",
   "layer": 3,
   "label": "sync.js",
   "kind": "file",
   "path": "assets/vault-pane/sync.js",
   "lines": 199,
   "what": "The activity vault's logic as pure functions: a device's file (reads, top-ups, personas, notes), the consolidated view, totals recomputed, merging into local state"
  },
  {
   "id": "file:assets/vault-pane/vault-pane.css",
   "layer": 3,
   "label": "vault-pane.css",
   "kind": "file",
   "path": "assets/vault-pane/vault-pane.css",
   "lines": 110,
   "what": "Styles for the pane, its tabs, the chips and the notes, and the page shift"
  },
  {
   "id": "file:assets/vendor/sg-vault/local/sg-vault--create-with-id.js",
   "layer": 3,
   "label": "sg-vault--create-with-id.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/local/sg-vault--create-with-id.js",
   "lines": 99,
   "what": "SGVault.createWithId: a vault at a derived id, a local patch pending upstream"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-send/sg-send-crypto.js",
   "layer": 3,
   "label": "sg-send-crypto.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-send/sg-send-crypto.js",
   "lines": 151,
   "what": "AES-256-GCM and PBKDF2 over Web Crypto"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-send/sg-send.js",
   "layer": 3,
   "label": "sg-send.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-send/sg-send.js",
   "lines": 275,
   "what": "The HTTP client: read, write, batch, presigned; x-sgraph-access-token"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-crypto.js",
   "layer": 3,
   "label": "sg-vault-crypto.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-crypto.js",
   "lines": 302,
   "what": "Key derivation: read key, write key, ref and index ids; key prefixes"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-object-store.js",
   "layer": 3,
   "label": "sg-vault-object-store.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-object-store.js",
   "lines": 290,
   "what": "Content-addressed objects, the write batch, the block caches"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-ref-manager.js",
   "layer": 3,
   "label": "sg-vault-ref-manager.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-ref-manager.js",
   "lines": 158,
   "what": "Refs and the branch index; write-if-match"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-commit.js",
   "layer": 3,
   "label": "sg-vault-commit.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault-commit.js",
   "lines": 175,
   "what": "Commits and trees, every field encrypted"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault.js",
   "layer": 3,
   "label": "sg-vault.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault.js",
   "lines": 566,
   "what": "SGVault: create, open, openReadOnly, the tree, the commit"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--file-ops.js",
   "layer": 3,
   "label": "sg-vault--file-ops.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--file-ops.js",
   "lines": 157,
   "what": "addFile, updateFile, getFile, removeFile, renameFile, moveFile"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--folder-ops.js",
   "layer": 3,
   "label": "sg-vault--folder-ops.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--folder-ops.js",
   "lines": 125,
   "what": "Folders, lazy sub-trees"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--sync.js",
   "layer": 3,
   "label": "sg-vault--sync.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--sync.js",
   "lines": 456,
   "what": "push, pushIfMatch, pull, merge, ahead and behind"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--history.js",
   "layer": 3,
   "label": "sg-vault--history.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--history.js",
   "lines": 89,
   "what": "History: commits, trees and files at a commit"
  },
  {
   "id": "file:assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--branches.js",
   "layer": 3,
   "label": "sg-vault--branches.js",
   "kind": "file",
   "path": "assets/vendor/sg-vault/v0.2.3/sg-vault/sg-vault--branches.js",
   "lines": 57,
   "what": "Branches from the index"
  },
  {
   "id": "contract:The meter config",
   "layer": 4,
   "label": "The meter config",
   "kind": "contract",
   "shape": "storageKey, start, newDays, symbol, prices{article_new,article,issue,note,collection,page,free}, depth, minDepth, topup{amount,link}, packs, links{account,topup,how}, rating{price[5],more[5]}, autoKeep, picks{feed,base}, links2{newsroom,personas,share}, share{contact,form,site,max}, personas{presets[],names{}}, root",
   "owner": "sg-meter-core.js DEFAULTS; written into every page by sgit.ai's build and re-pointed by the import"
  },
  {
   "id": "contract:A charged page",
   "layer": 4,
   "label": "A charged page",
   "kind": "contract",
   "shape": "<sg-meter view=\"page\" kind=\"article|issue|note|collection|page|free\" date=\"…\" topics=\"a b\" title=\"…\" [quiet]>: the price class comes from the page",
   "owner": "sgit.ai's build for imported pages; page.py (kind=free, quiet) for this site's"
  },
  {
   "id": "contract:A persona link",
   "layer": 4,
   "label": "A persona link",
   "kind": "contract",
   "shape": "/persona/<id>/ and /persona/#<id>, id ∈ {founder, journalist, security, builder, board}",
   "owner": "personas.py, persona/links.json"
  },
  {
   "id": "contract:A reading list link",
   "layer": 4,
   "label": "A reading list link",
   "kind": "contract",
   "shape": "/for/#from=&to=&r=&s=&f=&n=&e=: names ≤ 40 chars of letters, spaces, hyphens, apostrophes; r,s article numbers, 1–50 in all; f persona ids or c:<collection>, ≤ 10; n ≤ 240 chars; e an address",
   "owner": "for/reading-list.js LIMITS, parse(), build()"
  },
  {
   "id": "contract:Article numbers",
   "layer": 4,
   "label": "Article numbers",
   "kind": "contract",
   "shape": "articles/ids.json: n and slug are the contract, assigned once in publication order, never changed or reused; every other field is display text",
   "owner": "admin/build/ids.py; validate.js check 12"
  },
  {
   "id": "contract:The return page",
   "layer": 4,
   "label": "The return page",
   "kind": "contract",
   "shape": "?session_id=<ref>: credited once per distinct value, never verified",
   "owner": "_toppedUp(), credit()"
  },
  {
   "id": "contract:The export",
   "layer": 4,
   "label": "The export",
   "kind": "contract",
   "shape": "the state as JSON; restore accepts any file with balance:number and log:array",
   "owner": "restore()"
  },
  {
   "id": "contract:The share",
   "layer": 4,
   "label": "The share",
   "kind": "contract",
   "shape": "a text summary then the same data as JSON {v:1, site, at, balance, spent, declined, reads, topups, active, personas, topics, cols, log}, as an .eml with X-SGit-Form, X-SGit-Reply-To, X-SGit-Name, X-SGit-Subscribe, X-SGit-Page",
   "owner": "shareData(), _send()"
  },
  {
   "id": "contract:The envelope",
   "layer": 4,
   "label": "The envelope",
   "kind": "contract",
   "shape": "sgit hybrid envelope v2: {v:2, w, i, c} (RSA-OAEP-SHA256 wrapped AES-256-GCM key, iv, ciphertext), base64, then base64 again as the lane payload",
   "owner": "envelope(), subscribe.js encrypt()"
  },
  {
   "id": "contract:The contact file",
   "layer": 4,
   "label": "The contact file",
   "kind": "contract",
   "shape": "sgit-subscribe/v1: recipient{address, fingerprint, encrypt}, inbox{vault, endpoint, encrypt_to, status, lane{name, append_token}}; the fingerprint is recomputed from the PEM before use",
   "owner": ".well-known/sgit-subscribe.json"
  },
  {
   "id": "contract:The wires' vaults",
   "layer": 4,
   "label": "The wires' vaults",
   "kind": "contract",
   "shape": "u9i9jp0l (the Industry Wire), eitf274v (OWASP), v202bla5 (AWS), p6twygul (Portugal) on dev.send.sgraph.ai, read keys published; data/bundle.json {beats, stories, sources, personas, brief; wire, map, stack when present}, data/deliveries.json, data/releases.json (wire-releases/v1, one entry per publish), docs/*.md; story fields, changes and status shown as written; everything in a vault is public, for ever",
   "owner": "admin/build/wire-vault*.json; wire/how.html; each wire's agents own its content"
  },
  {
   "id": "contract:Events",
   "layer": 4,
   "label": "Events",
   "kind": "contract",
   "shape": "sg:meter.changed · charged · rated · declined · toppedup · reset · restored · persona · shared; sg-meter:error",
   "owner": "sg-meter-core.js _emit(), sg-component.js failed()"
  },
  {
   "id": "contract:A component",
   "layer": 4,
   "label": "A component",
   "kind": "contract",
   "shape": "static jsUrl, get resourceName(), onReady(); a .tpl and a .css beside the .js; published at an immutable versioned path",
   "owner": "sg-component.js"
  },
  {
   "id": "contract:The import's rules",
   "layer": 4,
   "label": "The import's rules",
   "kind": "contract",
   "shape": "the meter path rewrite (v1.3.1 → v1.4.1), the top-up link, ten text rules, the article number line, the moved banner cut, the foot of every issue; each stops the import when its anchor moves",
   "owner": "sync_newsroom.py items 9–15"
  },
  {
   "id": "finding:R1",
   "layer": 5,
   "label": "R1",
   "kind": "finding",
   "severity": "medium",
   "text": "Declining a page as “not relevant” leaves it in the persona's reading list. open() auto-keeps an article on first open; decline() refunds the charge but does not undo the auto-keep, so the article stays under “Its reading list” and profile() adds +5 for it while the decline subtracts 2: a page the reader rejected pulls its topics up.",
   "issue": 1
  },
  {
   "id": "finding:R2",
   "layer": 5,
   "label": "R2",
   "kind": "finding",
   "severity": "low",
   "text": "restore() checks that the file has a numeric balance and a log array and nothing else. A persona without on[] and off[] makes the personas and newsroom views throw and show nothing; a log entry's path is rendered as the history link's href as it is; a persona's theme is written into a style attribute as it is. The file is the reader's own, so the exposure is a file someone else sent them to restore.",
   "issue": 2
  },
  {
   "id": "finding:R3",
   "layer": 5,
   "label": "R3",
   "kind": "finding",
   "severity": "low",
   "text": "A malformed percent sequence in ?session_id= (for example %E0%A4%A) makes decodeURIComponent throw inside onReady, so the element fails with “did not load: URI malformed” instead of saying the reference is missing.",
   "issue": 3
  },
  {
   "id": "finding:R4",
   "layer": 5,
   "label": "R4",
   "kind": "finding",
   "severity": "medium",
   "text": "A reading share or a subscription sent from this site is labelled sgit.ai: the imported config has share.site = \"sgit.ai\" (so the text begins “My reading on sgit.ai”), subscribe.js writes From: site@sgit.ai, and the contact file says site: sgit.ai. The agent that drains the lane can tell the two sites apart only by the Sent from line.",
   "issue": 4
  },
  {
   "id": "finding:R5",
   "layer": 5,
   "label": "R5",
   "kind": "finding",
   "severity": "note",
   "text": "On the live site the lane for shares and subscriptions is on dev.send.sgraph.ai and the study page's vault frames come from dev.vault.sgraph.ai. Both hosts are named “dev”. Production reader data goes to them.",
   "issue": 5
  },
  {
   "id": "finding:R6",
   "layer": 5,
   "label": "R6",
   "kind": "finding",
   "severity": "low",
   "text": "Money is kept to a tenth of a penny and shown to a penny. Balance and spent are each formatted on their own, so a half-penny state shows, from £5.00, a balance of £4.95 and £0.06 spent, which do not add up; the history shows 5.5p. A reader who checks the arithmetic finds a penny missing.",
   "issue": 6
  },
  {
   "id": "finding:R7",
   "layer": 5,
   "label": "R7",
   "kind": "finding",
   "severity": "question",
   "text": "picks() excludes every page in the log, whichever persona read it, while profile() is per persona. An article read as Morgan is never picked for Rowan.",
   "issue": 7
  },
  {
   "id": "finding:R8",
   "layer": 5,
   "label": "R8",
   "kind": "finding",
   "severity": "low",
   "text": "feed() caches a failed fetch as null for the life of the page, so one transient failure leaves “The list of articles could not be loaded” on every view until a reload.",
   "issue": 8
  },
  {
   "id": "finding:R9",
   "layer": 5,
   "label": "R9",
   "kind": "finding",
   "severity": "medium",
   "text": "If sgit.ai renames an article (a new slug), ids.py marks the old number withdrawn and gives the article a new number. A reading list that named the old number then says the article is no longer published, although it is.",
   "issue": 9
  },
  {
   "id": "finding:R10",
   "layer": 5,
   "label": "R10",
   "kind": "finding",
   "severity": "high for the move",
   "text": "Every imported page loads assets/site.js, subscribe.js and shots.js by fetching the text and running it with (0, eval)(text) (the loader's bridge path), and the loader and the meter config are inline. A script-src policy without 'unsafe-eval' and without hashes breaks every page. frame-ancestors cannot be set in a meta tag at all, and GitHub Pages sets no headers, so framing (the Keep, Remove and Top up buttons under another site) is not prevented today.",
   "issue": 10
  },
  {
   "id": "finding:R11",
   "layer": 5,
   "label": "R11",
   "kind": "finding",
   "severity": "high per the brief",
   "text": "The one workflow ran validate.js only; the browser tests (46 + 65 checks) never ran in CI.",
   "issue": 11
  },
  {
   "id": "finding:R12",
   "layer": 5,
   "label": "R12",
   "kind": "finding",
   "severity": "note for the move",
   "text": "The account pages, subscribe, the contact file and the component base are imported from sgit.ai on every sync and cannot be changed here except by a recorded rule, and verbatim files (scripts, JSON) cannot be changed by rule at all. R4 is the first consequence. The newsroom's meter is v1.4.0 while sgit.ai's is v1.3.1.",
   "issue": 12
  },
  {
   "id": "finding:R13",
   "layer": 5,
   "label": "R13",
   "kind": "finding",
   "severity": "note",
   "text": "The export includes the payment references (sessions, topups[].ref) that the share deliberately leaves out. A reader who sends their export instead of their share sends them.",
   "issue": 13
  },
  {
   "id": "finding:R14",
   "layer": 5,
   "label": "R14",
   "kind": "finding",
   "severity": "low",
   "text": "sessions[] and topups[] grow without bound, and a payment reference is not checked for shape before it is stored.",
   "issue": 14
  },
  {
   "id": "finding:R15",
   "layer": 5,
   "label": "R15",
   "kind": "finding",
   "severity": "low",
   "text": "persona(id) falls back to personas[0], which is “me” only when “me” is first; after a restore that puts another persona first, an unknown id resolves to that persona.",
   "issue": 15
  },
  {
   "id": "finding:R16",
   "layer": 5,
   "label": "R16",
   "kind": "finding",
   "severity": "process",
   "text": "Imported pages load the meter as sg-meter.js?v=<sgit.ai's release>, so the cache-buster never changes for a release of this site. That is fine while a published version is never edited in place, which is the rule; it is written here because v1.4.0 was edited in place while it was being built.",
   "issue": 16
  },
  {
   "id": "finding:R17",
   "layer": 5,
   "label": "R17",
   "kind": "finding",
   "severity": "note",
   "text": "A list's persona is keyed by a 32-bit hash of the names and numbers, so two different lists can share one persona with probability about one in four billion per pair.",
   "issue": 17
  },
  {
   "id": "finding:R18",
   "layer": 5,
   "label": "R18",
   "kind": "finding",
   "severity": "note",
   "text": "The landing view adds a window hashchange listener per element and never removes it, and re-renders on every meter change (the picker's “Copied” label resets).",
   "issue": 18
  }
 ],
 "edges": [
  [
   "site",
   "page:account/index.html"
  ],
  [
   "site",
   "page:account/newsroom.html"
  ],
  [
   "site",
   "page:account/personas.html"
  ],
  [
   "site",
   "page:account/share.html"
  ],
  [
   "site",
   "page:account/top-up.html"
  ],
  [
   "site",
   "page:account/topped-up.html"
  ],
  [
   "site",
   "page:subscribe/index.html"
  ],
  [
   "site",
   "page:persona/index.html"
  ],
  [
   "site",
   "page:persona/founder/index.html"
  ],
  [
   "site",
   "page:persona/journalist/index.html"
  ],
  [
   "site",
   "page:persona/security/index.html"
  ],
  [
   "site",
   "page:persona/builder/index.html"
  ],
  [
   "site",
   "page:persona/board/index.html"
  ],
  [
   "site",
   "page:for/index.html"
  ],
  [
   "site",
   "page:for/make.html"
  ],
  [
   "site",
   "page:wire/index.html"
  ],
  [
   "site",
   "page:wire/sources.html"
  ],
  [
   "site",
   "page:wire/how.html"
  ],
  [
   "site",
   "page:wire/owasp/index.html"
  ],
  [
   "site",
   "page:wire/aws/index.html"
  ],
  [
   "site",
   "page:wire/portugal/index.html"
  ],
  [
   "site",
   "page:wire/days.html"
  ],
  [
   "site",
   "page:wire/charter.html"
  ],
  [
   "site",
   "page:wire/desk-brief.html"
  ],
  [
   "site",
   "page:wire/reach.html"
  ],
  [
   "site",
   "page:vault/index.html"
  ],
  [
   "site",
   "page:meter/index.html"
  ],
  [
   "site",
   "page:meter/security.html"
  ],
  [
   "site",
   "page:demos/vaults/newsroom-synthetic-users/index.html"
  ],
  [
   "view:account",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/index.html",
   "view:account"
  ],
  [
   "page:account/newsroom.html",
   "view:account"
  ],
  [
   "page:account/personas.html",
   "view:account"
  ],
  [
   "page:account/share.html",
   "view:account"
  ],
  [
   "page:account/top-up.html",
   "view:account"
  ],
  [
   "page:account/topped-up.html",
   "view:account"
  ],
  [
   "view:landing",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/personas.html",
   "view:landing"
  ],
  [
   "page:persona/index.html",
   "view:landing"
  ],
  [
   "page:persona/founder/index.html",
   "view:landing"
  ],
  [
   "page:persona/journalist/index.html",
   "view:landing"
  ],
  [
   "page:persona/security/index.html",
   "view:landing"
  ],
  [
   "page:persona/builder/index.html",
   "view:landing"
  ],
  [
   "page:persona/board/index.html",
   "view:landing"
  ],
  [
   "view:newsroom",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/newsroom.html",
   "view:newsroom"
  ],
  [
   "page:demos/vaults/newsroom-synthetic-users/index.html",
   "view:newsroom"
  ],
  [
   "view:page",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/index.html",
   "view:page"
  ],
  [
   "page:account/newsroom.html",
   "view:page"
  ],
  [
   "page:account/personas.html",
   "view:page"
  ],
  [
   "page:account/share.html",
   "view:page"
  ],
  [
   "page:account/top-up.html",
   "view:page"
  ],
  [
   "page:account/topped-up.html",
   "view:page"
  ],
  [
   "page:subscribe/index.html",
   "view:page"
  ],
  [
   "page:persona/index.html",
   "view:page"
  ],
  [
   "page:persona/founder/index.html",
   "view:page"
  ],
  [
   "page:persona/journalist/index.html",
   "view:page"
  ],
  [
   "page:persona/security/index.html",
   "view:page"
  ],
  [
   "page:persona/builder/index.html",
   "view:page"
  ],
  [
   "page:persona/board/index.html",
   "view:page"
  ],
  [
   "page:for/index.html",
   "view:page"
  ],
  [
   "page:for/make.html",
   "view:page"
  ],
  [
   "page:wire/index.html",
   "view:page"
  ],
  [
   "page:wire/sources.html",
   "view:page"
  ],
  [
   "page:wire/how.html",
   "view:page"
  ],
  [
   "page:wire/owasp/index.html",
   "view:page"
  ],
  [
   "page:wire/aws/index.html",
   "view:page"
  ],
  [
   "page:wire/portugal/index.html",
   "view:page"
  ],
  [
   "page:wire/days.html",
   "view:page"
  ],
  [
   "page:wire/charter.html",
   "view:page"
  ],
  [
   "page:wire/desk-brief.html",
   "view:page"
  ],
  [
   "page:wire/reach.html",
   "view:page"
  ],
  [
   "page:vault/index.html",
   "view:page"
  ],
  [
   "page:meter/index.html",
   "view:page"
  ],
  [
   "page:meter/security.html",
   "view:page"
  ],
  [
   "page:demos/vaults/newsroom-synthetic-users/index.html",
   "view:page"
  ],
  [
   "view:personas",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/personas.html",
   "view:personas"
  ],
  [
   "view:share",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/share.html",
   "view:share"
  ],
  [
   "view:topped-up",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/topped-up.html",
   "view:topped-up"
  ],
  [
   "view:topup",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/top-up.html",
   "view:topup"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "contract:The meter config"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "contract:The meter config"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.css",
   "contract:The meter config"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.tpl",
   "contract:The meter config"
  ],
  [
   "file:for/for.css",
   "contract:A charged page"
  ],
  [
   "file:assets/site.js",
   "contract:A charged page"
  ],
  [
   "file:persona/links.json",
   "contract:A persona link"
  ],
  [
   "file:for/reading-list.js",
   "contract:A reading list link"
  ],
  [
   "file:for/for.css",
   "contract:A reading list link"
  ],
  [
   "file:assets/vault-pane/reading.js",
   "contract:A reading list link"
  ],
  [
   "file:articles/ids.json",
   "contract:Article numbers"
  ],
  [
   "file:assets/vault-pane/send.js",
   "contract:The share"
  ],
  [
   "file:assets/subscribe.js",
   "contract:The envelope"
  ],
  [
   "file:wire/subscribe.js",
   "contract:The envelope"
  ],
  [
   "file:assets/subscribe.js",
   "contract:The contact file"
  ],
  [
   "file:wire/subscribe.js",
   "contract:The contact file"
  ],
  [
   "file:.well-known/sgit-subscribe.json",
   "contract:The contact file"
  ],
  [
   "file:wire/wire.js",
   "contract:The wires' vaults"
  ],
  [
   "file:wire/wire.css",
   "contract:The wires' vaults"
  ],
  [
   "file:admin/build/wire-vault.json",
   "contract:The wires' vaults"
  ],
  [
   "file:admin/build/wire-vault.owasp.json",
   "contract:The wires' vaults"
  ],
  [
   "file:admin/build/wire-vault.aws.json",
   "contract:The wires' vaults"
  ],
  [
   "file:admin/build/wire-vault.portugal.json",
   "contract:The wires' vaults"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "contract:Events"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "contract:Events"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.css",
   "contract:Events"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.tpl",
   "contract:Events"
  ],
  [
   "file:assets/components/base/v1/v1.0/v1.0.0/sg-component.js",
   "contract:Events"
  ],
  [
   "file:assets/components/base/v1/v1.0/v1.0.0/sg-component.js",
   "contract:A component"
  ],
  [
   "file:assets/vault-pane/sync.js",
   "contract:The import's rules"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R1"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "finding:R2"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R2"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "finding:R3"
  ],
  [
   "file:assets/subscribe.js",
   "finding:R4"
  ],
  [
   "file:wire/subscribe.js",
   "finding:R4"
  ],
  [
   "file:.well-known/sgit-subscribe.json",
   "finding:R4"
  ],
  [
   "file:assets/subscribe.js",
   "finding:R5"
  ],
  [
   "file:wire/subscribe.js",
   "finding:R5"
  ],
  [
   "file:assets/vault-ui-embed.js",
   "finding:R5"
  ],
  [
   "file:.well-known/sgit-subscribe.json",
   "finding:R5"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R6"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R7"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R8"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "finding:R13"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R14"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js",
   "finding:R15"
  ],
  [
   "file:for/reading-list.js",
   "finding:R17"
  ],
  [
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js",
   "finding:R18"
  ],
  [
   "page:account/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:account/newsroom.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/newsroom.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:account/personas.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/personas.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:account/share.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/share.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:account/top-up.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/top-up.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:account/topped-up.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:account/topped-up.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:subscribe/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:subscribe/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/founder/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/founder/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/journalist/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/journalist/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/security/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/security/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/builder/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/builder/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:persona/board/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:persona/board/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:for/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:for/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:for/make.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:for/make.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/sources.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/sources.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/how.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/how.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/owasp/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/owasp/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/aws/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/aws/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/portugal/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/portugal/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/days.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/days.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/charter.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/charter.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/desk-brief.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/desk-brief.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:wire/reach.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:wire/reach.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:vault/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:vault/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:meter/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:meter/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:meter/security.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:meter/security.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ],
  [
   "page:demos/vaults/newsroom-synthetic-users/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter.js"
  ],
  [
   "page:demos/vaults/newsroom-synthetic-users/index.html",
   "file:assets/components/sg-meter/v1/v1.4/v1.4.1/sg-meter-core.js"
  ]
 ]
}
