APP-04 - Hide deprecated Figshare and Cambridge distribution options
Status
INTEGRATION-VERIFICATION SPECIFICATION CANDIDATE - REVISED AFTER CONTROL PRE-REVIEW AND LIVE BASELINE REBIND - AWAITING INDEPENDENT REVIEW AND CTO APPROVAL
Source implementation: NOT EXPECTED / NOT AUTHORIZED
Current gate: HOLD - wait for approved/merged BE-05, DIS-03 runtime retirement and controlled assignment reconciliation; then verify the existing app generically against the exact deployed backend contract.
No app source, branch, PR, browser/runtime, deployment or production mutation is authorized by this specification revision.
1. Task identity
- Programme: Publisher Services and Distribution Configuration
- Parent programme issue:
thoth-pub/thoth#765
- Task ID:
APP-04
- Repository:
thoth-pub/thoth-app
- Programme stage: application compatibility / platform-retirement presentation
- Workflow: verification-only; no source workflow expected
- Risk: MEDIUM
- Verified source baseline:
dev @ cd16ae2830ad656113e0303f0123b2ffb39084f4
- Current release topology:
dev -> main
- Source branch: NONE EXPECTED
- PR: NONE EXPECTED
- Exact authorized implementation base: NONE
- Owner / verification agent: not yet assigned
- Independent reviewer: different agent instance from any future source implementer; verification evidence is reviewed at its exact source/deployment identities
- Runtime/provider effect at this gate: NONE
Live baseline rebind - 2026-08-27
The first control-pre-review candidate was based on dev @ b08e309103a7a5a9289038293f92549c8a4388cb. During final verification, dev advanced by four commits to cd16ae2830ad656113e0303f0123b2ffb39084f4.
Fresh comparison showed only theme/test-snapshot changes; none of the APP-04 Publisher Services seams changed. The following exact files were re-read at cd16ae2830ad656113e0303f0123b2ffb39084f4 and retain the generic behavior specified below:
src/entities/publisher/ui/PublisherServiceConfiguration/PublisherServiceConfiguration.tsx
src/widgets/PublisherAdministration/usePublisherAdministrationEditor.ts
src/entities/publisher/api/hooks/useDistributionPlatformOptions.ts
This issue is therefore rebound to the new exact live dev baseline rather than relying on the stale snapshot. Any later dev movement before integration verification requires the same fresh re-read.
The CTO product decision is:
JISC_NBK remains a known inactive/non-assignable option and may be shown disabled;
FIGSHARE and CAMBRIDGE_UNIVERSITY_LIBRARY are retired services and must not appear as assignment choices after controlled backend/data cutover.
thoth-app must not encode those names as a local denylist. Backend-owned option membership remains authoritative.
2. Objective
Verify that the existing generic Publisher Services UI correctly reflects the backend retirement of Figshare/Cambridge without adding frontend platform policy, while preserving JISC as a visible disabled option and preserving existing optimistic-concurrency, server-normalization and distribution-job-creation-disabled behavior.
3. Live-source finding: no app code change is currently required
At dev @ cd16ae2830ad656113e0303f0123b2ffb39084f4, both service-configuration editors implement the required generic contract.
3.1 Active-publisher editor
src/entities/publisher/ui/PublisherServiceConfiguration/PublisherServiceConfiguration.tsx builds editor rows from:
- backend
distributionPlatformOptions; plus
- any currently enabled platform missing from that option list, synthesized as non-assignable so an edit cannot silently drop existing server state.
Therefore:
- an unselected platform omitted by the backend is absent from the editor;
- a backend-returned
JISC_NBK with assignable=false remains visible disabled;
- an omitted-but-still-enabled retired value remains visible/removable until backend data reconciliation removes it;
- no platform-specific client policy is required.
3.2 Staff publisher editor
src/widgets/PublisherAdministration/usePublisherAdministrationEditor.ts implements the same rule: backend options plus any currently enabled value missing from the option list, with absent metadata treated as non-assignable.
3.3 Option loading
src/entities/publisher/api/hooks/useDistributionPlatformOptions.ts simply fetches/caches the backend option list under one stable key. It performs no local platform filtering.
3.4 Existing tests
Existing focused tests at the prior baseline already characterized the generic non-assignable behavior, including a backend-returned non-assignable JISC option disabled when unselected and an already-enabled non-assignable platform removable but not re-addable. The four intervening commits do not touch those test files or the relevant source seams.
At the future verification gate, re-run the exact current focused tests against the then-current app source rather than treating prior results as current evidence.
Because Figshare/Cambridge disappearance follows from backend option omission plus prior assignment reconciliation, adding a frontend source/test rule explicitly naming those platforms would risk introducing the local eligibility matrix this programme prohibits.
4. Required upstream contract
thoth-pub/thoth#840 (BE-05) owns the authoritative backend change. Its revised candidate requires:
- all 17 stable
DistributionPlatform enum identities remain;
- Figshare/Cambridge become inactive + non-assignable and are omitted from
distributionPlatformOptions;
- JISC NBK remains in
distributionPlatformOptions with assignable=false;
distributionPlatformOptions therefore becomes a 15-row visible assignment-option projection;
- executable GraphQL field/type/enum/nullability shape remains unchanged;
- the GraphQL description of
distributionPlatformOptions changes so the server no longer falsely calls the 15-row projection the full platform inventory.
The description-only SDL change is expected and compatible. APP-04 must not require byte-identical SDL and must not re-pin graphql/schema.v1.7.0.graphql or regenerate gql/ solely because a server-side description changed and the returned list became a subset. The app's consumed executable types remain compatible because the enum still contains all 17 values and the option object shape is unchanged.
APP-04 verifies the actual merged/deployed BE-05 contract; it does not guess a candidate or moving schema.
5. Critical rollout dependency: enabled retired assignments
The current generic app intentionally displays a backend-omitted platform if it is still enabled in a publisher's protected service configuration. This is correct compatibility behavior: hiding an enabled server value would conceal state that a complete-set replacement must account for.
The product requirement that Figshare/Cambridge be completely absent from assignment choices is therefore satisfied by rollout ordering, not frontend special-casing:
- BE-05 source is independently reviewed/merged but not yet backend-activated;
- DIS-03 consumes that exact contract, merges and is separately promoted so its executable/scheduled retirement is runtime-effective;
- production/test backend state is separately audited;
- every current CUL/Figshare assignment/job is dispositioned and, where required, disabled through the canonical backend coordinator;
- reconciliation proves no unexplained enabled retired assignment remains;
- BE-05 backend behavior is deployed/activated;
- APP-04 verifies the app against that exact state.
If this state cannot be established, APP-04 is HOLD. Do not add a frontend hide-by-name rule to mask unresolved backend configuration.
6. Explicit scope
APP-04 is currently a zero-source-change integration verification task.
It must verify:
- backend
distributionPlatformOptions contains neither FIGSHARE nor CAMBRIDGE_UNIVERSITY_LIBRARY;
- backend still returns
JISC_NBK with assignable=false;
- verified publisher configurations do not retain enabled retired values after reconciliation;
- active-publisher editor offers neither retired platform;
- staff publisher editor offers neither retired platform;
- JISC NBK remains visible and disabled/non-selectable when unselected;
- ordinary assignable destinations still render according to backend metadata;
- no local package/platform/retirement matrix or denylist exists;
- stale-write, server-normalized-state and
DISTRIBUTION_JOB_CREATION_DISABLED semantics remain unchanged;
- the app remains compatible with BE-05's description-only SDL drift without changing pinned local SDL/generated client artifacts.
7. Non-goals
APP-04 must not:
- implement or duplicate backend platform visibility/eligibility policy;
- hard-code
FIGSHARE or CAMBRIDGE_UNIVERSITY_LIBRARY as hidden client values;
- silently suppress an enabled backend value;
- alter packages, linkage, durable-job semantics, auth or API behavior;
- perform upstream assignment/job reconciliation;
- edit the pinned v1.7 SDL or generated
gql/ merely for BE-05's description-only change;
- create a branch/PR without first demonstrating an actual app defect and amending this specification;
- deploy/release/merge or access runtime/browser/provider systems without separate authorization.
8. Cross-repository impact
| Contract |
Impact |
| backend stable enum |
CONSUMED / COMPATIBLE - remains 17 values |
| backend option response membership |
CONSUMED / AFFECTED - 17 -> 15 visible options |
| backend executable GraphQL shape |
COMPATIBLE - no field/type/enum/nullability change |
| backend SDL descriptions |
COMPATIBLE DESCRIPTION-ONLY DRIFT |
| app pinned schema/generated types |
NO CHANGE REQUIRED for this retirement alone |
| app presentation |
VERIFICATION REQUIRED |
| app authorization |
NOT AFFECTED |
| upstream data reconciliation |
OUT OF SCOPE; owned by backend rollout controls |
| dissemination execution |
OUT OF SCOPE; owned by DIS-03 |
Upstream owners:
- BE-05:
thoth-pub/thoth#840
- DIS-03:
thoth-pub/thoth-dissemination#101
APP-04 must use exact merged/deployed upstream identities when verification occurs.
9. Invariants
- Backend option membership remains the single source of option visibility.
- Enabled server values missing from option metadata are never silently dropped/hidden by the app.
- JISC remains generically visible-disabled because the backend returns it as non-assignable.
- Retired unselected values disappear because the backend omits them, not because the app recognizes their names.
- No GraphQL generated artifact is rewritten for a description-only upstream SDL change.
- Existing concurrency/error truthfulness remains intact.
10. Source write budget
Existing files permitted: NONE
New files: NONE
Deletion/move/rename: NONE
Branch / PR: NONE EXPECTED
If integration evidence proves a real app defect, return:
HOLD - APP-04 SOURCE AMENDMENT REQUIRED
Before any code edit, amend this issue with:
- exact demonstrated defect/evidence;
- exact live
dev base and overlap state;
- bounded source/test write paths;
- changed cross-repository assumptions if any;
- acceptance/tests;
- automatic CI side effects;
- separate exact-base implementation authorization.
Any source fix must remain generic/backend-driven and must not hard-code retired platform eligibility/visibility.
11. Verification evidence
11.1 Source-level verification
Against the exact app source used for integration, confirm the generic editor seams above remain unchanged or semantically equivalent. Re-read them if dev has moved; do not rely on this baseline by memory.
Run the exact focused service-configuration/editor tests against that source and record their results. No test/source mutation is authorized merely to add retired-platform names.
11.2 Backend/API verification
Under a separately authorized suitable test/non-production deployment or controlled production cutover, capture bounded evidence of:
- exact backend source/deployment identity;
- exact app source/deployment identity;
distributionPlatformOptions membership/assignability facts;
- relevant representative publisher configuration state;
- no enabled retired assignment in the verified population after reconciliation.
Do not expose tokens, credentials or unbounded protected payloads.
11.3 UI verification
Under separately authorized browser/runtime read access, verify:
- active-publisher editor: no Figshare/Cambridge choice;
- staff publisher editor: no Figshare/Cambridge choice;
- JISC visible disabled/non-selectable when unselected;
- ordinary options remain rendered from backend metadata;
- existing failed-save/job-creation-disabled truthfulness remains unchanged.
Browser/runtime access is a separate permission; it is not authorized by this specification candidate itself.
12. Candidate verification action-authorization matrix
This matrix is specification content only; it is not active authorization. Exact integration verification requires a later authorization bound to concrete backend/app deployment identities.
| Action |
Candidate authorization |
| repository/GitHub read inspection |
YES |
| source/worktree edit |
NO |
| create/delete/move/rename files |
NO |
| branch creation |
NO |
| commit/push |
NO |
| PR creation/update |
NO |
| issue/comment mutation for evidence |
YES |
| local read-only source/test verification |
YES, if it writes no repo artifacts |
| provider/runtime/API read |
SEPARATE LATER AUTHORIZATION REQUIRED |
| browser verification |
SEPARATE LATER AUTHORIZATION REQUIRED |
| provider/runtime write |
NO |
| upstream data mutation |
NO |
| manual CI dispatch/rerun |
NO |
| release/merge/deployment/activation |
NO |
13. Automatic side effects
Because APP-04 currently has no source branch/PR, it has no expected code-delivery side effect.
If future evidence requires app source work, this specification must be amended and live CI side effects re-verified before source/PR authorization. Do not inherit assumptions from this zero-change plan.
14. Existing app release interaction
APP-RR-01 / #142 remains the existing repository dev -> main release-readiness control, but its recorded source snapshot predates current dev @ cd16ae2830ad656113e0303f0123b2ffb39084f4. Any future promotion must reconstruct #142 against the then-exact dev/main pair.
Because APP-04 currently has no source diff, it does not itself alter a release candidate. If APP-04 later requires source work and merges to dev, the release-readiness control must again be freshly reconstructed against the new exact candidate before promotion.
15. Acceptance criteria
16. Rollout / rollback
APP-04 itself has no rollout because it contains no source change. It observes the controlled upstream rollout after BE-05/DIS-03/data gates are complete.
If verification fails, HOLD upstream activation/closure and classify the failure:
- unresolved backend assignment/state -> backend reconciliation issue;
- incorrect backend option contract -> BE-05 issue;
- actual generic app defect -> amend APP-04 before code work.
Do not roll back or mask upstream state from the frontend merely to make the UI appear clean.
17. HOLD / STOP
HOLD if:
- this exact rebound verification specification is not independently reviewed and CTO-approved;
- BE-05 is unmerged/unpinned or not deployed in the verification environment;
- DIS-03 runtime retirement is incomplete;
- enabled retired assignments/jobs remain unresolved;
- backend executable schema shape changes beyond the approved description-only drift without an explicit compatibility decision;
- current app source no longer implements the generic option behavior described above;
- verification requires runtime/browser access not separately authorized;
- a proposed fix requires hard-coded platform policy.
STOP if APP-04 begins:
- introducing a Figshare/Cambridge frontend denylist;
- silently dropping enabled server values;
- changing package/linkage/job/domain semantics;
- performing upstream data reconciliation;
- editing generated/pinned GraphQL artifacts without a demonstrated executable contract need;
- changing auth/provider/runtime policy;
- releasing/deploying/merging without separate authorization.
18. Current authorization
Authorized now:
- read-only repository/GitHub inspection;
- issue/specification and bounded release/programme ledger coordination mutation.
Not authorized now:
- source/file changes;
- branch creation/update;
- commit/push;
- PR creation/mutation;
- manual CI dispatch/rerun;
- API/provider/runtime/browser access;
- upstream data mutation;
- deployment/release/merge/production activation.
19. Next action
Obtain independent review and CTO approval of this revised, rebound zero-source-change verification specification. Then leave APP-04 HOLD until BE-05, DIS-03 and assignment-reconciliation gates supply exact deployment/state identities for a separately authorized integration verification.
APP-04 - Hide deprecated Figshare and Cambridge distribution options
Status
INTEGRATION-VERIFICATION SPECIFICATION CANDIDATE - REVISED AFTER CONTROL PRE-REVIEW AND LIVE BASELINE REBIND - AWAITING INDEPENDENT REVIEW AND CTO APPROVAL
Source implementation: NOT EXPECTED / NOT AUTHORIZED
Current gate: HOLD - wait for approved/merged BE-05, DIS-03 runtime retirement and controlled assignment reconciliation; then verify the existing app generically against the exact deployed backend contract.
No app source, branch, PR, browser/runtime, deployment or production mutation is authorized by this specification revision.
1. Task identity
thoth-pub/thoth#765APP-04thoth-pub/thoth-appdev @ cd16ae2830ad656113e0303f0123b2ffb39084f4dev -> mainLive baseline rebind - 2026-08-27
The first control-pre-review candidate was based on
dev @ b08e309103a7a5a9289038293f92549c8a4388cb. During final verification,devadvanced by four commits tocd16ae2830ad656113e0303f0123b2ffb39084f4.Fresh comparison showed only theme/test-snapshot changes; none of the APP-04 Publisher Services seams changed. The following exact files were re-read at
cd16ae2830ad656113e0303f0123b2ffb39084f4and retain the generic behavior specified below:src/entities/publisher/ui/PublisherServiceConfiguration/PublisherServiceConfiguration.tsxsrc/widgets/PublisherAdministration/usePublisherAdministrationEditor.tssrc/entities/publisher/api/hooks/useDistributionPlatformOptions.tsThis issue is therefore rebound to the new exact live
devbaseline rather than relying on the stale snapshot. Any laterdevmovement before integration verification requires the same fresh re-read.The CTO product decision is:
JISC_NBKremains a known inactive/non-assignable option and may be shown disabled;FIGSHAREandCAMBRIDGE_UNIVERSITY_LIBRARYare retired services and must not appear as assignment choices after controlled backend/data cutover.thoth-appmust not encode those names as a local denylist. Backend-owned option membership remains authoritative.2. Objective
Verify that the existing generic Publisher Services UI correctly reflects the backend retirement of Figshare/Cambridge without adding frontend platform policy, while preserving JISC as a visible disabled option and preserving existing optimistic-concurrency, server-normalization and distribution-job-creation-disabled behavior.
3. Live-source finding: no app code change is currently required
At
dev @ cd16ae2830ad656113e0303f0123b2ffb39084f4, both service-configuration editors implement the required generic contract.3.1 Active-publisher editor
src/entities/publisher/ui/PublisherServiceConfiguration/PublisherServiceConfiguration.tsxbuilds editor rows from:distributionPlatformOptions; plusTherefore:
JISC_NBKwithassignable=falseremains visible disabled;3.2 Staff publisher editor
src/widgets/PublisherAdministration/usePublisherAdministrationEditor.tsimplements the same rule: backend options plus any currently enabled value missing from the option list, with absent metadata treated as non-assignable.3.3 Option loading
src/entities/publisher/api/hooks/useDistributionPlatformOptions.tssimply fetches/caches the backend option list under one stable key. It performs no local platform filtering.3.4 Existing tests
Existing focused tests at the prior baseline already characterized the generic non-assignable behavior, including a backend-returned non-assignable JISC option disabled when unselected and an already-enabled non-assignable platform removable but not re-addable. The four intervening commits do not touch those test files or the relevant source seams.
At the future verification gate, re-run the exact current focused tests against the then-current app source rather than treating prior results as current evidence.
Because Figshare/Cambridge disappearance follows from backend option omission plus prior assignment reconciliation, adding a frontend source/test rule explicitly naming those platforms would risk introducing the local eligibility matrix this programme prohibits.
4. Required upstream contract
thoth-pub/thoth#840(BE-05) owns the authoritative backend change. Its revised candidate requires:DistributionPlatformenum identities remain;distributionPlatformOptions;distributionPlatformOptionswithassignable=false;distributionPlatformOptionstherefore becomes a 15-row visible assignment-option projection;distributionPlatformOptionschanges so the server no longer falsely calls the 15-row projection the full platform inventory.The description-only SDL change is expected and compatible. APP-04 must not require byte-identical SDL and must not re-pin
graphql/schema.v1.7.0.graphqlor regenerategql/solely because a server-side description changed and the returned list became a subset. The app's consumed executable types remain compatible because the enum still contains all 17 values and the option object shape is unchanged.APP-04 verifies the actual merged/deployed BE-05 contract; it does not guess a candidate or moving schema.
5. Critical rollout dependency: enabled retired assignments
The current generic app intentionally displays a backend-omitted platform if it is still enabled in a publisher's protected service configuration. This is correct compatibility behavior: hiding an enabled server value would conceal state that a complete-set replacement must account for.
The product requirement that Figshare/Cambridge be completely absent from assignment choices is therefore satisfied by rollout ordering, not frontend special-casing:
If this state cannot be established, APP-04 is HOLD. Do not add a frontend hide-by-name rule to mask unresolved backend configuration.
6. Explicit scope
APP-04 is currently a zero-source-change integration verification task.
It must verify:
distributionPlatformOptionscontains neitherFIGSHAREnorCAMBRIDGE_UNIVERSITY_LIBRARY;JISC_NBKwithassignable=false;DISTRIBUTION_JOB_CREATION_DISABLEDsemantics remain unchanged;7. Non-goals
APP-04 must not:
FIGSHAREorCAMBRIDGE_UNIVERSITY_LIBRARYas hidden client values;gql/merely for BE-05's description-only change;8. Cross-repository impact
Upstream owners:
thoth-pub/thoth#840thoth-pub/thoth-dissemination#101APP-04 must use exact merged/deployed upstream identities when verification occurs.
9. Invariants
10. Source write budget
Existing files permitted: NONE
New files: NONE
Deletion/move/rename: NONE
Branch / PR: NONE EXPECTED
If integration evidence proves a real app defect, return:
HOLD - APP-04 SOURCE AMENDMENT REQUIREDBefore any code edit, amend this issue with:
devbase and overlap state;Any source fix must remain generic/backend-driven and must not hard-code retired platform eligibility/visibility.
11. Verification evidence
11.1 Source-level verification
Against the exact app source used for integration, confirm the generic editor seams above remain unchanged or semantically equivalent. Re-read them if
devhas moved; do not rely on this baseline by memory.Run the exact focused service-configuration/editor tests against that source and record their results. No test/source mutation is authorized merely to add retired-platform names.
11.2 Backend/API verification
Under a separately authorized suitable test/non-production deployment or controlled production cutover, capture bounded evidence of:
distributionPlatformOptionsmembership/assignability facts;Do not expose tokens, credentials or unbounded protected payloads.
11.3 UI verification
Under separately authorized browser/runtime read access, verify:
Browser/runtime access is a separate permission; it is not authorized by this specification candidate itself.
12. Candidate verification action-authorization matrix
This matrix is specification content only; it is not active authorization. Exact integration verification requires a later authorization bound to concrete backend/app deployment identities.
13. Automatic side effects
Because APP-04 currently has no source branch/PR, it has no expected code-delivery side effect.
If future evidence requires app source work, this specification must be amended and live CI side effects re-verified before source/PR authorization. Do not inherit assumptions from this zero-change plan.
14. Existing app release interaction
APP-RR-01 / #142 remains the existing repository
dev -> mainrelease-readiness control, but its recorded source snapshot predates currentdev @ cd16ae2830ad656113e0303f0123b2ffb39084f4. Any future promotion must reconstruct #142 against the then-exactdev/mainpair.Because APP-04 currently has no source diff, it does not itself alter a release candidate. If APP-04 later requires source work and merges to
dev, the release-readiness control must again be freshly reconstructed against the new exact candidate before promotion.15. Acceptance criteria
assignable=false;16. Rollout / rollback
APP-04 itself has no rollout because it contains no source change. It observes the controlled upstream rollout after BE-05/DIS-03/data gates are complete.
If verification fails, HOLD upstream activation/closure and classify the failure:
Do not roll back or mask upstream state from the frontend merely to make the UI appear clean.
17. HOLD / STOP
HOLD if:
STOP if APP-04 begins:
18. Current authorization
Authorized now:
Not authorized now:
19. Next action
Obtain independent review and CTO approval of this revised, rebound zero-source-change verification specification. Then leave APP-04 HOLD until BE-05, DIS-03 and assignment-reconciliation gates supply exact deployment/state identities for a separately authorized integration verification.