Retire /internal/portfolio — the inventory has one view - #320
Merged
Conversation
The 2026-07-24 amendment to ADR 0005 retired /internal/requests in favour of one public queue. It missed /internal/portfolio, which kept rendering a parallel view of the inventory — the same duplication, one surface over. It had no exclusive content. No project has ever carried the `Internal-only` visibility tier (27 Public, 2 Partial), so the extra tier the internal audience adds to the query in lib/work.ts matched nothing and both routes rendered the same 29 projects; the live /internal counts confirm it reads "2 embargoed · 0 internal-only". Its one real difference, internal_text on blockers, held only auto-derived placeholders from the seed script whose text reads "Auto-seeded from … Refine with the actual submission date, the named OIT contact" — notes to ourselves, not withheld institutional detail. Real cost, zero benefit. Both routes now redirect to their public equivalents in proxy.ts, ahead of the auth gate, so a bookmarked link resolves without a credential prompt; deep links keep their slug. Verified in the browser: /internal/portfolio lands on /portfolio unauthenticated, and /internal/portfolio/openera lands on /portfolio/openera. The seam stays. audience:"internal" remains in lib/work.ts and blockers.internal_text remains in the schema, both with comments saying no surface reads them. Restoring a reader should be a decision, not a page that quietly persisted. /internal now describes itself as ops-only and links out to the public inventory rather than a private copy of it. Its "Coming in Sprint 3" list was also stale — the submitter status page and live similarity shipped in Sprint 3a — so it now names only what is genuinely outstanding, including the honest detail that the named-SLA acknowledgment email has never been sent because there is no mailer in the stack. ADR 0005 gains an amendment generalising the rule: it is not "one request queue", it is one view of anything the public site shows. /internal is for operating the site, not reading it differently. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Vendored strategic-plan submodule is behind upstreamThe vendored submodule pointer at The submodule is pinned at upstream This is an advisory comment from |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The 2026-07-24 amendment to ADR 0005 retired
/internal/requestsin favour of one public queue. It missed/internal/portfolio, which kept rendering a parallel view of the inventory — the same duplication, one surface over.It had no exclusive content
Internal-onlytier — 27Public, 2Partial. The extra tier the internal audience adds inlib/work.tsmatched nothing, so both routes rendered the same 29 projects. The live/internalcounts confirm it: "2 embargoed · 0 internal-only".internal_textheld only auto-derived placeholders fromscripts/seed-portfolio.ts: "Auto-seeded from … Refine with the actual submission date, the named OIT contact." Notes to ourselves, not withheld institutional detail.Real cost — a second surface to keep current, and a standing contradiction of the directive. Zero benefit.
Change
/internal/portfolio→/portfolioand/internal/portfolio/[slug]→/portfolio/<slug>, redirected inproxy.tsahead of the auth gate so a bookmarked link resolves without a credential prompt. Deep links keep their slug.Verified in the browser, not just compiled:
/internal/portfolio→http://localhost:3000/portfolio, unauthenticated, no prompt/internal/portfolio/openera→http://localhost:3000/portfolio/openera, H1OpenERA/internalrenders the new copy, links to/portfolio, and contains zero remaining references to the retired routeThe seam stays
audience: "internal"remains inlib/work.tsandblockers.internal_textremains in the schema — both now carrying comments saying no surface reads them. If sharper blocker detail is ever genuinely authored, the path back is intact. What's gone is a surface that existed by default rather than by decision.Also on /internal
Its lede described the view being retired, so it now says what
/internalactually is: ops surfaces only, with the inventory and queue linked out as public.Its "Coming in Sprint 3" list was stale too — the submitter status page and live similarity both shipped in Sprint 3a. It now names only what's genuinely outstanding, including the honest detail that the named-SLA acknowledgment email has never been sent (there's no mailer in the stack — the named human and SLA render on-page, but nothing is delivered). Worth knowing, given the SLA is the intake surface's main promise.
ADR
ADR 0005 gains an amendment generalising the rule: it is not "one request queue", it is one view of anything the public site shows.
/internalis for operating the site, not reading it differently.Last item from the documentation audit besides the
/docsdrift (#94/#96/#97), which is next.🤖 Generated with Claude Code