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.
ID-61 Unit F — Executor Scope Map
Section titled “ID-61 Unit F — Executor Scope Map”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)”e2e/helpers/selectors.tsEXISTS (Sweep 5 wrongly said it doesn’t; Sweep 3 correct). Thebid:block is at lines 62–78. BUTselectorsis NOT imported by any spec or helper (grepfor imports = zero hits) — the whole export is dead/unused. Specs use inline locators. ⇒ Renaming thebid:block is cosmetic-consistency only, NOT lockstep- critical. Safe to rename keys OR delete the block; recommend rename for consistency.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 isbid-card-${bid.id}.- The ONLY real DOM-id producers with
bid:procurement-list-card.tsx:87data-testid={\bid-card-${bid.id}`}; thewizard-bid-*id/htmlFor pairs (×6) inprocurement-creation-wizard.tsx; the ARIA tab pair inprocurement/[id]/page.tsx` (370/372/405/406). active-procurement-section.tsx:57aria-label is ALREADY"Active procurements"(renamed by a prior unit) but visible copy at:61is stillActive Bids. ⇒dashboard.spec.ts:102,127,154,343,385targetingsection[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:61copy + its text assertiondashboard.spec.ts:107.content-performance-section.tsx:221<p>Bids</p>bindsoverall.unique_bids(:219). The visible label “Bids” is Unit F copy; theunique_bidsFIELD is Unit E (DB). Separable — only the label text changes in F.Past bid responses(search-prompt-cards.tsx:71) lives insideBID_WRITING_CARDS(thebid_writingpersona cluster = DEFER). Thetitlestring is visible copy (F-eligible); the persona keybid_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)”| file | site | old → new |
|---|---|---|
| app/library/library-content.tsx | :580 | …build your bid response library. → …build your procurement response library. |
| app/procurement/[id]/error.tsx | :27 | Couldn't load bid details → Couldn't load procurement details |
| app/procurement/[id]/error.tsx | :30 | This bid may have been deleted or you may not have access. → This procurement may have… |
| app/procurement/[id]/error.tsx | :37 | Link Back to Bids → Back to Procurement (nav label — see PJ-FLAG-1) |
| app/procurement/[id]/loading.tsx | :6 | aria-label Loading bid details → Loading procurement details |
| app/procurement/[id]/loading.tsx | :8 | sr-only Loading bid details... → Loading procurement details... |
| app/procurement/[id]/page.tsx | :159,:191 | Back to Bids → Back to Procurement (×2, PJ-FLAG-1) |
| app/procurement/[id]/page.tsx | :173 | This bid may have been deleted or you may not have access. → This procurement may have… |
| app/procurement/[id]/page.tsx | :176 | Link Return to Bids → Return to Procurement (PJ-FLAG-1) |
| app/procurement/[id]/page.tsx | :309,:524,:681 | Delete bid → Delete procurement (×3: menuitem, AlertDialogTitle, confirm btn) |
| app/procurement/[id]/page.tsx | :884 | Add bid details like deadline, estimated value, and reference number… → Add procurement details like… |
| app/procurement/[id]/page.tsx | :961 | Open 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 | :37 | Back to Bids → Back to Procurement (PJ-FLAG-1) |
| app/procurement/[id]/session/page.tsx | :400 | span Back to bid → Back to procurement (distinct casing/singular; lockstep w/ bid-session.spec.ts) |
| app/procurement/[id]/templates/error.tsx | :37 | Back to Bids → Back to Procurement (PJ-FLAG-1) |
| app/procurement/error.tsx | :18 | heading Couldn't load this bid → Couldn't load this procurement |
| app/procurement/error.tsx | :19 | The bid data may be temporarily unavailable. Please try again. → The procurement data may be… |
| app/procurement/loading.tsx | :5 | aria-label Loading bids → Loading procurements |
| app/procurement/loading.tsx | :8 | sr-only Loading bids... → Loading procurements... |
| app/procurement/page.tsx | :77 | thrown Error Failed to fetch bids → Failed to fetch procurements (user-surfaced via toast) |
| app/procurement/page.tsx | :82 | toast.error('Failed to load bids') → Failed to load procurements |
| app/procurement/page.tsx | :148 | ErrorBoundary label Error loading bids → Error loading procurements |
| app/procurement/page.tsx | :153 | h1 Bids → Procurement (page heading — LOCKSTEP w/ 10 spec assertions) |
| app/procurement/page.tsx | :155 | Manage bid submissions and tender responses → see PJ-FLAG-2 (LOCKSTEP bid-pipeline.spec:116) |
| app/procurement/page.tsx | :224 | aria-label Sort bids by → Sort procurements by |
| app/procurement/page.tsx | :252 | No bids match the selected filter. → No procurements match the selected filter. (LOCKSTEP spec:210) |
| app/procurement/page.tsx | :324 | h2 No bids yet → No procurements yet |
| app/procurement/page.tsx | :326 | Create your first bid to start managing tender responses. → Create your first procurement to start… |
components/
Section titled “components/”| file | site | old → new |
|---|---|---|
| components/content/delete-content-dialog.tsx | :80 | …referenced as a source in bid responses… → …in procurement responses… |
| components/content/quick-assign-button.tsx | :159 | aria-label Active bid workspaces → Active procurement workspaces |
| components/coverage/template-coverage-content.tsx | :218 | …specific bid template requirements → …specific procurement template requirements |
| components/dashboard/active-procurement-section.tsx | :61 | Active Bids → Active Procurements (LOCKSTEP dashboard.spec:107; aria-label :57 already done) |
| components/dashboard/active-procurement-section.tsx | :74 | Create a new bid to start managing tender responses. → Create a new procurement to start… |
| components/dashboard/content-performance-section.tsx | :166-167 | No bid performance data yet. … cited in bid responses… → No procurement performance data yet… cited in procurement responses… |
| components/dashboard/content-performance-section.tsx | :174 | Draft bid responses using KB content → Draft procurement responses using KB content |
| components/dashboard/content-performance-section.tsx | :175 | Record bid outcomes (won/lost) on the bid detail page → Record procurement outcomes (won/lost) on the procurement detail page |
| components/dashboard/content-performance-section.tsx | :221 | stat label Bids → Procurements (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 | :18 | Add your company profile to improve bid context → …to improve procurement context |
| components/dashboard/organisation-profile-nudge.tsx | :97 | This helps personalise search, intelligence, and bid features. → …and procurement features. |
| components/dashboard/quick-stats-strip.tsx | :96-97 | StatItem singular Active bid → Active 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 | :273 | label bids used in → procurements used in |
| components/item-detail/qa-provenance-sections.tsx | :33 | Used in {n} bid{n!==1?'s'} → Used in {n} procurement{s} (KEEP pluralization logic) |
| components/procurement/procurement-creation-wizard.tsx | :152 | setError Failed to create bid (${status}) → Failed to create procurement (…) |
| components/procurement/procurement-creation-wizard.tsx | :166 | setError fallback Failed to create bid → Failed to create procurement |
| components/procurement/procurement-creation-wizard.tsx | :233 | Set 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 | :323 | placeholder Any additional notes about this bid → …about this procurement |
| components/procurement/procurement-export-menu.tsx | :39 | aria-label Export bid responses → Export 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 | :181 | Manually 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 | :666 | aria-label Select a bid question to map to field ${n} → Select a procurement question to map… |
| components/procurement/tender-metadata-prompt.tsx | :68 | toast Tender metadata applied to bid → Tender metadata applied to procurement |
| components/provenance/per-item-tab.tsx | :268 | empty-state No bid responses cite this item. → No procurement responses cite this item. |
| components/settings/connections-section.tsx | :49 | Draft bid responses using KB content → Draft 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 | :178 | Command.Item value="Bids tender management" → Procurement tender management (search-keyword string) |
| components/shell/command-palette.tsx | :185 | visible item label Bids → Procurement (nav label, PJ-FLAG-1) |
| components/browse/search-prompt-cards.tsx | :71 | title: '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 alreadyProcurement(thevalue="bid"is Unit D wire value, KEEP-here).components/reader/source-metadata-helpers.ts:18,19— map VALUES alreadyProcurement library import; keysbid_library/bid_library_importare DEFER (persisted CV, §4).components/dashboard/active-procurement-section.tsx:57aria-label alreadyActive procurements.
(b) DOM / TEST IDS
Section titled “(b) DOM / TEST IDS”| file | site | old → new | lockstep? |
|---|---|---|---|
| components/procurement/procurement-list-card.tsx | :87 | data-testid={\bid-card-${bid.id}`}→procurement-card-${bid.id}` | YES — CRITICAL (LP-1) |
| components/procurement/procurement-creation-wizard.tsx | :251,:255 | htmlFor/id="wizard-bid-name" → wizard-procurement-name | YES — CRITICAL (LP-2) |
| components/procurement/procurement-creation-wizard.tsx | :267,:272 | htmlFor/id="wizard-bid-buyer" → wizard-procurement-buyer | YES — CRITICAL (LP-3) |
| components/procurement/procurement-creation-wizard.tsx | :283,:285 | wizard-bid-deadline → wizard-procurement-deadline | no (label/input pair only) |
| components/procurement/procurement-creation-wizard.tsx | :294,:296 | wizard-bid-reference → wizard-procurement-reference | no |
| components/procurement/procurement-creation-wizard.tsx | :306,:308 | wizard-bid-value → wizard-procurement-value | no |
| components/procurement/procurement-creation-wizard.tsx | :318,:320 | wizard-bid-notes → wizard-procurement-notes | no |
| app/procurement/[id]/page.tsx | :370,:406 | id=\bid-tab-${tab.id}`⇄aria-labelledby=`bid-tab-${activeTab}`→procurement-tab-${…}` | internal ARIA pair — rename together, NO e2e |
| app/procurement/[id]/page.tsx | :372,:405 | aria-controls="bid-tabpanel" ⇄ id="bid-tabpanel" → procurement-tabpanel | internal 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.
(c) e2e SELECTORS
Section titled “(c) e2e SELECTORS”| file | site | old → new | notes |
|---|---|---|---|
| e2e/helpers/selectors.ts | :63 (block key) | bid: → procurement: | DEAD file (no importers) — cosmetic only |
| e2e/helpers/selectors.ts | :64 | bidList: '[data-testid="bid-list"]' → procurementList: '[data-testid="procurement-list"]' | ORPHAN (no producer) |
| e2e/helpers/selectors.ts | :65 | bidCard: '[data-testid="bid-card"]' → procurementCard: '[data-testid="procurement-card"]' | align w/ renamed producer (suffixed) |
| e2e/helpers/selectors.ts | :66 | newBidButton: 'button:has-text("New Procurement")' → key→newProcurementButton (value unchanged) | |
| e2e/helpers/selectors.ts | :67 | procurementName: '[data-testid="bid-name"]' → value→procurement-name | ORPHAN |
| e2e/helpers/selectors.ts | :68 | procurementStatus: '[data-testid="bid-status"]' → value→procurement-status | ORPHAN |
| e2e/helpers/selectors.ts | :19 | bidsLink: 'a[href="/procurement"]' → key→procurementLink (value unchanged, href already /procurement) | nav block |
| e2e/tests/bid-pipeline.spec.ts | :128,:567 | getByTestId(\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- prefix | LP-1 |
| e2e/tests/bid-pipeline.spec.ts | :304,:671 | dialog.locator('#wizard-bid-name') → #wizard-procurement-name | LP-2 |
| e2e/tests/bid-pipeline.spec.ts | :309,:674 | dialog.locator('#wizard-bid-buyer') → #wizard-procurement-buyer | LP-3 |
| e2e/tests/dashboard.spec.ts | :102,:127,:154,:343,:385 | section[aria-label="Active bids"] → section[aria-label="Active procurements"] | LP-4 — ALREADY BROKEN vs source; HIGHEST PRIORITY |
(d) e2e COPY ASSERTIONS
Section titled “(d) e2e COPY ASSERTIONS”| file | site | old → new | pairs 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 | :100 | getByRole('heading',{name:'Bids'}) → name:'Procurement' | page.tsx:153 h1 (LP-5) |
| e2e/tests/bid-pipeline.spec.ts | :116 | getByText('Manage bid submissions and tender responses') → match PJ-FLAG-2 string | page.tsx:155 (LP-6) |
| e2e/tests/bid-pipeline.spec.ts | :210 | getByText('No bids match the selected filter.') → 'No procurements match the selected filter.' | page.tsx:252 (LP-7) |
| e2e/tests/bid-pipeline.spec.ts | :448 | getByRole('link',{name:'Back to Bids'}) → name:'Back to Procurement' | page.tsx:159/191 + 3 error.tsx (LP-8) |
| e2e/tests/bid-pipeline.spec.ts | :545 | getByRole('menuitem',{name:'Delete bid'}) → name:'Delete procurement' | page.tsx:309/524/681 (LP-9) |
| e2e/tests/bid-session.spec.ts | :49,:370 | getByRole('link',{name:/Back to bid/i}) → /Back to procurement/i | session/page.tsx:400 span (LP-10) |
| e2e/tests/dashboard.spec.ts | :107 | getByText('Active Bids') → 'Active Procurements' | active-procurement-section.tsx:61 (LP-4) |
| e2e/tests/dashboard.spec.ts | :174 | healthSection.getByText(/Active bids?/) → /Active procurements?/ | dashboard health label (verify which copy; likely content-performance “Bids”) |
| e2e/tests/workspaces.spec.ts | :70 | bidsCard.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:/i | search-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: bid→procurement, bids→procurements)
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).
| file | sites | rename |
|---|---|---|
| app/procurement/page.tsx | :95,:96; :142-144; :256,:257; :262,:263; :338,:339,:341,:346,:351 | bid→procurement (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) | bid→procurement |
| app/procurement/[id]/session/page.tsx | :174; :266,:267,:269,:356 | bid→procurement |
| components/procurement/procurement-list-card.tsx | :38 (param), :49,:50,:51,:52,:99,:102 | bid→procurement |
| components/procurement/procurement-creation-wizard.tsx | :28 (onCreated:(bid:{id,name}) param type) | bid→procurement |
| components/procurement/procurement-context-provider.tsx | :55 (ctx-value type prop), :80 (useState), :220 (shorthand) | bid→procurement (register row 87 explicit) |
| components/dashboard/active-procurement-section.tsx | :53 (bids prop), :64,:85,:85-93,:96,:97 (bids.map((bid)=>…), toProcurement(bid)) | bids→procurements / bid→procurement |
| lib/mcp/formatters/procurements.ts | :52,:53,:55-114 (param bid:ProcurementDetail + ~25 accesses + for…of bid.sections) | bid→procurement |
| lib/mcp/formatters/dashboard.ts | :127,:129,:136,:140-157 (param bids + loop); :234-250 (2nd loop var) | bids→procurements / bid→procurement |
| lib/mcp/formatters/apps.ts | :142,:144-166 (for…of data.procurements loop var) | bid→procurement |
| lib/domains/procurement/procurement-export-data.ts | :52 (destructure), :111,:116,:120,:167 | bid→procurement |
| hooks/procurement/use-procurement-actions.ts | :108 (return prop), :126 (param), :168,:291,:319,:591,:593,:625 | bid→procurement |
| hooks/procurement/use-procurement-session.ts | :71 (return-type prop), :122 (local), :209 (shorthand) | bid→procurement |
(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.
| file | approx sites | old → new |
|---|---|---|
| lib/validation/schemas.ts | 19 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.ts → app/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)”| site | old → new |
|---|---|
| :23 | new 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.' |
| :114 | aria-label 'Loading bid data' → 'Loading procurement data' |
| :121 | 'Waiting for bid data…' → 'Waiting for procurement data…' |
| :162 | title.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.' |
| :185 | aria-label 'Active bids' → 'Active procurements' |
| :197 | aria-label 'Bid pipeline summary' → 'Procurement pipeline summary' |
| :211 | { label: 'Total Bids' } → 'Total Procurements' |
| :415 | 'Loading bid detail…' → 'Loading procurement detail…' |
| :453 | prompt Show me the full detail for the ${name} bid. → …${name} procurement. |
| :1057 | error Failed to load bid detail → Failed to load procurement detail |
mcp-apps/reorient-me/src/app.ts (visible copy)
Section titled “mcp-apps/reorient-me/src/app.ts (visible copy)”| site | old → new |
|---|---|
| :314,:347 | prompt …in the ${title} bid. Start with… → …${title} procurement. |
| :320,:334 | button 'Show bid detail' → 'Show procurement detail' (×2) |
| :434 | dynamic title …in ${entity_title} bid → …in ${entity_title} procurement |
| :453,:511 | button 'View bid' → 'View procurement' (×2) |
| :537 | h2 innerHTML 💼 Active Bids → 💼 Active Procurements |
| :597 | prompt …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)”| file | sites | rename |
|---|---|---|
| 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,:1085 | bid→procurement, bids→procurements, sortedBids→sortedProcurements |
| mcp-apps/form-dashboard/src/app.ts | :27,:64,:94,:250,:313,:314 (expandedBid + ?.bidId); :65,:250 (bidId field) | expandedBid→expandedProcurement, bidId→procurementId (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) | bids→procurements, bid→procurement |
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 source | e2e selector(s) | e2e copy assertion(s) | priority |
|---|---|---|---|---|
| LP-1 | procurement-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-2 | wizard id="wizard-bid-name" (creation-wizard:251,255) | bid-pipeline.spec.ts:304,671 | — | CRITICAL |
| LP-3 | wizard id="wizard-bid-buyer" (creation-wizard:267,272) | bid-pipeline.spec.ts:309,674 | — | CRITICAL |
| LP-4 | active-procurement-section.tsx:61 Active Bids→Active 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-5 | app/procurement/page.tsx:153 h1 Bids→Procurement | — | bid-pipeline.spec.ts:111,147,240,257,281,466,479,492,648 + workspaces.spec.ts:100 (×10) | CRITICAL |
| LP-6 | app/procurement/page.tsx:155 Manage bid submissions… (PJ-FLAG-2) | — | bid-pipeline.spec.ts:116 | HIGH |
| LP-7 | app/procurement/page.tsx:252 No bids match… | — | bid-pipeline.spec.ts:210 | HIGH |
| LP-8 | page.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:448 | HIGH |
| LP-9 | page.tsx:309,524,681 Delete bid (×3) | — | bid-pipeline.spec.ts:545 | HIGH |
| LP-10 | session/page.tsx:400 span Back to bid | — | bid-session.spec.ts:49,370 /Back to bid/i | HIGH |
| LP-11 | search-prompt-cards.tsx:71 Past bid responses (PJ-FLAG-4) | — | browse-cards.spec.ts:211 (+204 cmt) | MEDIUM |
| LP-12 | content-performance / dashboard health “Active bids” label | — | dashboard.spec.ts:174 /Active bids?/ | MEDIUM (verify exact source label) |
| LP-13 | workspaces procurement-card “bid responses” descriptor copy | — | workspaces.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):
- Edit
mcp-apps/form-dashboard/src/{app.ts,types.ts}+mcp-apps/reorient-me/src/{app.ts,types.ts}. - Run
bun run build:mcp-apps. - Commit the regenerated
app-bundles.tsalongside 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 keepprocurement_deadline(do not let a stale source reintroducebid_deadline). - Unit D already landed
data.procurements(form-dashboard wire fieldprocurements:). The F regen MUST keepdata.procurements/procurements:. - Confirm with
gitnexus_detect_changes+ agrep 'bid_deadline\|data\.bids\|"bids"' lib/mcp/app-bundles.tsreturning 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)”| Item | Sites (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-* classes | domain-tokens.css, procurement-list-card.tsx classNames, procurement-workflow.ts:40-55, app/procurement/page.tsx:371, app-bundles.ts:181 token | Owned by bl-349 (rebrand visual pass). CSS-var literal sweep + @theme + utility-class rename. (REGISTER §4) |
| Persisted CV / CHECK / JSONB / localStorage literals | bid_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 JSDoc | Ratified KEEP. (REGISTER §3, STRATEGY §5 KEEP) |
/api/bids route POST path + /bid/<uuid> redirect regex | bid-pipeline.spec.ts:689 /\/api\/bids$/, :696/700/703 /bid/<uuid> nav target | Unit 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.ts | File 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 comments | STRATEGY 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 ActiveBidSummary→ActiveProcurementSummary row 32,
buildBidSummary→buildProcurementSummary 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_summary→procurement_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-paletteBids→Procurement(singular, matches route/procurement+ h1) vs dashboard sections use pluralActive 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 theBID_WRITING_CARDSpersona cluster — the persona keybid_writing+ cardid: 'bid-writing-*'are DEFER (persisted CV), only thetitlecopy 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+bidIdfield +ClientBidSummarytest). 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-brokenActive bidsselector)e2e/tests/workspaces.spec.ts(LP-5, LP-13)e2e/tests/bid-session.spec.ts(LP-10 — but LEAVE thefrom_biddescribe 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.