From 1c6b519a2b8865fed5abde6412f5f183e5b126df Mon Sep 17 00:00:00 2001 From: Mark Larah Date: Wed, 26 Aug 2026 11:38:24 -0500 Subject: [PATCH] Add documentStageOverrides to state.json for document-only RFCs Document-only RFCs (from graphql-wg/rfcs/) have no associated PR or discussion labels, so their stage defaults to RFC 0. This adds a documentStageOverrides key to state.json that lets maintainers set the correct stage for these entries. Marks MockSpec as superseded. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/sync/sync-rfcs.ts | 23 +++++++++++++---------- state.json | 3 +++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/sync/sync-rfcs.ts b/src/sync/sync-rfcs.ts index 9d7e352..cbfc473 100644 --- a/src/sync/sync-rfcs.ts +++ b/src/sync/sync-rfcs.ts @@ -262,6 +262,7 @@ interface SyncState { events: CachedIssueEvent[]; } >; + documentStageOverrides?: Record; } interface CachedIssueEvent { @@ -340,7 +341,7 @@ async function main(): Promise { for (const discussion of await fetchAllDiscussions(token)) { mergeDiscussion(records, discussion); } - await mergeDocuments(records); + await mergeDocuments(records, state); await addWgMentions(records); const summaries = await writeGeneratedMarkdown(records); @@ -377,11 +378,9 @@ async function main(): Promise { async function loadState(): Promise { try { const state = JSON.parse(await fs.readFile(STATE_PATH, "utf8")) as SyncState; - if (!state.issueEvents || typeof state.issueEvents !== "object") { - return {}; - } - return { - issueEvents: Object.fromEntries( + const result: SyncState = {}; + if (state.issueEvents && typeof state.issueEvents === "object") { + result.issueEvents = Object.fromEntries( Object.entries(state.issueEvents).flatMap(([key, value]) => { if (!value || typeof value !== "object" || !Array.isArray(value.events)) { return []; @@ -389,8 +388,12 @@ async function loadState(): Promise { const events = value.events.filter(isCachedIssueEvent); return [[key, { updatedAt: value.updatedAt ?? "", events }]]; }), - ), - }; + ); + } + if (state.documentStageOverrides && typeof state.documentStageOverrides === "object") { + result.documentStageOverrides = state.documentStageOverrides; + } + return result; } catch { return {}; } @@ -1010,7 +1013,7 @@ function mergeDiscussion( }); } -async function mergeDocuments(records: Map): Promise { +async function mergeDocuments(records: Map, state: SyncState): Promise { const docsDir = path.join(WG_DIR, "rfcs"); for (const entry of await fs.readdir(docsDir, { withFileTypes: true })) { if ( @@ -1028,7 +1031,7 @@ async function mergeDocuments(records: Map): Promise { const record = getOrCreateRecord(records, identifier, tidyTitle(header)); record.title = tidyTitle(header); record.shortname = record.title; - record.stage = record.stage ?? "0"; + record.stage = record.stage ?? state.documentStageOverrides?.[identifier] ?? "0"; record.rfcDocUrl = `https://github.com/graphql/graphql-wg/blob/main/rfcs/${entry.name}`; record.documentBody = pruneMarkdown(content); record.updatedAt = maxDate(record.updatedAt, new Date().toISOString()); diff --git a/state.json b/state.json index d3d9f3e..0a30f7d 100644 --- a/state.json +++ b/state.json @@ -1,4 +1,7 @@ { + "documentStageOverrides": { + "MockSpec": "S" + }, "issueEvents": { "graphql/graphql-spec#1010": { "events": [