Stakeholder groups
Bluefin Foods Group · the workspace registry, and what each reporting cycle recorded from it
AnnotationMenu placement is a proposal, not a spec statement. Spec ii 4.2 defines the two endpoints, not the navigation position. The three sidebar items marked "proposed" are the additions this wireframe set asks for; every other item is existing product navigation, unchanged
Demo helper · panel labelsPanel 1, left: the workspace registry. Panel 2, right: the snapshots one cycle took from it. Both are one screen; the numbering exists only so the annotations below can point at them.
Workspace registry
The current list of groups this workspace engages with
New group
| Group | Category | Engagement mode | Status | |
|---|---|---|---|---|
| Employees and contractors Group-wide, 2,140 people | workforce | survey Annual engagement survey | active | |
| Contract growers Renamed from Contract farmers on 02 Jun 2026 | suppliers | meeting Grower meetings, three regions | active | |
| Retail customers SG, TH, MY retail accounts | customers | survey Consumer panel and service line | active | |
| Food safety regulators Three jurisdictions | regulators | written-submission Filings and inspection responses | active | |
| Neighboring communities Johor and Rayong plant catchments | communities | grievance-channel Community liaison meetings | active | |
| Regional wholesalers panel 2024 pilot, no longer convened | customers | meeting | inactive Deactivated 04 Jan 2026 |
Cycle snapshots · FY2025 GRI report
Jan 2025 to Dec 2025 · active · what this cycle recorded, version by version
Refresh snapshot
Refresh takes a new version. It never edits or replaces an existing one. This cycle is active and its methodology lock is provisional, so the latest version can still be refreshed: pressing Refresh snapshot records the registry as it stands today as version 3, and versions 1 and 2 stay exactly as they were taken.
When to use it: after adding, renaming, or deactivating a group that the report should reflect. If nothing in the registry has changed, a refresh only adds a version that reads the same, so there is no reason to press it.
Version 2
latest
can be refreshed
View recorded groups
Taken15 Jun 2026, 09:24 UTCrefreshed while the cycle was active
Taken byPriya NairSustainability Admin
Groups recorded5the inactive wholesalers panel was already out of the registry; this version reads "Contract growers", the name the group carried on 15 Jun 2026
StateLatest, not frozenthe cycle is active and its methodology lock is provisional, so a refresh would append version 3; freezing happens only at lock completion, which I1 cannot reach
Version 1
superseded by version 2
View recorded groups
Taken12 May 2026, 06:11 UTCtaken when the cycle was activated
Taken byMei TanSustainability Admin
Groups recorded5
Recorded labelsEmployees and contractors, Contract farmers, Retail customers, Food safety regulators, Neighboring communitiesThis version still reads "Contract farmers", which is the name the group carried on 12 May 2026. The registry now shows "Contract growers". Renaming a group later never changes what a snapshot recorded.
Annotation · not proposed UISpec ii 4.2 · the take is atomic with activation. The activation-time snapshot executes inside spec i's activation critical section: the snapshot write and the activation commit succeed or fail together. There is no active cycle without a snapshot and no snapshot without its cycle. Version 1 above therefore carries the same timestamp story as the cycle's activation, and it is not a separate user action.
Annotation · not proposed UISpec ii 4.2 · refresh appends, never overwrites. An explicit refresh while the cycle is active appends a NEW version with a monotonic version number per cycle (
stakeholdergroupsnapshots: companyId, cycleId, snapshotVersion, takenAt/By, frozen copies of the groups, frozen). Earlier versions, and any confirmation that referenced them, are untouched. Nothing in this surface can edit or delete a version, which is why the version cards carry no Edit or Remove affordance.Annotation · not proposed UISpec ii 4.2 · renames and deactivations cannot reach backwards. A snapshot stores frozen copies of the groups, not references to the live registry rows, so a rename, a category change, or a deactivation in panel 1 leaves every existing version byte-identical (acceptance case 9.5). Panel 1 shows the current name, panel 2 shows the recorded name, and the two are deliberately allowed to differ. Version 1 above reads "Contract farmers" and the registry reads "Contract growers" for exactly that reason.
Annotation · not proposed UISpec ii 4.2 and 6.6 · what freezing does, and what is drawn where. Freezing happens at lock completion, and lock state
complete needs spec iii's factor-library vintage, so in I1 the latest version of a live cycle always stays refreshable. That is why the MAIN screen above draws the enabled control: it is the state this build will actually ship. The frozen state and its refusal are drawn in the gallery below as a forward state, because a reviewer has to understand freezing before signing anything off. The refusal constant is CYCLE_IMMUTABLE, 409, spec i's existing code reused unchanged and listed as such in the spec ii 6.6 error contract, so it is quoted rather than proposed.Annotation · not proposed UISpec ii 4.2 · freezing is one way, and the spec now says so. No lock transition ever unfreezes a snapshot version. If a completed lock is ever reversed and later re-completed, the re-completion freezes the THEN-latest version, and every version that was already frozen stays frozen. That is why no screen in this wireframe set carries an unfreeze path: there is nothing to draw. A related rule from the same section, drawn nowhere because it has no control: when a cycle's lock is already complete at activation, the activation-time snapshot is born frozen, so there is no window in which a lock-complete cycle holds a refreshable snapshot.
Annotation · question for the PMOne open item, not invented into an answer here. The registry carries a category enum and an engagement mode (gate (c) bone 2B), but neither the spec nor the plan enumerates the permitted values. The values shown in panel 1 are invented placeholders in the shape of a closed server-side list, not a proposal about the category list itself.
Annotation · not proposed UIContract notes. Both endpoints are admin role:
/v1/stakeholder-groups (list, create, deactivate) and /v1/reporting-cycles/:id/stakeholder-snapshots (list, refresh). Lookups are tenant-scoped {_id, companyId} with cross-tenant 404, which is what closes the snapshot IDOR surface the review named. The registry is never written by the boot-time seeder, and the qualitative stakeholder narrative in the report is never auto-generated from the stakeholder group registry.
State gallery · every other state of these two panels · annotation frame only, the white cards are the proposal
The first-run empty registry, the row action menu, the two registry writes, the refresh confirmation, and the frozen snapshot that only a later iteration can reach.
First run · the registry is empty, and that is a legal state
This is what every workspace sees on day one, because the registry is never written by the boot-time seeder (spec ii 4.2, pinned by an acceptance test). The empty state says the one thing an admin actually needs to hear: nothing is blocked. An empty registry is valid, and no appendix or cycle operation ever waits on it.
Row action · the menu behind the row control in panel 1
The product pattern for a table row: a 32px ghost control opening a small menu, not a full button per row. Deactivate is the only destructive-adjacent item and it opens the confirmation drawn below rather than acting on click. There is no Delete item anywhere, because the API has none.
New group · triggered by New group in panel 1
The identifier behind the row is permanent and is what snapshots and later consultation records point at, which is why the name is editable and the row is never replaced. The category and engagement-mode dropdowns are drawn closed on purpose: their permitted values are the open item flagged above.
Deactivate · triggered by Deactivate on a row
There is no delete action anywhere on this surface, because the API has none: the registry endpoint set is list, create, and deactivate. Drawn as a confirmation rather than an instant toggle, since the consequence reaches every future snapshot.
Refresh snapshot · triggered by Refresh snapshot in panel 2
The I1-normal write on this surface, and the one the build will ship first: an explicit refresh while the cycle is active appends a version (spec ii 4.2). It is a confirmation rather than a silent action because the version number is permanent and shows up in the snapshot list forever.
Forward state, not reachable in I1 · the same panel after lock completion
Drawn as a forward state on purpose. Lock state
complete needs spec iii's factor-library vintage, so nothing in I1 can reach this screen; the enabled control on the main page is what I1 ships. Freezing is one way: a completed lock that is later reversed and re-completed freezes the THEN-latest version, and every version already frozen stays frozen (spec ii 4.2). The refusal constant is spec i's CYCLE_IMMUTABLE, reused unchanged and listed in the spec ii 6.6 error contract.