Design the visibility and qualification model #12
Notifications
Due Date
No due date set.
Blocks
Depends on
#14 Specify the two-party data release rules
christian/helmdocs-proposal-system
#23 Design the app framework — retailer and vendor surfaces
christian/helmdocs-proposal-system
#11 Define the tenancy, identity, and authorization model
christian/helmdocs-proposal-system
Reference: christian/helmdocs-proposal-system#12
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Question
Three tiers were named in the original idea: everyone, qualified vendors, and shortlisted vendors (a retailer-chosen subset of qualified). With no open discovery in v1, all three operate over a retailer-scoped roster.
Resolve: who defines qualified and against what evidence; whether qualification is per-RFP, per-category, or per-retailer; whether tiers can change mid-RFP and what happens to bids already submitted when they do; what 'everyone' means when there is no public marketplace; and whether a vendor can see that an RFP exists but not its contents.
Parent: #1
Resolution
The ticket asked about three visibility tiers. The tiers were the wrong model — they conflated two
orthogonal concepts, and separating them is the substance of this resolution.
1. Eligibility and audience are different things
Eligibility is durable state on the roster entry, scoped to
(retailer, vendor, category). Avendor is approved, or has prior awarded business, with this retailer in this category. It
accrues — approvals, audits, past performance attach to it over time — and it exists independently
of any RFP.
Audience is a per-RFP targeting decision made at issue time. The retailer selects either
ad-hoc ("only A, B, C") or by naming a reusable group.
So
everyone / qualified / shortlistedis not an enum on the RFP. It is an audience selectedfrom a roster that carries eligibility state. This matters beyond tidiness: it survives a retailer
whose own approval vocabulary does not match ours, because their process maps onto eligibility
state without us having to name their tiers.
"Everyone" is already bounded by the cold-start decision — with no open discovery in v1 there
is no public to broadcast to, so "everyone" means every vendor on that retailer's roster. The
model needs no global visibility concept at all.
2. Audience is fixed at issue; access changes by stage
The audience never changes after the RFP is issued. Separately, the RFP moves through stages —
open -> evaluating -> finalists -> awarded— and reaching finalist grants a participantadditional access: clarification rounds, interviews, site visits, revised pricing.
Two things kept deliberately apart: who was invited never changes; what a participant can see
does. The research confirmed this is what real solicitations do — the SLC Airport RFP shortlists
for interviews as a distinct downstream stage.
Widening the audience mid-RFP was declined. Adding vendors after issue gives late entrants
less time and potentially more information, which is the fairness pattern that gets awards
protested.
Consequence the map must carry. Visibility is now a function of
(audience membership, RFP stage, participation state, acknowledgement). That is precisely thelifecycle-dependent policy the tenancy decision flagged as the hard case for RLS. The data-release
ticket must produce rules expressible in policy SQL over these four inputs — not merely correct
rules.
3. A group is a rule, materialised at issue
A named group ("Tier 1 Produce Suppliers") is defined as a rule over roster attributes —
qualified for a category, insurance current, prior awarded business — so it maintains itself as the
roster changes.
At issue, the rule is evaluated and the resulting vendor set is frozen onto the RFP as an
explicit list. The rule is convenience; the snapshot is the record.
Why the snapshot is not optional. Access is lifecycle-dependent and awards get protested. You
must be able to prove exactly who was invited at issue time, and a live query cannot answer that
once the roster has moved. A live rule would also quietly readmit the mid-RFP widening that was
just declined.
What it costs. Two representations to keep coherent, and retailers will need to understand that
editing a group does not change an RFP already issued.
4. Teaser first, then an acknowledgement gate
An invited vendor first sees a summary — category, scope in outline, timeline, volume band.
Full contents unlock on acknowledgement: confidentiality, conflict-of-interest declaration, intent
to respond. The gate is a per-RFP toggle, so routine sourcing skips it.
Why. This is what the retailer is actually buying when we promise control over who sees the
RFP — private-label specs, formulations, and volume commitments are the sensitive part. It also
yields a signal the retailer wants for free: who opened, who acknowledged, who intends to bid, all
well before any bid arrives.
What it costs. One more state per participant, and a gate that irritates vendors on low-stakes
RFPs if it is not genuinely optional.
Constraints handed to other tickets
to un-qualify a vendor, which means document expiry feeds eligibility state rather than sitting
inert in a document store.
protest surface.
over it. Graduated to its own ticket.