# The library: tool (98)

> Kept by incident.librarian@web-summit.dinis. Built by [`tools/library-index.mjs`](../../tools/library-index.mjs) on every push; nobody writes it by hand. Scripts the agents run. Back to [the library](../README.md) · every kind as data: [index.json](../index.json).

*By* is who the file itself says wrote or keeps it (the agents in its commits follow when they differ); *Changed* is the last commit (UTC) when known, else the file's own date; *Made from* is the sources its header names.

| File | What it is | By | Changed | Made from |
|---|---|---|---|---|
| [`admin/tools/release.sh`](https://github.com/PrompTugal/PrompTugal__News__Storm-Charles/blob/dev/admin/tools/release.sh) | Release from any agent's clone: AGENT=<name admin/tools/release.sh Commit your SOURCE changes first (subject "<agent: <what", trailers Agent:, Issue:, For:). This script rebases on dev, runs the gate … | *not said in the file*; commits: incident.conductor@ | 11-11 02:33 |  |
| [`admin/tools/render-pdf.cjs`](https://github.com/PrompTugal/PrompTugal__News__Storm-Charles/blob/dev/admin/tools/render-pdf.cjs) | Renders one built page to a PDF as the conductor does for Dinis (A4 landscape, backgrounds printed, the menu and the panel hidden). Usage: node admin/build/build.mjs && node … | *not said in the file*; commits: incident.conductor@ | 11-11 04:13 |  |
| [`incidents/2026-11-10-storm-charles/data/decisions/tools/primary_tries.py`](../../incidents/2026-11-10-storm-charles/data/decisions/tools/primary_tries.py) | One polite GET per primary page we could not read; records each try in entities/<entity.json "tries". | *not said in the file*; commits: incident.conductor@ | 11-11 02:21 |  |
| [`incidents/2026-11-10-storm-charles/data/weather/tools/refresh.py`](../../incidents/2026-11-10-storm-charles/data/weather/tools/refresh.py) | The weather picture for WS-214 (the storm, Wednesday 11 November 2026), as JSON. | *not said in the file*; commits: incident.conductor@ | 11-11 02:39 |  |
| [`tools/accounts-build.mjs`](../../tools/accounts-build.mjs) | The books: what this project costs, from what is written down in the repository. Kept by incident.accountant@web-summit.dinis (WS-214). node tools/accounts-build.mjs (run by the accountant each … | incident.accountant@ | 11-11 03:02 |  |
| [`tools/accounts-measure.mjs`](../../tools/accounts-measure.mjs) | What this agent's own session has used, in tokens, from its own transcript. Numbers only: no message text leaves the session. Kept by incident.accountant@web-summit.dinis (WS-214), adapted from … | incident.accountant@ | 11-11 05:41 |  |
| [`tools/agents-commits.mjs`](../../tools/agents-commits.mjs) | The last commits on dev as data: git log - data/agents/commits.json (kept by incident.observability@web-summit.dinis). node tools/agents-commits.mjs Who pushed what, when, and for whom (the Agent: … | incident.observability@ | 11-11 05:16 |  |
| [`tools/agents-index.mjs`](../../tools/agents-index.mjs) | The team's index: repository - data/agents/index.json (kept by incident.observability@web-summit.dinis). node tools/agents-index.mjs write it node tools/agents-index.mjs --check exit 1 if the … | incident.observability@ |  |  |
| [`tools/agents-ledger.mjs`](../../tools/agents-ledger.mjs) | The model ledger, as counts: this machine's ledger (tools/llm.mjs writes one line per model call to INCIDENT_LEDGER_DIR, default ~/.incident-ledger, never git) - data/agents/ledger/<role.json. Kept … | incident.observability@ | 11-10 23:54 |  |
| [`tools/agents-now.mjs`](../../tools/agents-now.mjs) | The team at work, now (kept by incident.observability@web-summit.dinis, 11 November 2026, WS-214). node tools/agents-now.mjs --out _site writes ONLY <out/data/agents/now.json: who pushed in the hour … | incident.observability@ | 2026-11-11 |  |
| [`tools/agents-pin.mjs`](../../tools/agents-pin.mjs) | Pinned copies of other teams' engines (kept by incident.observability@web-summit.dinis): copy named files, unchanged, from a checkout of their repository into app/agents/vendor/<name@<short commit/ … | incident.observability@ | 11-10 23:54 |  |
| [`tools/agents-release.mjs`](../../tools/agents-release.mjs) | incident.observability@'s release (a shell script kept in a .mjs, because this role's paths are tools/agents-.mjs): rebase on dev; if only generated data/agents/.json conflict, regenerate them; … | *not said in the file*; commits: incident.observability@ | 11-11 03:09 |  |
| [`tools/agents-sessions.mjs`](../../tools/agents-sessions.mjs) | Agent provenance: git log, the status files and data/keys.json - data/agents/sessions.json (kept by incident.observability@web-summit.dinis; RESTRUCTURE.md, "Agent provenance"; Dinis, 11 November … | incident.observability@ | 11-11 03:17 |  |
| [`tools/agents-views.mjs`](../../tools/agents-views.mjs) | Page views, as counts: the append lanes of vault zd1cb3kt - data/agents/views.json and stats/views.json in that vault (kept by incident.observability@web-summit.dinis). OBS_DRAIN_DIR=<the private … | incident.observability@ | 11-11 09:58 |  |
| [`tools/board-build.mjs`](../../tools/board-build.mjs) | The board: board/items/.json - <out/board/ (kept by incident.board@web-summit.dinis). node tools/board-build.mjs --out _site for the build: writes only <out/board/, never a tracked file node … | incident.board@ | 11-11 04:06 |  |
| [`tools/board-item.mjs`](../../tools/board-item.mjs) | Move a card on the board and record the move in its history (kept by incident.board@web-summit.dinis). node tools/board-item.mjs <id --state watching --change "what changed and where it was read" … | incident.board@ | 11-11 02:23 |  |
| [`tools/board-sync.mjs`](../../tools/board-sync.mjs) | Keep the board true to the agents' status files (kept by incident.board@web-summit.dinis). Run at each wake, before the cards are moved by hand; it does only the mechanical part and says what it did. … | incident.board@ | 11-11 03:04 |  |
| [`tools/brief-make.mjs`](../../tools/brief-make.mjs) | The decision brief, an edition at a time (incident.brief@web-summit.dinis, 11 November 2026). Reads brief/edition-<n.json (this edition's words and judgements) and the incident's data files as they … | incident.brief@ | 2026-11-11 |  |
| [`tools/brief-pdf.mjs`](../../tools/brief-pdf.mjs) | Renders the decision brief's PDFs from a BUILT site (incident.brief@web-summit.dinis, 11 November 2026), for incident.ci@'s cached step. node tools/brief-pdf.mjs --site _site --out <dir writes … | incident.brief@ | 2026-11-11 |  |
| [`tools/broadcast-coast.mjs`](../../tools/broadcast-coast.mjs) | incident.broadcast@web-summit.dinis: the coastline under the /broadcast/ wind map, cut once from Natural Earth's 1:50m land (public domain), read through the world-atlas package … | *not said in the file*; commits: incident.broadcast@ | 11-11 10:22 |  |
| [`tools/broadcast-field.mjs`](../../tools/broadcast-field.mjs) | incident.broadcast@web-summit.dinis: the wind and pressure field behind the /broadcast/ map. One request to Open-Meteo's forecast API (CC BY 4.0; its "best match" of national and ECMWF models) for a … | *not said in the file*; commits: incident.broadcast@ | 11-11 10:28 |  |
| [`tools/capture-pages.mjs`](../../tools/capture-pages.mjs) | capture-pages.mjs: the page of every capture, made at build time from the records in git. node tools/capture-pages.mjs --out <dir writes <dir/evidence/<id.md for each evidence/<id.json (the build … | *not said in the file*; commits: incident.archivist@ | 11-11 04:32 |  |
| [`tools/capture-records.mjs`](../../tools/capture-records.mjs) | capture-records.mjs: from the captures kept outside git (tools/capture.mjs) to the records in git and the files in the vaults. node tools/capture-records.mjs [--in DIR] [--capture-vault DIR] … | *not said in the file*; commits: incident.archivist@ | 11-11 09:27 |  |
| [`tools/capture.mjs`](../../tools/capture.mjs) | capture.mjs: what an outside page looked like when we read it. node tools/capture.mjs <url [<url ...] [--list file.json] [--out DIR] [--gap 4] [--frame 1280x1600] For each address, one at a time and … | *not said in the file*; commits: incident.archivist@ | 11-11 04:28 |  |
| [`tools/ci-read.mjs`](../../tools/ci-read.mjs) | The pipeline and the repository as data (kept by incident.ci@web-summit.dinis, WS-214). node tools/ci-read.mjs read GitHub's Actions API and this clone's history, write data/ci/ node … | incident.ci@ | 11-11 05:48 |  |
| [`tools/ci-release-record.mjs`](../../tools/ci-release-record.mjs) | The signed release record (incident.ci@web-summit.dinis; the proposal: ci/signing.md). NOT wired in yet: it waits for Dinis's yes. AGENT=<name node tools/ci-release-record.mjs --write write … | incident.ci@ | 11-11 02:36 |  |
| [`tools/desk-drain.mjs`](../../tools/desk-drain.mjs) | desk-drain.mjs: the contact desk's drain (incident.desk@web-summit.dinis; desk/README.md says how the desk works). node tools/desk-drain.mjs [--no-push] drain the lanes, keep each message in the … | incident.desk@ |  |  |
| [`tools/ds-ensemble.mjs`](../../tools/ds-ensemble.mjs) | incident.datascience@web-summit.dinis: where the storm's centre crosses Lisbon's meridian in each of the 51 ECMWF ensemble forecasts (control + 50 members), and Lisbon's model gusts, via Open-Meteo's … | *not said* |  |  |
| [`tools/ds-exposure.mjs`](../../tools/ds-exposure.mjs) | incident.datascience@web-summit.dinis: residents under each IPMA warning level, by warning area and hour. Usage: node tools/ds-exposure.mjs [--warnings <file] [--read-utc <iso] without --warnings it … | *not said* |  |  |
| [`tools/ds-tides.mjs`](../../tools/ds-tides.mjs) | incident.datascience@web-summit.dinis: high and low water at Cascais (Tagus mouth), Lisbon and Funchal, from Open-Meteo's Marine API (a model, CC BY 4.0), with wave height. Instituto Hidrográfico's … | *not said* |  |  |
| [`tools/entities-build.mjs`](../../tools/entities-build.mjs) | entities-build: the pages of the mini Wikipedia, and the linker (incident.entities@web-summit.dinis). node tools/entities-build.mjs --out <dir writes <dir/entities/.md (a page per node, an index per … | incident.entities@ | 11-11 08:50 |  |
| [`tools/entities-check.mjs`](../../tools/entities-check.mjs) | entities-check: what incident.entities@ runs before every release, in one chain with the gate and release.sh: node tools/entities-check.mjs && node admin/build/validate.mjs && AGENT=... … | *not said in the file*; commits: incident.entities@ | 11-11 02:39 |  |
| [`tools/entities-lib.mjs`](../../tools/entities-lib.mjs) | Shared by tools/entities-make.mjs and tools/entities-build.mjs (incident.entities@web-summit.dinis): reading the nodes and matching their names in text. Zero dependencies. | incident.entities@ | 11-11 05:24 |  |
| [`tools/entities-link.mjs`](../../tools/entities-link.mjs) | entities-link: the linker, as the build's "after" step (admin/build/generators.json): node tools/entities-link.mjs --out <dir. It is tools/entities-build.mjs --out <dir --link: one tool, two moments … | *not said in the file*; commits: incident.entities@ | 11-11 02:23 |  |
| [`tools/entities-make.mjs`](../../tools/entities-make.mjs) | entities-make: the nodes of the mini Wikipedia, from what the incident already holds (incident.entities@web-summit.dinis). node tools/entities-make.mjs writes entities/<type/<id.json and … | incident.entities@ | 11-11 08:44 |  |
| [`tools/flows-build.mjs`](../../tools/flows-build.mjs) | Flows, built from the record (incident.motion@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~10:10 UTC, BRIEF.md). node tools/flows-build.mjs --out _site writes, ONLY under <out/data/flows/ and … | incident.motion@ | 11-11 10:27 |  |
| [`tools/graph-build.mjs`](../../tools/graph-build.mjs) | The graph of an incident, built from its JSON files and never by hand (incident.graph@web-summit.dinis). node tools/graph-build.mjs [incidents/<id] writes data/graph/storm.json and … | incident.graph@ | 11-11 10:45 |  |
| [`tools/graph-places.mjs`](../../tools/graph-places.mjs) | IPMA's warning areas, by code: node tools/graph-places.mjs <the file fetched from IPMA <UTC time read Reads IPMA's own list (https://api.ipma.pt/open-data/distrits-islands.json), keeps one row per … | *not said in the file*; commits: incident.graph@ | 11-11 00:29 |  |
| [`tools/ipma-pages.mjs`](../../tools/ipma-pages.mjs) | Write the IPMA section's pages (sources/ipma/.md and endpoints/.md) from api.json, latest.json, reads.json and data/. node tools/ipma-pages.mjs Each page is markdown an agent can read whole (tables … | incident.ipma@ | 11-11 02:36 |  |
| [`tools/ipma-read.mjs`](../../tools/ipma-read.mjs) | Read IPMA's open data (https://api.ipma.pt/open-data/), politely, and keep what was read. node tools/ipma-read.mjs [--store DIR] [--only id,id] [--gap ms] [--crawl] - The endpoints come from … | *not said in the file*; commits: incident.ipma@ | 11-11 02:31 |  |
| [`tools/ipma-round.mjs`](../../tools/ipma-round.mjs) | One round on IPMA's open data: read, keep, derive, write the pages. node tools/ipma-round.mjs [--store DIR] [--crawl] [--no-read] 1. tools/ipma-read.mjs (politely; hashes and changes into … | *not said in the file*; commits: incident.ipma@ | 11-11 02:31 |  |
| [`tools/ipma-views.mjs`](../../tools/ipma-views.mjs) | From the latest read of IPMA's open data (the store that tools/ipma-read.mjs fills) to the small files the pages draw: node tools/ipma-views.mjs [--store DIR] Writes sources/ipma/data/.json (each … | incident.ipma@ | 11-11 02:42 |  |
| [`tools/journal-build.mjs`](../../tools/journal-build.mjs) | The journal, generated from its pieces (incident.journalist@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~02:50 UTC: "meta reporter and meta journalist: reporting on how this project actually … | incident.journalist@ | 11-11 03:11 |  |
| [`tools/labs-check.mjs`](../../tools/labs-check.mjs) | The Labs' browser check (incident.labs@web-summit.dinis). Opens every experiment of a built site in a headless browser, wide and narrow, and checks what the gate cannot: the page drew marks, nothing … | incident.labs@ | 11-11 06:50 |  |
| [`tools/lane-common.mjs`](../../tools/lane-common.mjs) | lane-common.mjs: what the lane tools share (incident.identity@web-summit.dinis; the design is SECURITY.md). The same pinned pki.sgit.ai modules the browser runs (app/login/pki/), over Node's Web … | incident.identity@ | 11-11 09:34 |  |
| [`tools/lane-configure.mjs`](../../tools/lane-configure.mjs) | lane-configure.mjs: open the feedback lane on an existing vault (the bridge vault). It does not create the vault. SG_SEND_ACCESS_TOKEN=<access token LANE_VAULT_KEY=<the vault's key node … | *not said in the file*; commits: incident.identity@ | 11-11 09:34 |  |
| [`tools/lane-drain.mjs`](../../tools/lane-drain.mjs) | lane-drain.mjs: the conductor's drain, each wake. Lists the lane (metadata only), fetches what is pending, opens each message with this agent's key, judges it (lane-common.mjs judge), prints one JSON … | *not said in the file*; commits: incident.identity@ | 11-11 09:39 |  |
| [`tools/lane-e2e.mjs`](../../tools/lane-e2e.mjs) | lane-e2e.mjs: the login and the lane in a real browser (Chromium through Playwright, which is not a dependency of this repository: the test says so and stops where it is not installed). Throwaway … | *not said in the file*; commits: incident.identity@ | 11-11 03:23 |  |
| [`tools/lane-frame.mjs`](../../tools/lane-frame.mjs) | lane-frame.mjs: copy the site frame's notice and footer caption into account/index.html (its menu and breadcrumb are filled by the build itself, from the <!--menu:…-- and <!--crumbs-- marks the page … | *not said in the file*; commits: incident.identity@ | 11-11 03:23 |  |
| [`tools/lane-handover.mjs`](../../tools/lane-handover.mjs) | lane-handover.mjs: hand a vault key to another agent (the conductor) without the key ever being readable on the way. VAULT_KEY=<the vault's key node tools/lane-handover.mjs seal [--to … | *not said in the file*; commits: incident.identity@ | 11-11 09:34 |  |
| [`tools/lane-keys.mjs`](../../tools/lane-keys.mjs) | lane-keys.mjs: the key list, checked (incident.identity@web-summit.dinis). Reads data/keys.json only; needs no key. node tools/lane-keys.mjs one line per problem, then a count; exit 1 if any entry is … | incident.identity@ | 11-11 05:47 |  |
| [`tools/lane-open.mjs`](../../tools/lane-open.mjs) | lane-open.mjs: open what Dinis sealed to this agent, and judge it. One JSON line per message. node tools/lane-open.mjs <m1 code \| file holding one [...] (or the text on stdin) "accept": true only for … | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`tools/lane-seal.mjs`](../../tools/lane-seal.mjs) | lane-seal.mjs: the reverse path. Sign with this agent's key, seal to a key in data/keys.json (Dinis's), 7 days by default. node tools/lane-seal.mjs --to <key id --text "…" [--subject S] [--expires … | *not said in the file*; commits: incident.identity@ | 11-10 23:47 |  |
| [`tools/lane-sign.mjs`](../../tools/lane-sign.mjs) | lane-sign.mjs: this agent signs the files that say what is safe, so a reader can check who wrote the bytes they read. node tools/lane-sign.mjs sign the files below with this agent's session key → … | *not said in the file*; commits: incident.identity@ | 11-11 00:22 |  |
| [`tools/lane-test.mjs`](../../tools/lane-test.mjs) | lane-test.mjs: the lane, end to end, with throwaway keys made here and thrown away (nothing is written to a key store). node tools/lane-test.mjs 1. the pinned pki.sgit.ai copies are byte for byte … | *not said in the file*; commits: incident.identity@ | 11-11 09:34 |  |
| [`tools/library-abp.mjs`](../../tools/library-abp.mjs) | The agents' behaviour policies, as drafts (incident.librarian@web-summit.dinis, 11 November 2026, WS-214, at incident.conductor@'s ask). One agents/<role/policy.md per agent in agents/policy.json, in … | incident.librarian@ | 11-11 00:45 |  |
| [`tools/library-index.mjs`](../../tools/library-index.mjs) | The library's catalogue (incident.librarian@web-summit.dinis, 10 November 2026, WS-214; Dinis's direction ~23:40: "all information, all documents, all briefs should be on the site"; "provenance, … | incident.librarian@ | 11-11 04:18 |  |
| [`tools/library-news.mjs`](../../tools/library-news.mjs) | What changed in a release window, as data (incident.librarian@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~02:10 UTC: "every time you push a change you need to create a new article ... not … | incident.librarian@ | 11-11 02:47 |  |
| [`tools/library-pack.mjs`](../../tools/library-pack.mjs) | The briefing pack (incident.librarian@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~02:50 UTC: "we should make it much cheaper if another agent wanted to capture all this. The whole idea that … | incident.librarian@ | 2026-11-11 |  |
| [`tools/library-reading.mjs`](../../tools/library-reading.mjs) | library/reading/reading.json - library/reading/README.md (incident.librarian@web-summit.dinis, 10 November 2026, WS-214). The reading list is kept as data (one entry per article: URL, its argument, … | incident.librarian@ | 11-10 23:47 |  |
| [`tools/library-releases.mjs`](../../tools/library-releases.mjs) | The release history (incident.librarian@web-summit.dinis, 10 November 2026, WS-214, at incident.conductor@'s ask; the estate's standard asks for "one sentence per release"; the reading list: "Green … | incident.librarian@ | 11-11 02:47 |  |
| [`tools/library-view.mjs`](../../tools/library-view.mjs) | The file viewer's page (incident.librarian@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~02:10 UTC: "every one of these JSON files, I need to be able to visualise it ... go down the rabbit hole … | incident.librarian@ | 11-11 02:25 |  |
| [`tools/llm.mjs`](../../tools/llm.mjs) | The model ledger's one wrapper (incident.dev@web-summit.dinis, 10 November 2026, WS-214; ROADMAP P0.4, Dinis's direction ~19:15): every model call the incident team makes goes through call() here, … | incident.dev@ (commits: incident.conductor@, incident.models@) | 11-11 03:06 |  |
| [`tools/meteorology-build.mjs`](../../tools/meteorology-build.mjs) | incident.meteorology@web-summit.dinis: the meteorology section's pages, from its data. node tools/meteorology-build.mjs --out _site Reads … | *not said in the file*; commits: incident.meteorology@ | 11-11 05:23 |  |
| [`tools/meteorology-read.mjs`](../../tools/meteorology-read.mjs) | incident.meteorology@web-summit.dinis: read the page each lineage edge and licence cites, and stamp what was found. node tools/meteorology-read.mjs [--only <substring of from/to/id] [--stale] For … | *not said in the file*; commits: incident.meteorology@ | 11-11 02:58 |  |
| [`tools/meteorology-render.mjs`](../../tools/meteorology-render.mjs) | incident.meteorology@web-summit.dinis: the text of a page that only exists after its scripts run (used by meteorology-read.mjs for items marked "render": true). node tools/meteorology-render.mjs <url … | *not said in the file*; commits: incident.meteorology@ | 11-11 11:36 |  |
| [`tools/models-ask.mjs`](../../tools/models-ask.mjs) | Ask a model one question through the ledger (incident.models@web-summit.dinis, WS-214): the call other desks use, first incident.shadow@ for answer engines with search. Every call is stored raw … | incident.models@ | 11-11 02:36 |  |
| [`tools/models-items.mjs`](../../tools/models-items.mjs) | The eval items (incident.models@web-summit.dinis, WS-214): node tools/models-items.mjs Writes models/evals/<task/items.json for the four first tasks. Every gold answer is COPIED from the data room … | incident.models@ | 11-11 03:00 |  |
| [`tools/models-prompts.mjs`](../../tools/models-prompts.mjs) | The instructions of the evals (incident.models@web-summit.dinis, WS-214): one per task, the same for every model. models-run.mjs sends them; models-report.mjs prints them on each task's page. | incident.models@ | 11-11 03:00 |  |
| [`tools/models-report.mjs`](../../tools/models-report.mjs) | The report (incident.models@web-summit.dinis, WS-214): node tools/models-report.mjs From models/evals/<task/items.json and results/<model.json, models/evals/models.json and licences.json, … | incident.models@ | 11-11 03:06 |  |
| [`tools/models-run.mjs`](../../tools/models-run.mjs) | Run the evals (incident.models@web-summit.dinis, WS-214): every call through tools/llm.mjs, so each is stored and counted. node tools/models-run.mjs [--task extract-warning,label] [--models id,id] … | incident.models@ | 11-11 03:06 |  |
| [`tools/perplexity-ask.mjs`](../../tools/perplexity-ask.mjs) | Perplexity as a research tool, step 1: ask one of the team's open questions and keep what comes back as data (incident.perplexity@web-summit.dinis, 11 November 2026, WS-214; Dinis's direction of … | incident.perplexity@ | 11-11 03:03 |  |
| [`tools/perplexity-check.mjs`](../../tools/perplexity-check.mjs) | Perplexity as a research tool, step 2: open the addresses an engine cited, one at a time, so a person or agent can read whether the page says what the engine said it says … | incident.perplexity@ | 11-11 05:27 |  |
| [`tools/perplexity-index.mjs`](../../tools/perplexity-index.mjs) | Perplexity as a research tool, step 3: from the checked run files, the scorecard, the leads and the page (incident.perplexity@web-summit.dinis, 11 November 2026, WS-214). node … | incident.perplexity@ | 11-11 03:03 |  |
| [`tools/perplexity-status.mjs`](../../tools/perplexity-status.mjs) | Perplexity as a research tool: the desk's day, counted (incident.perplexity@web-summit.dinis, WS-214). node tools/perplexity-status.mjs writes research/perplexity/ledger-summary.json from this … | incident.perplexity@ | 11-11 03:01 |  |
| [`tools/policy-check.mjs`](../../tools/policy-check.mjs) | The path policy's check (incident.librarian@web-summit.dinis, 10 November 2026, WS-214, at incident.conductor@'s ask; from the reading list: "Behaviour policies" on newsroom.sgit.ai, where the reach … | incident.librarian@ | 11-11 03:13 |  |
| [`tools/reporter-fill.mjs`](../../tools/reporter-fill.mjs) | incident.reporter@web-summit.dinis: fills and checks the traces in reporter/traces/.json from the record. Run by the reporter at each wake in a full clone (git fetch --tags first); never by the build … | *not said in the file*; commits: incident.reporter@ | 11-11 03:04 |  |
| [`tools/reporter-numbers.mjs`](../../tools/reporter-numbers.mjs) | incident.reporter@web-summit.dinis: reporter/numbers.json, the project counted by hour (UTC) from the data others keep. Nothing is recounted from git or by hand: every figure names the file it came … | *not said in the file*; commits: incident.reporter@ | 11-11 04:05 |  |
| [`tools/shadow-ask.mjs`](../../tools/shadow-ask.mjs) | Shadow reporting, step 1: ask the answer engines what a reader would ask, and keep what they say as data (incident.shadow@web-summit.dinis, 11 November 2026, WS-214; Dinis's direction of ~02:20 UTC, … | incident.shadow@ | 11-11 04:06 |  |
| [`tools/shadow-index.mjs`](../../tools/shadow-index.mjs) | Shadow reporting, step 2: from shadow/runs/<date/<hour.json (the answers, split and compared by the agent) make the page and its data: shadow/index.md hour by hour, per question: what a reader was … | incident.shadow@ | 11-11 03:06 |  |
| [`tools/social-accounts.mjs`](../../tools/social-accounts.mjs) | A page per listed social account (incident.social@web-summit.dinis). A build generator: node tools/social-accounts.mjs --out <dir Writes <dir/research/social/accounts/<handle.md (the build renders … | incident.social@ | 11-11 04:31 |  |
| [`tools/social-mastodon.mjs`](../../tools/social-mastodon.mjs) | Mastodon, read as data (incident.social@web-summit.dinis). Node 18+, no account, public endpoints, 3 s between requests. node tools/social-mastodon.mjs - research/social/mastodon.json Same rule as … | incident.social@ | 11-11 03:29 |  |
| [`tools/social-page.mjs`](../../tools/social-page.mjs) | Writes research/social/index.md from the data tools/social-read.mjs keeps (incident.social@web-summit.dinis). Run by hand after a read: node tools/social-page.mjs (not a build generator: the build … | incident.social@ | 11-11 05:40 |  |
| [`tools/social-read.mjs`](../../tools/social-read.mjs) | Bluesky, read as data (incident.social@web-summit.dinis). Node 18+, no dependencies, no account, no login. node tools/social-read.mjs reads every account in research/social/accounts.json, then the … | incident.social@ | 11-11 05:40 |  |
| [`tools/source-index.mjs`](../../tools/source-index.mjs) | The index of sources: from the hand-kept register (sources/registry.json) and what the site already cites, write sources/sources.json every body with its counts (timeline rows citing it; addresses of … | incident.sources@ | 11-11 05:27 |  |
| [`tools/source-meteoalarm.mjs`](../../tools/source-meteoalarm.mjs) | The MeteoAlarm reader: one polite read of a country's warning feed, kept as a dated record with a compact diff. node tools/source-meteoalarm.mjs # Portugal: read, diff against the previous read, … | *not said in the file*; commits: incident.sources@ | 11-11 02:28 |  |
| [`tools/source-pages.mjs`](../../tools/source-pages.mjs) | A small page and a source.json for every body in the register that has no folder of its own yet, so each body has one address (sources/<id/) that a row, an entity or the index can land on. A … | incident.sources@ | 11-11 06:27 |  |
| [`tools/stories-build.mjs`](../../tools/stories-build.mjs) | Stories, generated from their graphs (incident.stories@web-summit.dinis, 11 November 2026, WS-214; Dinis, ~02:20 UTC: "a complete data-driven story ... every thing needs to be hyperlinked ... but you … | incident.stories@ | 2026-11-11 |  |
| [`tools/sync-from-websummit.sh`](../../tools/sync-from-websummit.sh) | Temporary bridge (10 November 2026): until the incident agents' sessions can push here, they keep writing data/ and their status files in SGit-AI__Website__Web-Summit team/incidents/ (its MOVED.md); … | *not said in the file*; commits: incident.conductor@ | 11-10 21:37 |  |
| [`tools/timeline.mjs`](../../tools/timeline.mjs) | timeline.md - signals.json (incident.dev@web-summit.dinis, 10 November 2026, WS-214). The lead keeps the timeline as a markdown table (UTC \| Signal or decision \| Source); this turns just that table … | incident.dev@ (commits: incident.conductor@) | 11-11 09:24 |  |
| [`tools/transport-gtfs.mjs`](../../tools/transport-gtfs.mjs) | Kept by incident.transport@web-summit.dinis, 11 November 2026, 12:13 UTC Metro de Lisboa's published timetable (GTFS, dados.gov.pt, CC BY) - trips scheduled per hour per line for given days. The zip … | incident.transport@ | 11-11 12:13 |  |
| [`tools/transport-read.mjs`](../../tools/transport-read.mjs) | Read open transport sources for Storm Charles, politely, and write small JSON to the data room. node tools/transport-read.mjs [--store DIR] [--dry] - Flights: OpenSky Network's public REST API … | *not said* |  |  |
| [`tools/weather-check.mjs`](../../tools/weather-check.mjs) | The Weather face's own rule, checked (incident.weather@web-summit.dinis): app/weather/ reads only what the data room publishes. 1. every fetch() in app/weather/.js takes its address from the FILES … | incident.weather@ |  |  |
| [`tools/websummit-poll.sh`](../../tools/websummit-poll.sh) | The 2-minute blog poll (incident.dev@web-summit.dinis, 10 November 2026, WS-214; incident.researcher@'s ask via the lead, 21:03). Rewritten at 21:30 after security.repos@'s MEDIUM (report … | incident.dev@ (commits: incident.conductor@) | 11-10 21:18 |  |
| [`tools/websummit.mjs`](../../tools/websummit.mjs) | Web Summit's own channels, watched for the decision everyone waits for (incident.dev@web-summit.dinis, 10 November 2026, WS-214; incident.researcher@'s parser asks in decisions/sources.json: … | incident.dev@ (commits: incident.conductor@) | 11-10 21:37 |  |
| [`tools/wikipedia-claims.mjs`](../../tools/wikipedia-claims.mjs) | From the hand-kept research/wikipedia/claims-curated.json and the stored wikitext of each revision (outside git, put there by tools/wikipedia-read.mjs), writes: claims.json (each statement with the … | *not said in the file*; commits: incident.wikipedia@ | 11-11 02:01 |  |
| [`tools/wikipedia-lib.mjs`](../../tools/wikipedia-lib.mjs) | The polite reader every tools/wikipedia-.mjs shares. Read-only: nothing here edits or posts to Wikipedia. One request at a time, at least GAP ms apart, the action API with maxlag=5; a 429 or a maxlag … | *not said in the file*; commits: incident.wikipedia@ | 11-11 01:43 |  |
| [`tools/wikipedia-read.mjs`](../../tools/wikipedia-read.mjs) | Reads Wikipedia on Storm Charles and APPENDS: node tools/wikipedia-read.mjs (run on every wake; read-only on Wikipedia) 1. finds every article, section, redirect and mention in every language … | *not said in the file*; commits: incident.wikipedia@ | 11-11 10:55 |  |
