RFC 091: Digitisation ingest identifiers during the Sierra to Folio migration - #159
RFC 091: Digitisation ingest identifiers during the Sierra to Folio migration#159kenoir wants to merge 3 commits into
Conversation
…igration Publishes the digitisation-ingest discovery work as an RFC. It sets out why the Sierra b-number cannot simply be swapped for a Folio id during the LMS migration, and proposes minting catalogue-style identifiers at ingest via a secured endpoint on the Identifiers API (RFC 089), with separate cross-migration and post-migration ingest paths. Regenerates the RFC listing table via .scripts/create_table_summary.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ring Mermaid treats ';' as a statement separator in sequence diagrams, so the verify-step message split mid-line and the diagram failed to render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s and arrow symbols Open question 1 now states the iiif-builder/DLCS concern in terms of the storage handle vs the file names in METS, and points to RFC 085, which owns the IIIF/DLCS identity rework and currently lists the Goobi message and METS shape among its open unknowns. Also replaces em-dashes and → / ↔ symbols with plain prose. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
If I have understood correctly, the identifier defined here as I think this identifier needs a really clear name so we always know what we are talking about. I know this is about b-numbers and FOLIO migration, but is it worth putting more examples into the RFC for the equivalent changes that have to happen for CALM Refs in both digitised and born digital content? For example in the sections
And in the section
It's not just digitisation; a born digital item has the same issues, just with a different identifier form. It's really about preservation:
Digitisation happens before preservation for physical objects, but digitisation is not a step for born digital archive material. Yet they face the same identity issues. Preservation is a precursor to all IIIF-ification, whether born digital or digitised, whether source identity is bibliographic or archival. Unlike b numbers, hierarchical archival identifiers (AA/BB/37) still exist in the new world. So it's not quite the same, but there is one desired change that has some overlap and may have some implications for the proposal here. Our intention is that the canonical form for all IIIF representations is the Catalogue Work ID, not just those whose canonical form is currently a b number. At the moment the b number is the canonical form for all works that have b numbers, but some do not - in particular, born digital archival material from CALM, and old Miro images. Consider: https://iiif.wellcomecollection.org/presentation/SB/1/1/298 This redirects to https://iiif.wellcomecollection.org/presentation/b19995271, because, even though it's in CALM, it:
Its preservation identifier / It has a work ID, which is In the future, this IIIF Manifest's canonical URL will therefore be https://iiif.wellcomecollection.org/presentation/dpv7wsth Now consider: https://iiif.wellcomecollection.org/presentation/SABTS/A/2/10 It looks similar, but it doesn't redirect, because:
Its preservation identifier / It has a work ID, which is In the future, this IIIF Manifest's canonical URL will therefore be https://iiif.wellcomecollection.org/presentation/h3jc4wga ...we will start redirecting it if we receive the archival ref form This is relevant to the PR because the notion of "preservation identifier" /
...but maybe it could be clearer and have a good name: there are CALM Ref preservation identifiers, too, that are not b numbers but continue to be the identifier the storage service understands the thing to be, forever. I think that this is what's meant in the paragraph Canonical id continuity and in the proposal, but I find the terminology confusing (maybe not close enough to it) - different identifiers are canonical in different contexts: an old digitised object's canonical identifier is a b number as far as Goobi and Storage are concerned, and remain so forever. But the same item's canonical IIIF Manifest identifier uses the work ID. If all Goobi or Archivematica ever rely on when processing is this preservation identifier /
Can it be clearer what this catalogue-style id looks like, for new items after the migration has happened:
I assume this catalogue-style id is NOT the workId, but minted separately? And it's not the folio id or archival ref either. I don't know what folio IDs look like but suppose there's an entirely new work - a printed book - being digitised with folio id In this scenario, the IIIF manifest that iiif-builder builds and saves to S3 should be stored as On receipt of the workflow message, iiif-builder would pass "wxyz9876" to the identity service and get back a list that included blocks for A series of examples with identifiers for all of the digitised/born-digital, folio/axiell permutations would be really useful and may catch something lurking here. Other random observations:
iiif-builder prerequisite
I think it's worth having a comparison of what these two identity services do. The main driver for the Identity Service in RFC 081 was:
(This may be on hold due to the migration work). Rather than have the DDS parse identifiers and deduce what they are (b numbers etc), where they are stored (digitised or born-digital space), what flavour of METS file they are expected to have (Goobi or Archivematica) etc., the DDS calls a service, passing the identifier (always the resolved currently canonical identifier, so currently never a Catalogue Work ID) and getting back a The current implementation of this service still uses the same string parsing logic for now, but it also stores identities in a database, and validates that its conclusions about storage space and source are in fact correct. This was originally the groundwork for "bnumbers through Archivematica" - to remove the assumption that b-number means goobi, b-number means digitised storage space, etc., with the possibility that the information "this identifier's work is preserved in the This implementation is not an identity resolution service as proposed in RFC 091. You can't give it a Catalogue workID and expect it to return a DdsIdentity object, because it expects the canonical form (b number or CALM Ref) and then tells you various things about it, rather than accepting any identifier form and telling you the canonical form and aliases. It also does things that the proposed platform identity service isn't designed to do, such as understand that if you pass However, the current You could say there should be one identity service to rule them all, the authoritative means of resolving an identity to something and learning about its aliases. But the distinction is that the 091 service is about the Catalogue: semantic records for works. Whereas the DDS service is about digital objects and their sub-structure. Inner structure of a digital object has no Catalogue description, therefore the 091 Identity service shouldn't be concerned with it. It's the DDS's job to be authoritative. If it is useful for other Wellcome processes or workflows to know about these internal structure things, then the DDS should expose it as API. |
This is really useful feedback, but I want to focus in on this paragraph in particular because it will help clarify our position. In you example above the following canonical ids exist:
In the catalogue pipeline matcher/merger we will have noticed that these refer to the same work from merge candidates, and merged them such that In our proposal the digital locations can carry identifiers with whatever context we have at that point, it could be the METS source id The storage service will get the A crucial point is that this re-direction from
I think in this case in the IIIF APIs Worth clarifying the relationship with predecessor ID which is different: We commit that it will always be true that |
|
A concrete example Something that exists today: https://wellcomecollection.org/works/km3uczhf is the work page atm the latter redirects to ../b28047345 but later it won't, we want to use the catalogue ID here. Something created in 2027: https://wellcomecollection.org/works/abcd3456 is the work page (if I understand correctly) ...but do we want the canonical IIIF Manifest to be You say:
Which implies that at initial Manifest construction time (after the Goobi workflow finishes) we'd have to build our Manifest as wxyz9876.json... if we looked up wxyz9876 at that point could we not learn that abcd3456 is its canonical ID? That doesn't mean we can't have https://iiif.wellcomecollection.org/presentation/abcd3456 as the canonical IIIF Manifest URL, because we can resolve all these identities at the point of service, but we should decide whether that is in fact what we want. It seems neatest and user-friendliest to me that the work page and the manifest being shown on that work page have the same identifier element in them, but it is obviously not a technical necessity |
Yes, that's correct This could be hinting that we should not take this path and instead continue to represent METS sourced works by source identifiers in their current style, i.e. mets/123-lms-id-value. In that situation keeping the id value the same carries the benefit to digital production staff where the thing came from, rather than obscuring it, which the canonical ID would. We could then simplify this RFC to include only the at point of ingestion tool that keeps records from the new LMS with sierra predecessor IDs on their previous system IDs. |
|
Alternatively we could keep minting the catalogue identify at point of ingestion, if we can be comfortable with the IIIF endpoints using the METS sourced work canonical identifier, to continue the example: The identifiers API can still exchange these source identifiers for public catalogue identifiers, but cannot hold the result of redirection from merge, the catalogue-api is still the best place to find that. |
|
Yes! It looks like we should continue using source ids as storage identifiers. I suppose there's an interesting question about who/what the identifiers are for and what they mean. I had pictured them as externally-facing so should be an external-style id. However, that does not necessarily follow. Ids in the storage service or in METS or IIIF files or whatever are not intended to be shared manually like Wellcome Canonical Ids for Works and Concepts are. These ids could just as well be UUIDs as anything else. Whatever id scheme we choose, it is not designed to carry meaning; but that doesn't mean it cannot be generated directly from a meaningful identifier (i.e. there's nothing wrong with saying that the id I can imagine a scenario where matching/merging rules change meaning that where we did have a matching storage id and work id, they no longer match. It might cause a bit of a debugging headache where I try to find the storage object that matches the work id. If they never matched (because they are always in different schemes) then that confusion won't arise. |
Preview
View the rendered RFC on this branch (renders the Mermaid diagrams and tables):
What does this change?
Publishes the digitisation-ingest discovery work as RFC 091. The RFC sets out how digitisation ingest identifiers should work across the Sierra to Folio LMS migration.
Today the Sierra b-number is the shared key for digitised content. It is the Goobi ingest package id, the storage
externalIdentifier(digitised/<b-number>/vN), the METS work's own identity (mets/<b-number>), the merge candidate that joins the METS work onto the public catalogue work, and the IIIF manifest URI and DLCS asset ids. The migration removes the b-number, so the RFC explains why it cannot simply be swapped for a Folio id (doing so would reset storage versioning and silently break the merge join key, leaving digitised content invisible on the public record with no error), and proposes minting catalogue-style identifiers at ingest instead.The proposal builds a small application for digital production staff that creates ingest package metadata from Folio, and splits behaviour on whether the Folio record carries a predecessor pointer to an old b-number:
sierra-system-numbermerge candidate. This is the lower-risk path; it needs no transformer change and leans on RFC 083 predecessor relationships to keep canonical ids stable. After migration it needs only Folio-target merger rules.folio-instancemerge candidate and build themets/<folio-id>own-identity. The transformer carries C from the storageexternalIdentifierinto the work's identifier block, and the id_minter verifies themets/<folio-id>↔ C binding (raising rather than minting on a mismatch). This path is blocked on RFC 081'sIIdentityServicein iiif-builder.The RFC also covers alternatives considered, the merger-rule changes needed for Folio targets, dependencies for each path, and two open questions.
Files changed:
rfcs/091-digitisation-ingest-identifiers/README.md: the RFC document (with two Mermaid sequence diagrams for the current and proposed ingest flows).rfcs/README.md: RFC listing table regenerated by.scripts/create_table_summary.py(RFC 091 row added).How to test
.scripts/validate_rfc.py..scripts/create_table_summary.py --check-readme.../085…/,../088…/,../089…/,../090…/) resolve only once those branches merge; they are correct against the merged layout.How can we measure success?
No measurable runtime success criteria; this is a documentation RFC. Success is the RFC being reviewed and the team aligning on the digitisation-ingest identifier approach across the migration, in particular the decision to mint catalogue-style ids rather than reuse the Folio id, the cross-migration / post-migration split, and the secured mint endpoint on RFC 089.
Have we considered potential risks?
externalIdentifier(C) equals the METS record identifier (folio-id); and confirming the id_minter can verify a supplied source-id ↔ canonical-id binding and raise on a mismatch, rather than only assigning a fresh id.Notes for reviewers
IIdentityServicein iiif-builder) for the post-migration path. Related in-flight work: RFC 085 (IIIF identities, RFC 085: IIIF identities #143), RFC 088 (identity/requesting migration, RFC 088: Record the barcode sequence service #158), RFC 090 (CMS↔LMS sync, RFC 090: CMS and LMS Sync #157), and RFC 083 (stable identifiers) on main.🤖 Generated with Claude Code