Skip to content

ID-61 Unit F {61.12} — Executor Scope Map

⚠️ PARTIALLY EXECUTED (bannered S462). Sections (b)–(f) (DOM-ids/testids/e2e selectors) executed S458. Sections (a) UI-copy + (g) bundle-copy were NOT executed and remain verified-accurate against HEAD (2026-07-11) — this document is the LIVE checklist for the outstanding copy sweep, owned by ID-145. Re-target replacement strings to item-level form language per DR-038, not workspace language.

Synthesised from 5 parallel scope-sweeps + verified against repo ground-truth and STRATEGY.md §1(Unit F row)/§5(Phase 6)/§5(DEFER) + DECISION-REGISTER §1 row 87, §3 KEEP, §4 DEFER. This is the LAST TS unit of the bid→procurement rename. Lands after A (shares app/procurement/page.tsx) so sequencing avoids conflict; e2e-smoke on staging is the forcing-function gate.

VERIFIED GROUND TRUTH (resolves sweep disagreements)

Section titled “VERIFIED GROUND TRUTH (resolves sweep disagreements)”
  1. e2e/helpers/selectors.ts EXISTS (Sweep 5 wrongly said it doesn’t; Sweep 3 correct). The bid: block is at lines 62–78. BUT selectors is NOT imported by any spec or helper (grep for imports = zero hits) — the whole export is dead/unused. Specs use inline locators. ⇒ Renaming the bid: block is cosmetic-consistency only, NOT lockstep- critical. Safe to rename keys OR delete the block; recommend rename for consistency.
  2. data-testid="bid-list" / "bid-name" / "bid-status" producers DO NOT EXIST in app/components/mcp-apps. selectors.ts:64,67,68 reference them ⇒ ORPHAN selectors (dead strings inside a dead file). Only real producer is bid-card-${bid.id}.
  3. The ONLY real DOM-id producers with bid: procurement-list-card.tsx:87 data-testid={\bid-card-${bid.id}`}; the wizard-bid-*id/htmlFor pairs (×6) inprocurement-creation-wizard.tsx; the ARIA tab pair in procurement/[id]/page.tsx` (370/372/405/406).
  4. active-procurement-section.tsx:57 aria-label is ALREADY "Active procurements" (renamed by a prior unit) but visible copy at :61 is still Active Bids. ⇒ dashboard.spec.ts:102,127,154,343,385 targeting section[aria-label="Active bids"] are ALREADY BROKEN against source (matching a label that no longer exists). HIGHEST-PRIORITY lockstep fix: update those 5 selectors to "Active procurements" AND fix the :61 copy + its text assertion dashboard.spec.ts:107.
  5. content-performance-section.tsx:221 <p>Bids</p> binds overall.unique_bids (:219). The visible label “Bids” is Unit F copy; the unique_bids FIELD is Unit E (DB). Separable — only the label text changes in F.
  6. Past bid responses (search-prompt-cards.tsx:71) lives inside BID_WRITING_CARDS (the bid_writing persona cluster = DEFER). The title string is visible copy (F-eligible); the persona key bid_writing + id: 'bid-writing-*' stay DEFERRED. PRODUCT-JUDGMENT FLAG (craft-term + spec-comment coupling).

1. PER-FILE CHANGE LIST (grouped by category)

Section titled “1. PER-FILE CHANGE LIST (grouped by category)”

(a) UI COPY — visible “Bids”/“bid” → “Procurement”/“procurement” (live Next.js, no regen)

Section titled “(a) UI COPY — visible “Bids”/“bid” → “Procurement”/“procurement” (live Next.js, no regen)”
filesiteold → new
app/library/library-content.tsx:580…build your bid response library.…build your procurement response library.
app/procurement/[id]/error.tsx:27Couldn't load bid detailsCouldn't load procurement details
app/procurement/[id]/error.tsx:30This bid may have been deleted or you may not have access.This procurement may have…
app/procurement/[id]/error.tsx:37Link Back to BidsBack to Procurement (nav label — see PJ-FLAG-1)
app/procurement/[id]/loading.tsx:6aria-label Loading bid detailsLoading procurement details
app/procurement/[id]/loading.tsx:8sr-only Loading bid details...Loading procurement details...
app/procurement/[id]/page.tsx:159,:191Back to BidsBack to Procurement (×2, PJ-FLAG-1)
app/procurement/[id]/page.tsx:173This bid may have been deleted or you may not have access.This procurement may have…
app/procurement/[id]/page.tsx:176Link Return to BidsReturn to Procurement (PJ-FLAG-1)
app/procurement/[id]/page.tsx:309,:524,:681Delete bidDelete procurement (×3: menuitem, AlertDialogTitle, confirm btn)
app/procurement/[id]/page.tsx:884Add bid details like deadline, estimated value, and reference number…Add procurement details like…
app/procurement/[id]/page.tsx:961Open the drafting session to work through your bid responses……your procurement responses…
app/procurement/[id]/page.tsx:986…record whether the bid was won or lost to track your success rate.…whether the procurement was won or lost…
app/procurement/[id]/page.tsx:1001…worth adding to your knowledge base for future bids.…for future procurements.
app/procurement/[id]/session/error.tsx:37Back to BidsBack to Procurement (PJ-FLAG-1)
app/procurement/[id]/session/page.tsx:400span Back to bidBack to procurement (distinct casing/singular; lockstep w/ bid-session.spec.ts)
app/procurement/[id]/templates/error.tsx:37Back to BidsBack to Procurement (PJ-FLAG-1)
app/procurement/error.tsx:18heading Couldn't load this bidCouldn't load this procurement
app/procurement/error.tsx:19The bid data may be temporarily unavailable. Please try again.The procurement data may be…
app/procurement/loading.tsx:5aria-label Loading bidsLoading procurements
app/procurement/loading.tsx:8sr-only Loading bids...Loading procurements...
app/procurement/page.tsx:77thrown Error Failed to fetch bidsFailed to fetch procurements (user-surfaced via toast)
app/procurement/page.tsx:82toast.error('Failed to load bids')Failed to load procurements
app/procurement/page.tsx:148ErrorBoundary label Error loading bidsError loading procurements
app/procurement/page.tsx:153h1 BidsProcurement (page heading — LOCKSTEP w/ 10 spec assertions)
app/procurement/page.tsx:155Manage bid submissions and tender responses → see PJ-FLAG-2 (LOCKSTEP bid-pipeline.spec:116)
app/procurement/page.tsx:224aria-label Sort bids bySort procurements by
app/procurement/page.tsx:252No bids match the selected filter.No procurements match the selected filter. (LOCKSTEP spec:210)
app/procurement/page.tsx:324h2 No bids yetNo procurements yet
app/procurement/page.tsx:326Create your first bid to start managing tender responses.Create your first procurement to start…
filesiteold → new
components/content/delete-content-dialog.tsx:80…referenced as a source in bid responses……in procurement responses…
components/content/quick-assign-button.tsx:159aria-label Active bid workspacesActive procurement workspaces
components/coverage/template-coverage-content.tsx:218…specific bid template requirements…specific procurement template requirements
components/dashboard/active-procurement-section.tsx:61Active BidsActive Procurements (LOCKSTEP dashboard.spec:107; aria-label :57 already done)
components/dashboard/active-procurement-section.tsx:74Create a new bid to start managing tender responses.Create a new procurement to start…
components/dashboard/content-performance-section.tsx:166-167No bid performance data yet. … cited in bid responses…No procurement performance data yet… cited in procurement responses…
components/dashboard/content-performance-section.tsx:174Draft bid responses using KB contentDraft procurement responses using KB content
components/dashboard/content-performance-section.tsx:175Record bid outcomes (won/lost) on the bid detail pageRecord procurement outcomes (won/lost) on the procurement detail page
components/dashboard/content-performance-section.tsx:221stat label BidsProcurements (label only; unique_bids field at :219 is Unit E)
components/dashboard/content-performance-section.tsx:284…in bids awaiting outcome…in procurements awaiting outcome
components/dashboard/organisation-profile-nudge.tsx:18Add your company profile to improve bid context…to improve procurement context
components/dashboard/organisation-profile-nudge.tsx:97This helps personalise search, intelligence, and bid features.…and procurement features.
components/dashboard/quick-stats-strip.tsx:96-97StatItem singular Active bidActive procurement (INCONSISTENCY: plural branch already “Active procurements”)
components/dashboard/unified-attention-section.tsx:260…and no bids have imminent deadlines.…and no procurements have imminent deadlines.
components/item-detail/content-effectiveness-panel.tsx:219-220…cited in any bid responses. … once this content is used in bids.…procurement responses… used in procurements.
components/item-detail/content-effectiveness-panel.tsx:273label bids used inprocurements used in
components/item-detail/qa-provenance-sections.tsx:33Used in {n} bid{n!==1?'s'}Used in {n} procurement{s} (KEEP pluralization logic)
components/procurement/procurement-creation-wizard.tsx:152setError Failed to create bid (${status})Failed to create procurement (…)
components/procurement/procurement-creation-wizard.tsx:166setError fallback Failed to create bidFailed to create procurement
components/procurement/procurement-creation-wizard.tsx:233Set up a new bid workspace with your bid details.Set up a new procurement workspace with your procurement details.
components/procurement/procurement-creation-wizard.tsx:323placeholder Any additional notes about this bid…about this procurement
components/procurement/procurement-export-menu.tsx:39aria-label Export bid responsesExport procurement responses
components/procurement/procurement-outcome.tsx:158…update the bid status and can optionally flag responses for……update the procurement status…
components/procurement/question-list.tsx:181Manually add a tender question to this bid.…to this procurement.
components/procurement/question-review.tsx:189…a warning icon and may not require a bid response.…may not require a procurement response.
components/procurement/template-field-review.tsx:666aria-label Select a bid question to map to field ${n}Select a procurement question to map…
components/procurement/tender-metadata-prompt.tsx:68toast Tender metadata applied to bidTender metadata applied to procurement
components/provenance/per-item-tab.tsx:268empty-state No bid responses cite this item.No procurement responses cite this item.
components/settings/connections-section.tsx:49Draft bid responses using KB contentDraft procurement responses using KB content
components/settings/connections-section.tsx:306…checking bid status, and drafting responses.…checking procurement status…
components/settings/connections-section.tsx:491…and bid-writing skills. → see PJ-FLAG-3 (craft-term)
components/settings/organisation-section.tsx:258…search, bid writing, and intelligence features. → see PJ-FLAG-3 (craft-term)
components/shell/command-palette.tsx:178Command.Item value="Bids tender management"Procurement tender management (search-keyword string)
components/shell/command-palette.tsx:185visible item label BidsProcurement (nav label, PJ-FLAG-1)
components/browse/search-prompt-cards.tsx:71title: 'Past bid responses' → see PJ-FLAG-4 (LOCKSTEP browse-cards.spec:211; persona-coupled)

NO-CHANGE (already migrated — listed to prevent false edits)

Section titled “NO-CHANGE (already migrated — listed to prevent false edits)”
  • components/provenance/audit-tab.tsx:70 — visible text already Procurement (the value="bid" is Unit D wire value, KEEP-here).
  • components/reader/source-metadata-helpers.ts:18,19 — map VALUES already Procurement library import; keys bid_library/bid_library_import are DEFER (persisted CV, §4).
  • components/dashboard/active-procurement-section.tsx:57 aria-label already Active procurements.
filesiteold → newlockstep?
components/procurement/procurement-list-card.tsx:87data-testid={\bid-card-${bid.id}`}procurement-card-${bid.id}`YES — CRITICAL (LP-1)
components/procurement/procurement-creation-wizard.tsx:251,:255htmlFor/id="wizard-bid-name"wizard-procurement-nameYES — CRITICAL (LP-2)
components/procurement/procurement-creation-wizard.tsx:267,:272htmlFor/id="wizard-bid-buyer"wizard-procurement-buyerYES — CRITICAL (LP-3)
components/procurement/procurement-creation-wizard.tsx:283,:285wizard-bid-deadlinewizard-procurement-deadlineno (label/input pair only)
components/procurement/procurement-creation-wizard.tsx:294,:296wizard-bid-referencewizard-procurement-referenceno
components/procurement/procurement-creation-wizard.tsx:306,:308wizard-bid-valuewizard-procurement-valueno
components/procurement/procurement-creation-wizard.tsx:318,:320wizard-bid-noteswizard-procurement-notesno
app/procurement/[id]/page.tsx:370,:406id=\bid-tab-${tab.id}`aria-labelledby=`bid-tab-${activeTab}`procurement-tab-${…}`internal ARIA pair — rename together, NO e2e
app/procurement/[id]/page.tsx:372,:405aria-controls="bid-tabpanel"id="bid-tabpanel"procurement-tabpanelinternal ARIA pair — rename together, NO e2e

NOTE: register row 89 maps these tab ids to procurement-tabpanel/procurement-tab-${activeTab} (Unit A scope per register, but they are still bid-* in the checkout ⇒ land in F if A did not). VERIFY post-A: grep 'bid-tab' app/procurement/[id]/page.tsx; if already renamed, skip.

filesiteold → newnotes
e2e/helpers/selectors.ts:63 (block key)bid:procurement:DEAD file (no importers) — cosmetic only
e2e/helpers/selectors.ts:64bidList: '[data-testid="bid-list"]'procurementList: '[data-testid="procurement-list"]'ORPHAN (no producer)
e2e/helpers/selectors.ts:65bidCard: '[data-testid="bid-card"]'procurementCard: '[data-testid="procurement-card"]'align w/ renamed producer (suffixed)
e2e/helpers/selectors.ts:66newBidButton: 'button:has-text("New Procurement")' → key→newProcurementButton (value unchanged)
e2e/helpers/selectors.ts:67procurementName: '[data-testid="bid-name"]' → value→procurement-nameORPHAN
e2e/helpers/selectors.ts:68procurementStatus: '[data-testid="bid-status"]' → value→procurement-statusORPHAN
e2e/helpers/selectors.ts:19bidsLink: 'a[href="/procurement"]' → key→procurementLink (value unchanged, href already /procurement)nav block
e2e/tests/bid-pipeline.spec.ts:128,:567getByTestId(\bid-card-${id}`)procurement-card-${id}`LP-1
e2e/tests/bid-pipeline.spec.ts:183,:220 (+126 comment)[data-testid^="bid-card-"] worker-card locators → procurement-card- prefixLP-1
e2e/tests/bid-pipeline.spec.ts:304,:671dialog.locator('#wizard-bid-name')#wizard-procurement-nameLP-2
e2e/tests/bid-pipeline.spec.ts:309,:674dialog.locator('#wizard-bid-buyer')#wizard-procurement-buyerLP-3
e2e/tests/dashboard.spec.ts:102,:127,:154,:343,:385section[aria-label="Active bids"]section[aria-label="Active procurements"]LP-4 — ALREADY BROKEN vs source; HIGHEST PRIORITY
filesiteold → newpairs with (producer)
e2e/tests/bid-pipeline.spec.ts:111,:147,:240,:257,:281,:466,:479,:492,:648 (×9)getByRole('heading',{name:'Bids'})name:'Procurement'page.tsx:153 h1 (LP-5)
e2e/tests/workspaces.spec.ts:100getByRole('heading',{name:'Bids'})name:'Procurement'page.tsx:153 h1 (LP-5)
e2e/tests/bid-pipeline.spec.ts:116getByText('Manage bid submissions and tender responses') → match PJ-FLAG-2 stringpage.tsx:155 (LP-6)
e2e/tests/bid-pipeline.spec.ts:210getByText('No bids match the selected filter.')'No procurements match the selected filter.'page.tsx:252 (LP-7)
e2e/tests/bid-pipeline.spec.ts:448getByRole('link',{name:'Back to Bids'})name:'Back to Procurement'page.tsx:159/191 + 3 error.tsx (LP-8)
e2e/tests/bid-pipeline.spec.ts:545getByRole('menuitem',{name:'Delete bid'})name:'Delete procurement'page.tsx:309/524/681 (LP-9)
e2e/tests/bid-session.spec.ts:49,:370getByRole('link',{name:/Back to bid/i})/Back to procurement/isession/page.tsx:400 span (LP-10)
e2e/tests/dashboard.spec.ts:107getByText('Active Bids')'Active Procurements'active-procurement-section.tsx:61 (LP-4)
e2e/tests/dashboard.spec.ts:174healthSection.getByText(/Active bids?/)/Active procurements?/dashboard health label (verify which copy; likely content-performance “Bids”)
e2e/tests/workspaces.spec.ts:70bidsCard.getByText(/bid responses/)/procurement responses/workspaces procurement-card descriptor copy
e2e/tests/browse-cards.spec.ts:211 (+204 comment)getByRole('button',{name:/^Past bid responses:/i})/^Past procurement responses:/isearch-prompt-cards.tsx:71 (LP-11, PJ-FLAG-4)

NO-CHANGE in specs (already “Procurement”/route already /procurement — do NOT touch): New Procurement button text (bid-pipeline 244/261/285/471/484/497/655), Create New Procurement dialog (249/661), Procurement Name/Buyer labels (267-268), Procurement progress stepper (368), Procurement sections tablist (387 + bid-questions.spec.ts), Temp/Test Procurement headings, all /procurement + /procurement/${id} routes/goto/toHaveURL.

(e) BARE-WORD IDENTIFIERS (F-rename only: bidprocurement, bidsprocurements)

Section titled “(e) BARE-WORD IDENTIFIERS (F-rename only: bid→procurement, bids→procurements)”

Per DECISION-REGISTER row 87 + STRATEGY §1(L17): every bare-word bid/bids loop-var / param / local / prop / shorthand here binds a Procurement/ProcurementSummary workspace object ⇒ graph-tracked pure rename. There is NO bl-370/persisted deferral for any bare-word loop/local/prop var (0 such items). Use scope-aware gitnexus_rename (register warns it “collides with form_type CV value + DEFER tokens” — confirm scope per call).

filesitesrename
app/procurement/page.tsx:95,:96; :142-144; :256,:257; :262,:263; :338,:339,:341,:346,:351bidprocurement (filter cb param, handleProcurementCreated param, map params + JSX bid={bid}, ProcurementListRow destructured prop + accesses)
app/procurement/[id]/page.tsx:93; :199,:286,:332,:494,:506,:515,:725,:829,:861,:864,:894; :410 (JSX prop); :526; :691,:707 (param+type)bidprocurement
app/procurement/[id]/session/page.tsx:174; :266,:267,:269,:356bidprocurement
components/procurement/procurement-list-card.tsx:38 (param), :49,:50,:51,:52,:99,:102bidprocurement
components/procurement/procurement-creation-wizard.tsx:28 (onCreated:(bid:{id,name}) param type)bidprocurement
components/procurement/procurement-context-provider.tsx:55 (ctx-value type prop), :80 (useState), :220 (shorthand)bidprocurement (register row 87 explicit)
components/dashboard/active-procurement-section.tsx:53 (bids prop), :64,:85,:85-93,:96,:97 (bids.map((bid)=>…), toProcurement(bid))bidsprocurements / bidprocurement
lib/mcp/formatters/procurements.ts:52,:53,:55-114 (param bid:ProcurementDetail + ~25 accesses + for…of bid.sections)bidprocurement
lib/mcp/formatters/dashboard.ts:127,:129,:136,:140-157 (param bids + loop); :234-250 (2nd loop var)bidsprocurements / bidprocurement
lib/mcp/formatters/apps.ts:142,:144-166 (for…of data.procurements loop var)bidprocurement
lib/domains/procurement/procurement-export-data.ts:52 (destructure), :111,:116,:120,:167bidprocurement
hooks/procurement/use-procurement-actions.ts:108 (return prop), :126 (param), :168,:291,:319,:591,:593,:625bidprocurement
hooks/procurement/use-procurement-session.ts:71 (return-type prop), :122 (local), :209 (shorthand)bidprocurement

(f) STALE COMMENTS / JSDoc — /api/bids route tags

Section titled “(f) STALE COMMENTS / JSDoc — /api/bids route tags”

JUDGMENT CALL — STRATEGY assigns these to NO unit (not F, not A–E). Live route is app/api/procurement (no app/api/bids dir). Stale-but-inert (comments don’t route; handlers imported directly in tests; e2e fetches real path). RECOMMENDATION: split into a separate doc/test-URL hygiene sweep, NOT Unit F. Listed here for completeness; executor should NOT fold these into F unless owner explicitly expands scope.

fileapprox sitesold → new
lib/validation/schemas.ts19 JSDoc lines (851,862,890,896,910,921,931,938,944,950,955,976,981,987,994,1064,1074,2006,2158)/api/bids/…/api/procurement/…
lib/queue/handlers/procurement-draft-all.ts:7,:63 (source-of-truth pointer)app/api/bids/…app/api/procurement/…
tests/api/*~16 files, ~76 lines (describe block names + JSDoc)/api/bids/…/api/procurement/…
tests/integration/queue/procurement-draft-all.integration.test.ts:198 (Request URL, cosmetic)/api/bids/${id}/…/api/procurement/${id}/…
tests/integration/ingest-source-fan-out.integration.test.ts:13 (JSDoc)app/api/bids/[id]/…app/api/procurement/[id]/…
tests/scripts/codemods/fixtures/wrap-define-route/multi-body.ts:5 (JSDoc)app/api/bids/route.tsapp/api/procurement/route.ts
e2e (comments + assertion-message strings)bid-pipeline.spec.ts:670,693; bid-draft-all.spec.ts:115; role-write-enforcement.spec.ts:8,22,36,270,305; bid-draft-stream.spec.ts:12,14,115,122/api/bids/api/procurement in comments/messages

NOTE: schemas.ts has NO bid-bearing strategy/enum STRING LITERALS to change. The only bid VALUES there (type='bid' comment L1016/1048/1054, VALID_BID_STATUSES L2007/2021) are ratified KEEP.

(g) BUNDLE-COPY — MCP-app source (form-dashboard + reorient-me); REQUIRES build:mcp-apps regen

Section titled “(g) BUNDLE-COPY — MCP-app source (form-dashboard + reorient-me); REQUIRES build:mcp-apps regen”

mcp-apps/form-dashboard/src/app.ts (visible copy)

Section titled “mcp-apps/form-dashboard/src/app.ts (visible copy)”
siteold → new
:23new App({ name: 'Bid Dashboard' })'Procurement Dashboard'
:56'No bid data available.''No procurement data available.'
:74'Failed to parse bid data.''Failed to parse procurement data.'
:83'Bid dashboard request was cancelled.''Procurement dashboard request was cancelled.'
:114aria-label 'Loading bid data''Loading procurement data'
:121'Waiting for bid data…''Waiting for procurement data…'
:162title.textContent = 'Bid Dashboard''Procurement Dashboard'
:164'Active bids with progress and deadline tracking''Active procurements with…'
:179'No active bids found.''No active procurements found.'
:185aria-label 'Active bids''Active procurements'
:197aria-label 'Bid pipeline summary''Procurement pipeline summary'
:211{ label: 'Total Bids' }'Total Procurements'
:415'Loading bid detail…''Loading procurement detail…'
:453prompt Show me the full detail for the ${name} bid.…${name} procurement.
:1057error Failed to load bid detailFailed to load procurement detail

mcp-apps/reorient-me/src/app.ts (visible copy)

Section titled “mcp-apps/reorient-me/src/app.ts (visible copy)”
siteold → new
:314,:347prompt …in the ${title} bid. Start with……${title} procurement.
:320,:334button 'Show bid detail''Show procurement detail' (×2)
:434dynamic title …in ${entity_title} bid…in ${entity_title} procurement
:453,:511button 'View bid''View procurement' (×2)
:537h2 innerHTML 💼 Active Bids💼 Active Procurements
:597prompt …for the ${name} bid. Look at the questions……${name} procurement.

MCP-app source bare-word vars + types (same files → fold into the SAME regen edit)

Section titled “MCP-app source bare-word vars + types (same files → fold into the SAME regen edit)”
filesitesrename
mcp-apps/form-dashboard/src/app.ts:187,:188 (for…of sortedBids, buildBidCard(bid)); :151,:170,:173 (sortedBids local); :194,:200,:203,:204 (buildSummaryBar(bids)); :248,:249-296 (buildBidCard(bid)); :347,:354-398; :1075,:1076,:1085bidprocurement, bidsprocurements, sortedBidssortedProcurements
mcp-apps/form-dashboard/src/app.ts:27,:64,:94,:250,:313,:314 (expandedBid + ?.bidId); :65,:250 (bidId field)expandedBidexpandedProcurement, bidIdprocurementId (type-coupled — see PJ-FLAG-5)
mcp-apps/reorient-me/src/app.ts:534,:543 (buildBidSummarySection(bids:BidBriefing[])); :543,:547-597 (for…of bids loop var + ~18 accesses)bidsprocurements, bidprocurement

2. LOCKSTEP PAIRS (must change in the SAME commit or e2e-smoke goes red)

Section titled “2. LOCKSTEP PAIRS (must change in the SAME commit or e2e-smoke goes red)”
#DOM-id producer / copy sourcee2e selector(s)e2e copy assertion(s)priority
LP-1procurement-list-card.tsx:87 bid-card-${id}procurement-card-${id}bid-pipeline.spec.ts:128,567,183,220 (+126 cmt); selectors.ts:65 (dead)CRITICAL
LP-2wizard id="wizard-bid-name" (creation-wizard:251,255)bid-pipeline.spec.ts:304,671CRITICAL
LP-3wizard id="wizard-bid-buyer" (creation-wizard:267,272)bid-pipeline.spec.ts:309,674CRITICAL
LP-4active-procurement-section.tsx:61 Active BidsActive Procurements (aria-label :57 ALREADY done)dashboard.spec.ts:102,127,154,343,385 aria-label="Active bids""Active procurements" (already broken vs source)dashboard.spec.ts:107 'Active Bids''Active Procurements'HIGHEST (pre-existing red)
LP-5app/procurement/page.tsx:153 h1 BidsProcurementbid-pipeline.spec.ts:111,147,240,257,281,466,479,492,648 + workspaces.spec.ts:100 (×10)CRITICAL
LP-6app/procurement/page.tsx:155 Manage bid submissions… (PJ-FLAG-2)bid-pipeline.spec.ts:116HIGH
LP-7app/procurement/page.tsx:252 No bids match…bid-pipeline.spec.ts:210HIGH
LP-8page.tsx:159,191 + [id]/error.tsx:37 + [id]/templates/error.tsx:37 + [id]/session/error.tsx:37 Back to Bids (+ :176 Return to Bids)bid-pipeline.spec.ts:448HIGH
LP-9page.tsx:309,524,681 Delete bid (×3)bid-pipeline.spec.ts:545HIGH
LP-10session/page.tsx:400 span Back to bidbid-session.spec.ts:49,370 /Back to bid/iHIGH
LP-11search-prompt-cards.tsx:71 Past bid responses (PJ-FLAG-4)browse-cards.spec.ts:211 (+204 cmt)MEDIUM
LP-12content-performance / dashboard health “Active bids” labeldashboard.spec.ts:174 /Active bids?/MEDIUM (verify exact source label)
LP-13workspaces procurement-card “bid responses” descriptor copyworkspaces.spec.ts:70 /bid responses/MEDIUM (locate exact source copy)

3. bun run build:mcp-apps REGEN — REQUIRED

Section titled “3. bun run build:mcp-apps REGEN — REQUIRED”

YES — Unit F triggers a bundle regen. The form-dashboard title/strings + reorient-me “Active Bids”/“View bid”/“Show bid detail” + the bare-word/type renames in §1(g) are compiled into lib/mcp/app-bundles.ts.

Procedure (NEVER hand-edit app-bundles.ts — it is minified + sandbox read-denied = generated):

  1. Edit mcp-apps/form-dashboard/src/{app.ts,types.ts} + mcp-apps/reorient-me/src/{app.ts,types.ts}.
  2. Run bun run build:mcp-apps.
  3. Commit the regenerated app-bundles.ts alongside the source edits.

MUST PRESERVE prior-unit regen content (the regen overwrites the whole bundle — verify the diff only adds Unit F changes, does not revert C/D):

  • Unit C already landed procurement_deadline (reorient-me source + bundle ==="procurement_deadline" branches). The F regen MUST keep procurement_deadline (do not let a stale source reintroduce bid_deadline).
  • Unit D already landed data.procurements (form-dashboard wire field procurements:). The F regen MUST keep data.procurements / procurements:.
  • Confirm with gitnexus_detect_changes + a grep 'bid_deadline\|data\.bids\|"bids"' lib/mcp/app-bundles.ts returning ZERO after regen (those were C/D, must stay renamed).

4. OUT-OF-SCOPE / DEFERRED (do NOT touch in Unit F)

Section titled “4. OUT-OF-SCOPE / DEFERRED (do NOT touch in Unit F)”
ItemSites (examples)Why deferred / kept
from_bid URL param + derived (fromBidId, fromBidWorkspace, fromBid)session/page.tsx:408, browse-content.tsx:65,66, use-browse-filters.ts, content-{card,grid,row,list}.tsx, quick-assign-button.tsx; e2e: bid-session.spec.ts:325,381-432 (whole from_bid URL parameter persistence describe block)Own ticket w/ redirect shim (bookmarkable URL). Renaming 404s live bookmarks. Leave param + ALL its assertions unchanged. (REGISTER §4, STRATEGY §2 Item-list + DEFER)
--bid-* design tokens + bg/text/border-bid-* classesdomain-tokens.css, procurement-list-card.tsx classNames, procurement-workflow.ts:40-55, app/procurement/page.tsx:371, app-bundles.ts:181 tokenOwned by bl-349 (rebrand visual pass). CSS-var literal sweep + @theme + utility-class rename. (REGISTER §4)
Persisted CV / CHECK / JSONB / localStorage literalsbid_writing (persona CV), bid_library/bid_library_import (ingestion_source + map keys), LAYER_BID_DETAIL/bid_detail (layer_vocabulary CV), bid_discovered (lifecycle), prior_bid_response (q_a_extractions CHECK), kb-bid-view (localStorage), source_bid_id/source_bid_name (write-only JSONB)bl-370 / own backfill tickets — value-coupled to persisted data. Each needs a migration/back-compat read. (REGISTER §4, STRATEGY §2 Item 4/6)
KEEP-list (ratified vocabulary — never rename)VALID_BID_STATUSES/TERMINAL_BID_STATUSES (const+values); bid_response reorient union tag (types/reorient.ts + emit/validator net incl. reorient-me source + audit-tab.tsx:70 value="bid"); bid as form_types CV value; ws.type !== 'bid' (hooks/use-quick-assign.ts:44, legacy wire-alias); _s224..._bid_draft_all migration-filename JSDocRatified KEEP. (REGISTER §3, STRATEGY §5 KEEP)
/api/bids route POST path + /bid/<uuid> redirect regexbid-pipeline.spec.ts:689 /\/api\/bids$/, :696/700/703 /bid/<uuid> nav targetUnit D (REST path — check if D renamed /api/bids/api/procurement; if so :689/693 follow D, NOT F) + the /bid/<uuid> redirect-shim stays deferred. NOT F.
workspaces table type='bid'bid-pipeline.spec.ts:707,716 row.type).toBe('bid')DB enum value = Unit E migration scope. NOT F.
Spec FILENAMES (bid-*.spec.ts ×8)bid-pipeline/draft-all/draft-stream/export/questions/session.spec.tsFile renames NOT in F scope; blocked by client-name/find-replace guard. Separate dedicated rename pass.
Stale /api/bids JSDoc/comments (§1f)schemas.ts, queue handler, tests/api/*, e2e commentsSTRATEGY assigns to NO unit. Recommend separate doc-hygiene sweep. (JUDGMENT CALL)
Type-name decision (mcp-apps-local)BidSummary/BidDashboardData (form-dashboard/src/types.ts:11), ExpandedBidState+bidId field (types.ts:101), BidBriefing (reorient-me/src/types.ts:59), ClientBidSummary (tests/mcp/mcp-app-contracts.test.ts:65,82)NOT register-enumerated. See PJ-FLAG-5.

Type-name decision (PJ-FLAG-5) — RECOMMEND RENAME (with rationale)

Section titled “Type-name decision (PJ-FLAG-5) — RECOMMEND RENAME (with rationale)”

The mcp-apps-local types BidSummary/BidDashboardData/ExpandedBidState(+bidId)/BidBriefing are pure TS type names with no persisted/wire coupling (the wire field procurements: was already renamed in Unit D; these annotate the parsed client shape). They are NOT in the register (register enumerates only app-side ActiveBidSummaryActiveProcurementSummary row 32, buildBidSummarybuildProcurementSummary row 47). STRATEGY §1(L17) says type names are graph-tracked pure-renames that “ride together safely.” Recommendation: RENAME them (→ ProcurementSummary/ProcurementDashboardData/ExpandedProcurementState+procurementId/ ProcurementBriefing/ClientProcurementSummary) for consistency with the bare-word vars they annotate — renaming the var but leaving BidSummary is half-done. FLAG FOR OWNER RATIFICATION since not register-enumerated. If renamed: edit mcp-apps source + types.ts, lockstep the mcp-app-contracts.test.ts:65,82 ClientBidSummary, then bun run build:mcp-apps. ALSO VERIFY: bid_summary field in reorient-me/src/types.ts:8 + app.ts:228 — register §1 bid_summaryprocurement_summary covers types/reorient.ts:13 but NOT the mcp-apps mirror; confirm whether Unit C renamed it (Unit C routed reorient-me source for bid_deadline). If not done, it is an F source-edit (regen-gated).


5. PRODUCT-JUDGMENT FLAGS (need Liam’s voice decision — NOT mechanical Bids→Procurement)

Section titled “5. PRODUCT-JUDGMENT FLAGS (need Liam’s voice decision — NOT mechanical Bids→Procurement)”
  • PJ-FLAG-1 — Nav noun singular vs plural. Nav labels Bids/Back to Bids/Return to Bids/command-palette BidsProcurement (singular, matches route /procurement + h1) vs dashboard sections use plural Active Procurements. The surface is already inconsistent today. Need a deliberate canonical nav-noun decision (singular “Procurement” recommended for nav/headings; plural “Procurements” for counts/lists).
  • PJ-FLAG-2 — app/procurement/page.tsx:155 “Manage bid submissions and tender responses”. Naive swap → “Manage procurement submissions and tender responses” reads oddly (“procurement submissions”). Product-voice rephrase needed (e.g. “Manage your tender responses and submissions”). LOCKSTEP with bid-pipeline.spec.ts:116 — assertion must match whatever copy is chosen.
  • PJ-FLAG-3 — “bid-writing”/“bid writing” craft term (connections-section.tsx:491 “bid-writing skills”, organisation-section.tsx:258 “bid writing”). “bid-writing” is an established craft/industry term; “procurement-writing” reads awkwardly. Decide: keep craft term, or rephrase (e.g. “proposal-writing” / “tender-writing” / “procurement features”).
  • PJ-FLAG-4 — search-prompt-cards.tsx:71 “Past bid responses”. (i) Craft-term phrasing (“Past procurement responses” reads oddly). (ii) The card lives in the BID_WRITING_CARDS persona cluster — the persona key bid_writing + card id: 'bid-writing-*' are DEFER (persisted CV), only the title copy is F-eligible. LOCKSTEP browse-cards.spec.ts:211. Confirm phrasing + that only the title (not id/persona) changes.
  • PJ-FLAG-5 — mcp-apps-local type names (BidSummary/BidDashboardData/ExpandedBidState/BidBriefing + bidId field + ClientBidSummary test). Not register-enumerated. Recommend rename for consistency (§4 above); needs owner ratification.

6. FORCING FUNCTION — e2e-smoke (staging) is the GATE

Section titled “6. FORCING FUNCTION — e2e-smoke (staging) is the GATE”

Per STRATEGY §1(Unit F row) + §4(Risk: e2e copy/selector drift) + §5(Phase 6): e2e-smoke on staging is the closing gate. Copy + selector lockstep pairs (§2) MUST land together or smoke goes red. Also runs bun run test (component/unit) + mcp-build (bundle freshness after regen).

e2e specs that MUST pass (touched by Unit F lockstep):

  • e2e/tests/bid-pipeline.spec.ts (LP-1,2,3,5,6,7,8,9 — heaviest)
  • e2e/tests/dashboard.spec.ts (LP-4, LP-12 — incl. the pre-existing-broken Active bids selector)
  • e2e/tests/workspaces.spec.ts (LP-5, LP-13)
  • e2e/tests/bid-session.spec.ts (LP-10 — but LEAVE the from_bid describe block untouched)
  • e2e/tests/browse-cards.spec.ts (LP-11 — coordinate with PJ-FLAG-4)

Pre-flight before committing: gitnexus_detect_changes({scope:'compare', base_ref:'main'}) to confirm the diff touches only expected symbols/flows; ast-dataflow rename-sweep VERDICT for the bare-word (§e) + type-name (§4/PJ-5) renames; and the regen-preservation grep in §3.