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

Reading room · newsroom.sgit.ai

Reading room / newsroom.sgit.ai · raw text · live ↗

From newsroom.sgit.ai, the page as fetched on 2026-09-25 · open the live page ↗Everything on this sheet is the source site's own text; the newsroom's chrome is outside it.
{
  "id": "governance-story-workflow",
  "version": "0.1.0",
  "updated": "2026-08-28",
  "note": "How a story moves from a search result to a published page, and who owns each move. Every state names the one role that can advance it and the door it has to get through — the condition that must be true before the next role will take it. A story can only be in one state; the desk records which.",
  "states": [
    {
      "id": "spotted",
      "label": "Spotted",
      "owner": "researcher",
      "seq": 1,
      "means": "A candidate exists. Somebody searched and something came back.",
      "door": "A specific artefact can be named — not a topic, an artefact.",
      "exits": [
        "registered",
        "parked"
      ]
    },
    {
      "id": "registered",
      "label": "Registered",
      "owner": "librarian",
      "seq": 2,
      "means": "The source is in the register with a state and a checked date, and the URL resolved.",
      "door": "The fetch returned 200. A blocked or dead URL cannot pass — that is gate check 7.",
      "exits": [
        "frozen",
        "parked"
      ]
    },
    {
      "id": "frozen",
      "label": "Frozen",
      "owner": "researcher",
      "seq": 3,
      "means": "A byte copy is held and hashed, with the retrieval time recorded.",
      "door": "The hash exists and the bytes are stored.",
      "blocked": true,
      "blocked_why": "The fetch-freeze-hash path is not built. Every story is stuck at this door, which is why nothing in the graph is anchored and every fact reads secondary.",
      "exits": [
        "extracted"
      ]
    },
    {
      "id": "extracted",
      "label": "Extracted",
      "owner": "extractor",
      "seq": 4,
      "means": "Typed nodes and edges exist, conforming to the ontology, anchored where a frozen copy allows it.",
      "door": "Every verb is in the vocabulary and every node names its source. Gate checks 1 and 2.",
      "exits": [
        "drafted",
        "parked"
      ]
    },
    {
      "id": "drafted",
      "label": "Drafted",
      "owner": "writer",
      "seq": 5,
      "means": "Prose exists in markdown, and names the node ids it stands on.",
      "door": "Every sentence traces to a node. Gate check 3.",
      "exits": [
        "cleared",
        "refused"
      ]
    },
    {
      "id": "cleared",
      "label": "Cleared",
      "owner": "editor",
      "seq": 6,
      "means": "The refusal list has been applied and nothing on it was triggered.",
      "door": "No named organisation is assessed; no severity language that the graph does not compute; no implication of human review.",
      "exits": [
        "gated",
        "refused"
      ]
    },
    {
      "id": "gated",
      "label": "Gated",
      "owner": "qa",
      "seq": 7,
      "means": "Both gates pass — the section's own checks and the whole-site gate.",
      "door": "Exit zero. A failing gate is answered, never silenced.",
      "exits": [
        "published"
      ]
    },
    {
      "id": "published",
      "label": "Published",
      "owner": "publisher",
      "seq": 8,
      "means": "Live, versioned, and carrying the beta and no-human-review notices.",
      "door": "The version was bumped and the release note says what is still missing.",
      "exits": [
        "superseded"
      ]
    },
    {
      "id": "superseded",
      "label": "Superseded",
      "owner": "extractor",
      "seq": 9,
      "terminal": true,
      "means": "A later fact replaced one this story rests on. The story stays up; the superseding edge is added.",
      "door": "Never delete. The original remains readable and the edge points forward.",
      "exits": []
    },
    {
      "id": "parked",
      "label": "Parked",
      "owner": "librarian",
      "seq": 0,
      "terminal": true,
      "means": "Not dead, not moving. Waiting on something outside this newsroom.",
      "door": "The blocker is named, so a reader can see what would unblock it.",
      "exits": [
        "spotted"
      ]
    },
    {
      "id": "refused",
      "label": "Refused",
      "owner": "editor",
      "seq": 0,
      "terminal": true,
      "means": "Killed on the refusal list. Recorded rather than quietly dropped.",
      "door": "The refusal that bit is named. Cut, never softened.",
      "exits": []
    }
  ],
  "lanes": [
    {
      "id": "gather",
      "label": "Gather",
      "states": [
        "spotted",
        "registered",
        "frozen"
      ]
    },
    {
      "id": "build",
      "label": "Build",
      "states": [
        "extracted",
        "drafted"
      ]
    },
    {
      "id": "clear",
      "label": "Clear",
      "states": [
        "cleared",
        "gated"
      ]
    },
    {
      "id": "release",
      "label": "Release",
      "states": [
        "published",
        "superseded"
      ]
    },
    {
      "id": "stopped",
      "label": "Stopped",
      "states": [
        "parked",
        "refused"
      ]
    }
  ]
}