Skip to content

Close the scoping vocabulary gap; scope ADR 0005's status to what was decided - #318

Merged
ProfessorPolymorphic merged 2 commits into
mainfrom
chore/bump-governance-scoping-vocab
Jul 27, 2026
Merged

Close the scoping vocabulary gap; scope ADR 0005's status to what was decided#318
ProfessorPolymorphic merged 2 commits into
mainfrom
chore/bump-governance-scoping-vocab

Conversation

@ProfessorPolymorphic

Copy link
Copy Markdown
Collaborator

The two remaining governance items from the documentation audit.

1. scoping reaches the vendored vocabulary

ADR 0001's 2026-07-24 amendment named this follow-up itself"add scoping to the vendored iids-portfolio ProjectStatus vocabulary upstream" — and it was never done. lib/portfolio.ts has used scoping since July and one project currently claims it, against a registry that didn't list the code.

Nothing would have caught it. The governance drift workflow doesn't run on lib/portfolio.ts changes, so the typed union and the vendored registry can diverge in silence — which is the exact failure the catalog exists to prevent.

Upstream: ui-insight/data-governance#17, merged. It adds scoping at Display_Order 2 between idea and approved, corrects the Exploring rollup to idea, scoping, approved, and sharpens idea — its rule read "no committed operationalOwner OR no committed iidsSponsor", which with scoping in place would let a project with exactly one of the two satisfy both codes. The verifier treats neither as idea and either as scoping; the vocabulary now says the same. Rules were transcribed from lib/portfolio-verification.ts rather than paraphrased.

This PR bumps the submodule pointer and regenerates lib/governance/vocabularies.ts via npm run build:governance — regenerated, not hand-edited, per Agent Rule 13.

2. ADR 0005's status

The header read Proposed / Deciders: Pending three days after Phase 1 shipped, so the index was telling readers a decision embodied in live tables, live code, and a public surface hadn't been made.

A flat flip to Accepted would have been wrong. This ADR does two things:

Status
The registry this repo owns and built alone — tech_requests + 4 tables (Migration 018), lib/utr.ts, lib/requests.ts, Migration 019's survey candidates, /portfolio/pipeline Accepted — decided by the portfolio owner; needed no external dependency, which is why Phase 1 was scoped that way
A division of institutional labour binding other offices — TDX as workflow system of record, the shared prioritization model, OIT's approved-tools ownership Still proposed — for the UTR working group to ratify, amend, or reject
Phases 2–4 Unbuilt — verified: no project_interest_pool, governance_flags, project_gates, or prioritization_* tables; no lib/approved-tools.ts, /standards/approved-tools, /internal/prioritization, or scripts/sync-tdx.ts

Marking the whole thing Accepted would assert that a group which hasn't met on it signed off. The site's standard is that every claim names a human and holds up; an ADR header overclaiming ratification fails that standard in the audit trail itself.

Recorded as a dated amendment rather than a silent header rewrite, per this directory's append-only rule. docs/adr/README.md's format section gains a line permitting a scoped status, since 0005 is now the precedent — constrained so a header can never imply a ratification that hasn't happened.

One thing to confirm

Deciders now reads "Barrie Robison (IIDS), for the registry design and Phase 1 as built." That's inferred from the 2026-07-24 amendment ("the portfolio owner's call") and from Phase 1 having shipped. Correct it if the attribution is wrong.

Verification

npm run build, npm run lint, and npm run verify:portfolio all pass — 29 projects, 0 errors, 2 pre-existing stale-commit-date warnings. scoping and the corrected Exploring rollup confirmed present in the regenerated catalog.

🤖 Generated with Claude Code

ProfessorPolymorphic and others added 2 commits July 27, 2026 06:00
Closes the follow-up ADR 0001's 2026-07-24 amendment named and never
did: the vendored iids-portfolio ProjectStatus vocabulary did not list
`scoping`, while lib/portfolio.ts has used it since July and one project
currently claims it.

Nothing would have caught this. The governance drift workflow does not
run on lib/portfolio.ts changes, so the typed union and the vendored
registry can diverge in silence — which is the failure mode the catalog
exists to prevent.

Upstream ui-insight/data-governance#17 adds `scoping` at Display_Order 2
between idea and approved, corrects the Exploring rollup to include it,
and sharpens `idea` (which read "no owner OR no sponsor" and would now
overlap scoping — the verifier means neither). This bumps the submodule
pointer and regenerates the typed catalog from it.

Regenerated, not hand-edited, per Agent Rule 13.

npm run build, npm run lint, and npm run verify:portfolio all pass
(29 projects, 0 errors, 2 pre-existing stale-commit-date warnings).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The header read `Proposed` / `Deciders: Pending` three days after Phase 1
shipped, so the index was telling readers that a decision embodied in
live tables, live code, and a public surface had not been made yet.

The fix is not a flat flip to Accepted. This ADR does two different
things: it designs a registry this repo owns and can build alone, and it
proposes a division of institutional labour that binds other offices —
TDX as the workflow system of record, a shared prioritization model,
OIT's ownership of the approved-tools list. The first was decided and
built. The second is still a proposal, and nothing in this repo can
accept it on the working group's behalf. Marking the whole ADR Accepted
would assert a ratification that hasn't happened, in the audit trail
itself.

So the status is split, with a dated amendment recording the split
(append-only, per this directory's own lifecycle rules) and an inventory
of what exists: Phase 1's five tables plus lib/utr.ts, lib/requests.ts,
Migration 019's survey candidates, and /portfolio/pipeline are Accepted;
the TDX boundary, prioritization model, and approved-tools ownership stay
Proposed; Phases 2-4 are unbuilt, and the amendment names the specific
tables and modules that don't exist so the gap is checkable rather than
implied.

Deciders now names Barrie Robison for the part that was decided, rather
than "Pending".

The format section of docs/adr/README.md gains a line permitting a scoped
status for this case, since ADR 0005 is now the precedent — with the
constraint that a header must never imply a ratification that hasn't
happened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Vendored strategic-plan submodule is behind upstream

The vendored submodule pointer at vendor/strategic-plan is pinned to 434de6e, which was committed 117 day(s) ago (threshold: 14 days).

The submodule is pinned at upstream main HEAD, but that HEAD itself is older than the threshold. No action needed in this repo — upstream simply hasn't moved.

This is an advisory comment from strategic-plan-pr-summary.yml. It does not block the build. Threshold is configurable via the STALE_AFTER_DAYS workflow env var (currently 14). This comment is updated in place across pushes.

@github-actions

Copy link
Copy Markdown

Governance catalog changes

1 vocabulary value(s) added, 0 removed across 1 domain(s).

Vocabulary values on existing groups (+1 / -0)

Added

  • iids-portfolio: ProjectStatus: scoping — Scoping

Posted by governance-pr-summary.yml. This comment is updated in place across pushes — look for the marker in the raw markdown.

@ProfessorPolymorphic
ProfessorPolymorphic merged commit 92b28b3 into main Jul 27, 2026
8 checks passed
@ProfessorPolymorphic
ProfessorPolymorphic deleted the chore/bump-governance-scoping-vocab branch July 27, 2026 13:09
ProfessorPolymorphic added a commit that referenced this pull request Jul 27, 2026
The `scoping` drift closed in #318 should never have been findable only
by hand. ADR 0001's amendment named the upstream registration as a
follow-up, the follow-up was missed, a project shipped claiming the
status, and every check stayed green for three days.

My first instinct was to add lib/portfolio.ts to the Governance Drift
workflow's path filter. That would not have worked: the drift script
validates the vendored registry's internal consistency and its remote
repo canaries, and has no knowledge of this repo's TypeScript unions.
Running it on a portfolio change would have been a no-op that looked
like a fix.

The check belongs in verify:portfolio, which already runs on every PR
and can see both sides. verifyGovernanceVocabularyParity() asserts that
the ProjectStatus and PublicStage unions in lib/portfolio.ts and the
registered iids-portfolio vocabulary contain exactly the same codes.
It reads the unions from the exhaustive OPERATIONAL_LABEL and
PUBLIC_STAGE_LABEL records, so tsc guarantees there is no third list to
keep in sync, and a missing vocabulary group is itself an error rather
than a silently-skipped check.

Both directions fail. A code in the union but not the vocabulary means
the registry misdescribes what statuses exist; a code in the vocabulary
but not the union means one was retired without deregistering it, and the
Data Model explorer shows stakeholders a state the site can no longer
produce. Each message names the fix, including the two-repo order.

Verified by reproducing the original drift — removing `scoping` from the
generated vocabulary fails with the intended error — and the reverse, by
adding a code the union lacks. Baseline still passes: 29 projects, 0
errors, 2 pre-existing stale-commit-date warnings.

ADR 0001 gains an amendment closing both vocabulary follow-ups and
recording the consequence for future ones: adding an operational status
is now a two-repo change in a fixed order, and an amendment that defers
something should say what will fail if it is forgotten.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant