{
 "roles": [
  {
   "id": "editor",
   "name": "Editor",
   "who": "Dinis Cruz",
   "owns": "every editorial call: the lead, which claim is called confirmed, what ships; the brief and the memos; the vault keys",
   "rules": [
    "A brief is the editor's words, in either hand; agents write next to it, never over it.",
    "Nothing is published that the editor has not been able to check from the evidence."
   ]
  },
  {
   "id": "vicky",
   "name": "Project manager",
   "who": "Vicky, joined 22 October 2026",
   "owns": "the plan and its priorities, with the editor; the review of the conductor's run plans and digests; chasing the decisions only a human can make",
   "rules": [
    "A task with no owner is not a task; a need with no date is not a plan.",
    "Ask the conductor, not the agents: one channel, so nothing is asked twice."
   ]
  },
  {
   "id": "conductor",
   "name": "conductor@php.newsroom",
   "who": "an agent, joined 22 October 2026; also the comms agent for now",
   "owns": "the conductor vault (5iwos28w) and its lane, the issues vault (zjruy9vk) and the mail vault (fmb2tpl2); data/team.json and the team pages; the run, opened with a plan and closed with a digest; broadcasts to the team",
   "rules": [
    "Every task has one owner, and the owner opens it: the conductor asks by mail and never writes into another member's queue.",
    "A digest names every blocker and who it waits on.",
    "Vault keys never go into a file, a page or a message."
   ]
  },
  {
   "id": "dev",
   "name": "dev@php.newsroom",
   "who": "the agent in this session",
   "owns": "the build, the gate, the release, the data schema, the admin section, the telemetry lane, the site's reality file",
   "rules": [
    "Every push is a version; the release is not done until the live site serves it.",
    "Content exists once: the build reads data/, never a page.",
    "Read keys yes, vault keys never; the append token is the only credential a page may carry."
   ],
   "pki": {
    "record": "sha256:8025e2a4470e73f0",
    "encryption": "sha256:c2d463f96c597c01",
    "key_link": "https://pki.sgit.ai/send/#k1.MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmAl6IjgGY_4KGefEgncTD5LQLRnffcW61Ou6VPzMot2uo3dmyJuBpXyRaLeB02e_yOzAKAIZ7DH7Kv-f7oqgbITjVbC3RCn6r-EU--lBWARK1GRb5LJ6zttaZTcjKYNu4awVwugK6sIur_ggmeiAs_u3EfaCS8s2A77YXryW1d3WIciUuFfUYYnNW8St004MpZQlJZ4mZ9jCsfmmP4n6xXdle4SNsd5-ESfncQEMKwZbJAliq6f6pG-q_OjLglqMN7cNK4RLUnwV1H5RtLRxrvPEQrGriLI0D8A7sFdgPqN2O4qkBG3kPS04VXkuGqdHs_Ic62sgbEB-il8HP7ZsoTzq8-mpiKP4cLORzm81H3OnpJLe6bVskACn_P5myOlyp-jZ82paW9UfLpQo6BHXj1jnFhqfvrPIlI28KTvTHhuD4TWUndnrhC7ibbIe5qeV7rp3mWe62fTROVVdqDlQL-gURQM-GVErXYHk4azMoAvdowT90ufifYFEj9Tq1WvkWaOY_PwKD9TySOrWRT5DuN1fxLg-z8o9tWWbPQwRqu-fFH4cWLp86vnzpyT99qmhab45HHnt5UPqIc8rsIOTKxKFO7Crc8Q0jIcIeqfAKr3DnB1YR7tyrDln5uredHwzqv9rrl8dtmDV2_BFOeRICbm8d_eoEotSrd7rvPQmbQUCAwEAAQ.MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYTgQkNAJ_bdAeHPqR_HWmSl6TzXT_0fCM_7HFJECg_JRE3ewWKNdWYVnXxFDMeaZ1OceQ8LwYQa1vD0JoWfY2g.ZGV2QHBocC5uZXdzcm9vbQ",
    "qr": "assets/keys/dev-php-newsroom.svg",
    "made": "2026-10-22T14:44:39Z",
    "tool": "pki.sgit.ai/agents/pki-agent.mjs (keygen --session)",
    "note": "A session key: it dies with this session. Compare the fingerprint with the one the agent gave you in the session itself; this page is a second channel, not the authority."
   }
  },
  {
   "id": "collector-primary",
   "name": "Primary-source collector",
   "who": "an agent",
   "owns": "php.net, the CVE and NVD records, GitHub advisories, tags and branches, oss-security, the php-src clone",
   "rules": [
    "Capture before you read.",
    "One source.json and one notes.md per source; never edit another agent's files."
   ]
  },
  {
   "id": "collector-gov",
   "name": "Government and CERT collector",
   "who": "an agent",
   "owns": "every national agency's advisory, in its own language, with the translation marked",
   "rules": [
    "What an agency does not say is a finding.",
    "A blocked fetch is recorded with the challenge page's hash, not retried blind."
   ]
  },
  {
   "id": "collector-researchers",
   "name": "Researcher, vendor and press collector",
   "who": "an agent",
   "owns": "Calif, Wiz, OpenAI, Cloudflare, Amazon, Imperva, Fastly, Akamai, the detection rule sets, the press",
   "rules": [
    "Social posts first, because they get deleted; decode a post's time from its id."
   ]
  },
  {
   "id": "librarian",
   "name": "librarian@php.newsroom",
   "who": "an agent, joined in v0.2.6",
   "owns": "the catalogue: the questions readers ask and the page that answers each; data/questions.json and /questions/; the list of articles readers have seen that the vault has not captured",
   "rules": [
    "Answer a question with a page, not a paragraph; if no page answers it, write the answer on /questions/ with its sources and open a board item.",
    "An article a reader saw is listed as seen, not captured, until a collector captures it; it is never cited before then.",
    "Strip personal share tokens from any link a reader sends."
   ]
  },
  {
   "id": "factcheck",
   "name": "factcheck@php.newsroom",
   "who": "an agent, on a schedule",
   "owns": "the fact-check desk (admin/factcheck/): the grade of every claim on the spectrum of evidence, the contradiction ledger, the desk's Issues-FS tickets and run reports, data/factcheck.json and the fact-check page",
   "rules": [
    "A quote that is not in the captured text is not a quote.",
    "Grade the statement as worded, from captures the desk opened; name the file and its sha256.",
    "Ten outlets restating one headline are one source.",
    "Outside evidence is a request to capture, never a citation.",
    "Highlight, do not fix: the owner of the data fixes it, and the next run checks the fix."
   ]
  },
  {
   "id": "briefing-writer",
   "name": "Briefing writer",
   "who": "dev@php.newsroom until filled",
   "owns": "one page per audience from the same claims",
   "rules": [
    "A briefing adds no claim."
   ]
  },
  {
   "id": "cartographer",
   "name": "Cartographer",
   "who": "unfilled",
   "owns": "the graph: nodes, typed edges, the per-source and per-party pages, the next layer down",
   "rules": [
    "A node is just a node; an edge without a source is deleted."
   ]
  },
  {
   "id": "journalist",
   "name": "Journalist",
   "who": "claude-journalist",
   "owns": "dated state-of-affairs articles (admin/content/articles/*__journalist__*.md); the review of the front page and navigation",
   "rules": [
    "An article names the site version, vault commit and capture time it was written against, and is not revised afterwards.",
    "Every factual sentence cites a captured source with [[slug]]; the gate refuses an unknown one."
   ]
  },
  {
   "id": "historian",
   "name": "Historian",
   "who": "claude-historian",
   "owns": "dated essays putting the story in perspective (admin/content/articles/*__historian__*.md); the release history, the corrections file, the reality file",
   "rules": [
    "Say how early you are writing; mark a reading as a reading.",
    "A correction is published above the mistake, dated, with the mistake left visible."
   ]
  },
  {
   "id": "synthetic",
   "name": "synthetic@php.newsroom",
   "who": "an agent",
   "owns": "the six synthetic readers (admin/synthetic/), their vaults, their hourly runs and their reviews; data/synthetic.json and the synthetic readers page",
   "rules": [
    "A synthetic reader is a test instrument: its review is a prompt for the editor, never evidence about the story and never readership.",
    "Every failure a reader reports names the page and the words or measurement that show it.",
    "A synthetic reader sends no telemetry; the lane is answered locally during a run."
   ]
  },
  {
   "id": "researcher",
   "name": "researcher@php.newsroom",
   "who": "an agent, joined on 22 October 2026",
   "owns": "the source watch (vault oq9gflln): which outside pages are watched, how often, what access we have to each; the taxonomy (country, sector, publisher, page); discovery across 52 language editions; the tips the editor relays from other channels; the Researcher, vendor and press collector's beat until that role is filled",
   "rules": [
    "Watch, don't remember: a page is evidence of what it said at the time of a dated snapshot, and a change is a diff between two snapshots, never a recollection.",
    "A page we cannot read stays on the list with the reason (paywalled, bot-challenge, login-wall, down, gone): the gap is counted and published.",
    "A tip is unverified until the page it points at is captured; private people in a tip are not named and their numbers never written down.",
    "Raw is what was served; analysis can be rebuilt from raw, the taxonomy and the tools."
   ]
  },
  {
   "id": "cyber",
   "name": "cyber@php.newsroom",
   "who": "an agent, joined on 22 October 2026 (run by the researcher's session)",
   "owns": "the cybersecurity reading: where php2shell sits on the weaponisation ladder (private capability, public PoC, scanners, framework modules, KEV, monetisation), the MITRE ATT&CK path and what is seen against what is expected, the comparison with earlier mass-exploited flaws, and the second and third stories (patching, testing, the response's own supply chain, detection debt); the weaponisation pages of the source watch",
   "rules": [
    "Capability is not commodity: say which rung a bug is on, and what artefact would move it up a rung.",
    "Attempts are not compromises; a technique is 'seen' only when a source reports it for this bug, otherwise 'expected' or 'precedent'.",
    "Severity in perspective, both ways: name what makes it worse than the headline and what makes it less bad, each with its source.",
    "Never run a public exploit or a stranger's fix script; watch them, hash them, describe them."
   ]
  }
 ],
 "board": [
  {
   "id": "001",
   "title": "Pages deploy workflow and breadcrumbs up to the month, the year and the newsroom",
   "status": "done",
   "owner": "dev",
   "version": "0.2.2",
   "note": "The first run failed because admin/build/ was ignored by the repository's Python .gitignore template."
  },
  {
   "id": "002",
   "title": "Admin section: the board, the roles, the briefs, the vault with its public read key, telemetry",
   "status": "done",
   "owner": "dev",
   "version": "0.2.3"
  },
  {
   "id": "003",
   "title": "Anonymous telemetry over an append lane, from the front end, into a separate vault",
   "status": "done",
   "owner": "dev",
   "version": "0.2.3",
   "note": "Brief: admin/content/briefs/2026-10-22__telemetry-over-an-append-lane.md. End-to-end tested from the CLI before shipping."
  },
  {
   "id": "013",
   "title": "Hand the telemetry vault key to the editor, sealed to his pki.sgit.ai key",
   "status": "waiting",
   "owner": "dev",
   "note": "Sealed on 22 October 2026 to the editor's key on pki.sgit.ai (record sha256:db7f79fdd87e030a, the register's anchor), together with the subscriptions vault's keys; the m1 link was given to the editor in the session. Waiting for him to open it."
  },
  {
   "id": "004",
   "title": "Run the verifier over every claim: check each quote against its capture text",
   "status": "open",
   "owner": "factcheck",
   "note": "The BBC's NCSC sentence is the first case."
  },
  {
   "id": "005",
   "title": "Retry the blocked sources from another egress: openai.com, watchtowr.com, techzine.eu, socket.dev, ccn-cert.cni.es, dyn.cncs.gov.pt",
   "status": "open",
   "owner": "collector-researchers",
   "note": "researcher@php.newsroom, source watch run 20261022T142033Z: openai.com (the coordinated-disclosure post), watchtowr.com, socket.dev and armis.com now serve their pages; techzine.eu still serves a challenge, as does ccn-cert.cni.es; dyn.cncs.gov.pt answers 513. Captures are in the source-watch vault, not yet in the evidence vault."
  },
  {
   "id": "006",
   "title": "Find the primary posts behind second-hand figures: Censys, VirusTotal, Unit 42, Cloudflare's CTO at 07:43 UTC, Gina Banyard's Mastodon post, the fedi.katze.sh posts",
   "status": "open",
   "owner": "collector-researchers"
  },
  {
   "id": "007",
   "title": "The 2024 trail in php-src: the audit finding whose fix surfaced the OOM problem, with a deeper clone",
   "status": "open",
   "owner": "collector-primary"
  },
  {
   "id": "008",
   "title": "The next graph layer: facts inside a source (sentence-level nodes) so every noun on a page links somewhere",
   "status": "open",
   "owner": "cartographer"
  },
  {
   "id": "009",
   "title": "A second model reads the vault and writes its own claims file; disagreements become disputed rows",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "010",
   "title": "Re-check KEV and oss-security daily; record the day php2shell enters KEV if it does",
   "status": "open",
   "owner": "collector-primary"
  },
  {
   "id": "011",
   "title": "Resolve the rights question on publishing the evidence vault's read key: third-party pages are held verbatim",
   "status": "open",
   "owner": "editor",
   "note": "The read key is published on the vault page at the editor's request; the editor will check the vault for anything confidential."
  },
  {
   "id": "012",
   "title": "Reconcile the fix commit hash rjmendez names (82f8f31b16a) with 3584a98bd",
   "status": "open",
   "owner": "collector-primary"
  },
  {
   "id": "013",
   "title": "Questions readers ask: /questions/, one page per question, each answer pointing at the pages and sources that carry it; first question from a reader's group chat",
   "status": "done",
   "owner": "librarian",
   "version": "0.2.6"
  },
  {
   "id": "014",
   "title": "Capture The Times, 'Race to fix PHP security issue in software behind most websites' (22 October), seen by a reader, paywalled; listed on /questions/ as seen, not captured",
   "status": "open",
   "owner": "collector-researchers"
  },
  {
   "id": "015",
   "title": "Articles layer and the evidence, derived, authored split: data/layers.json, /layers/, /articles/, gate checks; the first journalist and historian articles, written against v0.2.5",
   "status": "done",
   "owner": "journalist",
   "version": "0.2.7"
  },
  {
   "id": "016",
   "title": "Front page: a 'start here' row above the numbers (If you run PHP, the two flaws, exploitation, impact); today the playbook is not linked from the front page body",
   "status": "open",
   "owner": "journalist",
   "note": "From the front page and navigation review, 22 October. Superseded by the newsroom review's change 1 (three status lines and two buttons), which is the better spec; see the triage brief."
  },
  {
   "id": "017",
   "title": "Front page: replace 'The last 48 hours' with 'Since the last release', drawn from the timeline rows added since the previous version, and drop this site's own events from it",
   "status": "open",
   "owner": "journalist"
  },
  {
   "id": "018",
   "title": "Navigation: split About into About (method, team, brief, corrections) and Engineering (admin, board, roles, briefs, telemetry, releases); move billing and the reading account to the bar's balance",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "019",
   "title": "A layer badge (evidence, derived, authored) in every page's kicker, from data/layers.json, so a reader always knows what kind of page they are on",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "020",
   "title": "Pricing by content type and freshness: every content page metered, price = max(1p, round(base x freshness)) x share read x rating; tiers fresh, new, current, archive picked in the reader's browser; rules on the billing page",
   "status": "done",
   "owner": "journalist",
   "version": "0.2.10"
  },
  {
   "id": "021",
   "title": "Second readings: Perplexity's notes published in full and credited, compared with the vault point by point at /readings/",
   "status": "done",
   "owner": "journalist",
   "version": "0.2.10"
  },
  {
   "id": "022",
   "title": "Tables as cards under 700px, and a screenshot check at 390px in the gate (newsroom review, change 2)",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "023",
   "title": "Per citation: the quoted sentence, capture id and file hash, checked by the gate against the capture text (newsroom review, change 3)",
   "status": "open",
   "owner": "claude-story-site"
  },
  {
   "id": "024",
   "title": "Publish /status.json in a stable shape (schema sgit.newsroom.story-status/1), with its own admin page; the re-export from the vault head is board item 039",
   "status": "done",
   "owner": "dev",
   "version": "0.4.1"
  },
  {
   "id": "025",
   "title": "Exploitation over time: a strip chart from data/exploitation.json with count and count_basis per signal (newsroom review, change 5)",
   "status": "open",
   "owner": "claude-story-site"
  },
  {
   "id": "026",
   "title": "Who said what first: by_ids on claims, origin, relay and independent roles per source; fixes the party pages that say no claim names them (newsroom review, change 6)",
   "status": "open",
   "owner": "claude-story-site"
  },
  {
   "id": "027",
   "title": "Briefings in two minutes: a bottom line, five to eight claims as cards, the full table folded, read next (newsroom review, change 7)",
   "status": "open",
   "owner": "briefing-writer"
  },
  {
   "id": "028",
   "title": "/blast-radius/ by asset type, marked as the site's analysis, linked from the playbook and two briefings (newsroom review, change 8)",
   "status": "open",
   "owner": "claude-story-site"
  },
  {
   "id": "029",
   "title": "The playbook in three phases, each step opening to the agency's sentence, taking offline last (newsroom review, change 9)",
   "status": "open",
   "owner": "claude-story-site"
  },
  {
   "id": "030",
   "title": "The story graph: every node a link, parties as nodes, typed edges (newsroom review, change 10; board 008 holds the fractal layer)",
   "status": "open",
   "owner": "cartographer"
  },
  {
   "id": "031",
   "title": "Narrow the gate's em-dash exemption to quoted text and titles, and rewrite the 20 source and party pages' notes",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "032",
   "title": "SG Meter v1.3.1 to v1.5.0 for dark-mode contrast, keeping the pricing tiers working",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "033",
   "title": "Capture the sources Perplexity named that the vault lacks, W3Techs first (it would close the front page's question on what 70% measures); listed on /readings/",
   "status": "open",
   "owner": "collector-researchers"
  },
  {
   "id": "034",
   "title": "Deploys from several agents: a started deploy is never cut off (the Pages workflow queues instead of cancelling), and release.sh takes in what other agents released before it bumps, and again if its push loses a race",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.2.12"
  },
  {
   "id": "035",
   "title": "/status/: each newsroom site's deploy runs, read from GitHub's public API with no credential, beside the version each site serves; every page notes when a newer release is live",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.2.12"
  },
  {
   "id": "036",
   "title": "Publish the source-watch vault (oq9gflln) the way sgit.ai publishes vaults: screenshot, open-in-a-new-tab link, the vault embedded, its main features",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.2.13"
  },
  {
   "id": "037",
   "title": "A vaults section listing every vault behind the site, what each holds and how to open it",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.2.13"
  },
  {
   "id": "038",
   "title": "The source watch is slow to open in the browser: with no app, the official UI decrypts the folder tree (2,678 objects) before it shows anything; from this sandbox that took 17 minutes. A small vault app that reads index/ and state/ first, or a lighter front vault, would open it in seconds",
   "status": "open",
   "owner": "researcher@php.newsroom"
  },
  {
   "id": "039",
   "title": "Re-export from the vault head: 184 sources in the vault against 144 here, and the newsroom's tracker check 3",
   "status": "open",
   "owner": "dev"
  },
  {
   "id": "040",
   "title": "Guest writers and interviewers: an intake (how a piece reaches the editor, the byline, the 'Guest' mark, the licence) and the first guest piece",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "041",
   "title": "Follow the patching curve: re-read the NCSC-NL inventory per commit and draw how the 418 'under investigation' rows turn into fixed or vulnerable",
   "status": "done",
   "owner": "journalist",
   "version": "0.4.2",
   "note": "The inventory over time: /patching/inventory/, 38 versions read from the public git history; the curve keeps growing with each re-run of admin/build/inventory_history.py."
  },
  {
   "id": "042",
   "title": "Top-level navigation, Research and Stories: the editor's call on names and order after living with the first cut",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "043",
   "title": "Capture W3Techs' PHP version shares alongside its language share (see board 033): the number the patching story says is missing",
   "status": "open",
   "owner": "collector-researchers"
  },
  {
   "id": "044",
   "title": "Patching and status.json: /patching/ with every downstream row checked against the inventory; the story 'Why can't every version of PHP just be patched?'; Research and Stories zones in the menu and an origin strip on every page",
   "status": "done",
   "owner": "journalist",
   "version": "0.4.1"
  },
  {
   "id": "045",
   "title": "Feeds: one RSS feed per zone (for you, research, stories, about the site) and one for everything; an entry for every new item and every change; /feeds/",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.4.2"
  },
  {
   "id": "046",
   "title": "The delta since your last visit: every item marked new, changed or read in your browser; mark a page or everything read; fade or hide what you have read; decisions and notes per item in the newsroom's record format; your desk at /you/ with export and import",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.4.2"
  },
  {
   "id": "047",
   "title": "The feed viewer at /reader/: this site's feeds, the records and discussion a browser may read directly, and feeds the reader adds, fetched and shown safely",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.4.2"
  },
  {
   "id": "048",
   "title": "Subscriptions: a private vault (wgeiqabu) with an append lane, /subscribe/ (requests encrypted in the browser, confirmed before anything is sent), messages from and to agent@diniscruz.ai; its keys sealed to the editor",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.4.3"
  },
  {
   "id": "049",
   "title": "Carry the desk into the reader's own vault: bring the newsroom's vault pane here (it already reads sgit.notes.v1)",
   "status": "open",
   "owner": "dev@php.newsroom"
  },
  {
   "id": "050",
   "title": "Serve the source watch's latest snapshot of the feeds browsers cannot read (php.net, NCSC, CISA advisories, the press) to the viewer",
   "status": "open",
   "owner": "researcher@php.newsroom"
  },
  {
   "id": "051",
   "title": "The second stories: /signals/ (the ladder from exposed to exploited, four signal families, barrier times) and the story 'Exposed is not exploited' by the journalist and the historian",
   "status": "done",
   "owner": "journalist",
   "version": "0.4.2"
  },
  {
   "id": "052",
   "title": "Fix the vault's export of the NCSC-NL inventory: it dropped one row (iBabs bestuursportaal) at cca173c64ec5, so pages say 674 and 3 where the list has 675 and 4",
   "status": "open",
   "owner": "collector-gov"
  },
  {
   "id": "053",
   "title": "Capture the NCSC-NL inventory's later commits into the vault, so the history on /patching/inventory/ rests on captures as well as on the public repository",
   "status": "open",
   "owner": "collector-gov"
  },
  {
   "id": "054",
   "title": "Ask the edge providers for the number nobody has: how many exposed hosts sat behind a rule that blocked the request",
   "status": "open",
   "owner": "journalist"
  },
  {
   "id": "055",
   "title": "Record the first confirmed compromise with two dates, when it happened and when it was announced, against the barrier times on /signals/",
   "status": "open",
   "owner": "historian"
  },
  {
   "id": "056",
   "title": "Find the editor's article on exploitation, patching, internal vulnerability and network protection signals; the SaaS apocalypse piece as published does not carry it",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "057",
   "title": "Schedule the watch list: every source in the scheduled-capture brief checked on a cadence (15 minutes while breaking, hourly, then daily), extending the source watch rather than starting a second scheduler",
   "status": "open",
   "owner": "dev",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "058",
   "title": "Capture raw on every change: page, rendered, text, screenshot, headers and the data itself (JSON, CSV, git, RSS), hashed, a new stamped folder only when the hash changes, a check-log line when it does not",
   "status": "open",
   "owner": "collector-researchers",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "059",
   "title": "One parser per watched source turning each capture into timestamped JSON rows (observed_at, published_at, source_updated_at, capture hash, parser version), appended to a series per source",
   "status": "open",
   "owner": "collector-gov",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "060",
   "title": "The analysis run triggered by every new series: changes and rates within a source, and the same measure lined up across sources on one time axis and unit, with charts and a what-changed summary written to the vault",
   "status": "open",
   "owner": "cartographer",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "061",
   "title": "The contradiction ledger: a first-class record per disagreement (the statements, who, when, captures, what each measures, the reading, status), seeded with the seven from the 22 October coverage review, and a page that shows it",
   "status": "open",
   "owner": "factcheck",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "062",
   "title": "Meaning through connectivity: typed edges (cites, restates, measures differently, contradicts, supersedes, derives from) and each fact and stat placed on a spectrum of evidence read from its edges, so ten outlets restating one headline count as one source",
   "status": "open",
   "owner": "cartographer",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "063",
   "title": "Carry every stat as its series: each number on the site drawn as a line whose points link to their captures, starting with sites offline, products fixed, attempts and unpatched hosts",
   "status": "open",
   "owner": "journalist",
   "note": "From the brief on scheduled capture, JSON and analysis (22 October, critical)."
  },
  {
   "id": "064",
   "title": "The phone app (/now/): what to know for one, five, ten or thirty minutes against what you read; deterministic and agentic modes; the reader's vault with the OpenRouter key; chat with Sonnet; infographics with Gemini",
   "status": "done",
   "owner": "dev",
   "note": "From the brief on the phone app (22 October).",
   "version": "0.5.0"
  },
  {
   "id": "065",
   "title": "First live run of the agentic mode with the editor's OpenRouter key: check that every sentence Sonnet writes cites an item, and that the infographic adds no number of its own",
   "status": "open",
   "owner": "editor",
   "note": "From the brief on the phone app (22 October)."
  },
  {
   "id": "066",
   "title": "Open the phone app's vault with a passkey, through the newsroom's door design, so a phone needs no pasted key",
   "status": "open",
   "owner": "dev",
   "note": "From the brief on the phone app (22 October)."
  },
  {
   "id": "067",
   "title": "Draw the semantic graph on the phone: what changed, and what it connects to, as nodes and edges",
   "status": "open",
   "owner": "cartographer",
   "note": "From the brief on the phone app (22 October)."
  },
  {
   "id": "069",
   "title": "Map every member of the team, human and agent, with a page each; the three coordination vaults (conductor, issues, mail); the board moved into the issues vault; the conductor's append lane, one token per member, and its drain (admin/build/conductor_drain.py), tested end to end",
   "status": "done",
   "owner": "conductor",
   "version": "0.5.1"
  },
  {
   "id": "070",
   "title": "Decide how each member receives the coordination vaults' keys: the conductor vault's read key, the issues and mail vaults' keys, each member's append token (sealed per member on pki.sgit.ai, or handed in each session's launch prompt)",
   "status": "open",
   "owner": "editor",
   "note": "Until this is decided, the conductor holds every key and members are reached through the editor."
  },
  {
   "id": "071",
   "title": "Set the cadence of the scheduled run (open by the conductor, work by the agents, close by the conductor) and which agents take part in the first one",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "072",
   "title": "Review the team map: each member's page, role, owners and status; correct anything wrong by mail to the conductor",
   "status": "open",
   "owner": "vicky"
  },
  {
   "id": "073",
   "title": "Prioritise the open board: the first run's top five, and which needs the editor must answer first",
   "status": "open",
   "owner": "vicky"
  },
  {
   "id": "074",
   "title": "First run: the plan, the assignments as mail to each member, the digest at the close, and the site's snapshot of the team after it",
   "status": "open",
   "owner": "conductor"
  },
  {
   "id": "075",
   "title": "A digest on the site at every close: the conductor vault's status (what moved, what is blocked and on whom, what the humans must decide) as a page under /team/",
   "status": "open",
   "owner": "conductor"
  },
  {
   "id": "076",
   "title": "Run the source watch hourly: today it runs by hand in a session; a scheduled run needs the vault key held by the runner, never in a repository",
   "status": "open",
   "owner": "researcher@php.newsroom"
  },
  {
   "id": "077",
   "title": "Discovery across languages: Google News answers a cloud browser with 'Sorry' after a burst, so the publishers it surfaces are mapped but not followed; Bing carries article addresses but only for the query 'php2shell'",
   "status": "open",
   "owner": "researcher@php.newsroom"
  },
  {
   "id": "078",
   "title": "Cyber desk, first piece: 'Patch at the speed of Metasploit', php2shell on the weaponisation ladder, the ATT&CK path (seen, expected, precedent) and the second and third stories",
   "status": "done",
   "owner": "cyber@php.newsroom"
  },
  {
   "id": "079",
   "title": "The weaponisation clock: watch for a merged Metasploit module, an exploiting nuclei template, a KEV listing, an EPSS step, upstream Sigma/ET/Snort rules, a second patch or regression; write the next cyber piece when one moves",
   "status": "open",
   "owner": "cyber@php.newsroom"
  },
  {
   "id": "080",
   "title": "Guidance for every agent (AGENTS.md, /admin/agents/): push to your own branch early and often, dev@ carries it into dev; quality from coding.sgit.ai, NFRs from nfrs.sgit.ai, the security requirements",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.5.3"
  },
  {
   "id": "081",
   "title": "Send AGENTS.md to every member through the conductor vault's broadcast, and ask each to confirm they read it",
   "status": "open",
   "owner": "conductor"
  },
  {
   "id": "082",
   "title": "Ask: talk to the site from any page; the model uses the site's tools (window.__tools, also for any agent in the browser), proposes changes to your record only with your Allow; your OpenRouter key and your desk kept in your vault, shared with the phone app",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.5.4"
  },
  {
   "id": "083",
   "title": "One copy of the vault code: move the phone app (/now/) onto the same open, pull and push as the Ask pane, or both onto a shared module",
   "status": "open",
   "owner": "design"
  },
  {
   "id": "084",
   "title": "Open the reader vault with a passkey, as newsroom.sgit.ai and pki.sgit.ai do (the door design), instead of a pasted key",
   "status": "open",
   "owner": "dev@php.newsroom"
  },
  {
   "id": "085",
   "title": "Commit data/keys.json: .gitignore's keys*.json rule held it back, so /admin/keys/ is not built yet. Check it holds fingerprints and vault ids only, add it with an explicit !data/keys.json exception, and restore its row in data/layers.json (used on admin/keys/index.html); the page and its menu entry then build on their own",
   "status": "open",
   "owner": "security@php.newsroom"
  },
  {
   "id": "086",
   "title": "The fact-check desk: a spectrum of evidence (kind, level A0 to A6, verdict, tension), an Issues-FS tracker, the contradiction ledger, the first full run over all 70 claims, and /factcheck/ with a view of only what can be relied on",
   "status": "done",
   "owner": "factcheck",
   "note": "From the brief: a fact-checker joins the team (22 October)."
  },
  {
   "id": "087",
   "title": "Run the desk on a schedule, every four hours: the claims that changed, the open tickets, the weak and the contested, KEV and the moving sources; a full sweep once a day",
   "status": "open",
   "owner": "factcheck",
   "note": "From the brief: a fact-checker joins the team (22 October)."
  },
  {
   "id": "088",
   "title": "Act on the desk's high and medium findings on claims, agencies, exploitation and impact data: first Italy's offline advice, the allies' 'contradicted' mark, the five quotes not in their captures, and the eleven overstated status words (tickets on /factcheck/)",
   "status": "open",
   "owner": "claude-story-site",
   "note": "From the brief: a fact-checker joins the team (22 October)."
  },
  {
   "id": "089",
   "title": "Capture what the desk found outside the vault: the BBC live page as it stands (32 UK services, 90%), The Next Web, the PHPocalypse Tracker's sites.csv, KEV each run; then re-grade the claims they bear on",
   "status": "open",
   "owner": "collector-researchers",
   "note": "From the brief: a fact-checker joins the team (22 October)."
  },
  {
   "id": "090",
   "title": "The telemetry dashboard: a new private vault (i4diy82d) with a vault app over the telemetry vault, linked inside it read-only (vault-in-vault); its key sealed to the editor",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.5.7"
  },
  {
   "id": "091",
   "title": "The telemetry vault-in-vault turned around: the application moves to a versioned vault of its own (5wnsr5h8, v0.1.1, eight pages); the telemetry vault imports it and drains its own lane from the browser (Queue & drain: the count waiting, the passphrase-sealed key, push before mark-processed); the dashboard vault i4diy82d superseded",
   "status": "done",
   "owner": "dev@php.newsroom",
   "version": "0.5.10"
  },
  {
   "id": "092",
   "title": "Record the holders' acceptance of the newsroom's own risks (R10 and beneath it): accept for an interval, fund or fix; nobody can accept them for the editor",
   "status": "open",
   "owner": "editor",
   "note": "From the brief: a GRC desk joins the team (22 October)."
  },
  {
   "id": "093",
   "title": "A story on the reporting clocks php2shell can start (GDPR 72 hours, NIS2 24 hours, the Cyber Resilience Act's 24-hour report since 11 September 2026, DORA): R06 and the risks beneath it have no story yet (/grc/)",
   "status": "open",
   "owner": "journalist",
   "note": "From the brief: a GRC desk joins the team (22 October)."
  },
  {
   "id": "094",
   "title": "Fix the cycle in assets/themes/site-tokens.css line 8: --warn-bg, --warn-ink, --info-bg and --info-ink are defined as themselves, so they are invalid and every amber and blue pill and graph edge that reads them renders without colour",
   "status": "open",
   "owner": "claude-story-site",
   "note": "From the brief: a GRC desk joins the team (22 October)."
  },
  {
   "id": "095",
   "title": "Capture into the vault what the GRC section cites from the sgit network (risks.sgit.ai, the riskmandate.ai model, the newsroom's risk articles) so the network page can cite captures, not live pages",
   "status": "open",
   "owner": "collector-researchers",
   "note": "From the brief: a GRC desk joins the team (22 October)."
  },
  {
   "id": "096",
   "title": "GRC run 2: re-rate every risk against the next vault capture (a KEV listing or a confirmed compromise moves R03 and R06), add the stakeholders the next captures name, and map the remaining controls each holder will be asked about",
   "status": "open",
   "owner": "grc",
   "note": "From the brief: a GRC desk joins the team (22 October)."
  },
  {
   "id": "097",
   "title": "Collaborators: /collaborators/ with this week's ask, the WhatsApp and email messages per ask, a join form and a feedback form encrypted to the new collaborators vault (58526ytp); its drain; brief admin/content/briefs/2026-10-22__brief__collaborators.md",
   "status": "done",
   "owner": "conductor"
  },
  {
   "id": "098",
   "title": "Confirm the LinkedIn link on /collaborators/ and the contact for readers without JavaScript; then send ask 001 to the email list and the WhatsApp group",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "099",
   "title": "Seal the conductor and collaborators lanes' secrets (enum keys, member tokens, key-pair passphrases) to the root: the session's permission check stopped it; the four vault keys are sealed",
   "status": "waiting",
   "owner": "conductor"
  },
  {
   "id": "100",
   "title": "Write ask 002 after the next release worth looking at, and drain the collaborators lane into the board at every close",
   "status": "open",
   "owner": "conductor"
  },
  {
   "id": "101",
   "title": "Quiet hours: decide the window (proposed 22:00 to 07:00 London) and whether the source watch may run through the night while the story is breaking; then the three schedules on /team/runs/ are changed to match",
   "status": "open",
   "owner": "editor"
  },
  {
   "id": "102",
   "title": "Source watch: before scheduling the next pass, check London time and move a pass in the quiet hours to 07:04; a pass that changes something leaves a dated article with run: <run id>",
   "status": "open",
   "owner": "researcher@php.newsroom"
  },
  {
   "id": "103",
   "title": "Fact-check runs: move the schedule to CRON_TZ=Europe/London 52 8-20/4 * * * once the editor agrees; a run that moves a grade or opens a ticket leaves a dated article with run: <run id>",
   "status": "open",
   "owner": "factcheck"
  },
  {
   "id": "104",
   "title": "Synthetic readers: limit synthetic.yml's schedule to daytime (branch for security review, then the editor's go); a run with failures leaves a dated article with run: <run id>",
   "status": "open",
   "owner": "synthetic"
  },
  {
   "id": "105",
   "title": "Runs: /team/runs/, the register of every schedule (who, where, how often, how many runs fall in the quiet hours) and every recorded run with the article it should leave (data/schedules.json)",
   "status": "done",
   "owner": "conductor"
  }
 ],
 "evidence_vault": {
  "id": "3ytzxm3g",
  "read_key": "sgit_public_read_6451da6ba1c6201d35b0832d570097327552564c12c8e9a550fc2ed1150769f8:3ytzxm3g",
  "open_url": "https://dev.vault.sgraph.ai/en-gb/#sgit_public_read_6451da6ba1c6201d35b0832d570097327552564c12c8e9a550fc2ed1150769f8%3A3ytzxm3g",
  "note": "Read-only. A read key cannot be turned into write access. Published at the editor's request on 22 October 2026; the editor is checking the vault for anything that should not be public (board item 011). The vault's own README calls its captures private evidence not for republication; opening it with this key is reading, not republishing, and the rights question stays open on the board."
 },
 "telemetry_vault": {
  "id": "84wr8mib",
  "note": "Private. Its vault key, enum key and key-pair passphrase are held by the editor and the drainer, never in this repository."
 }
}
