No cargo landed yet. Load a source export at LANDING.
Drop the source export here. Workbooks with several sheets, exports split across several files, vendor title rows, merged headers and units written into cells are all expected. Nothing is translated until you have read the cargo summary.
Drop .xlsx, .csv or .txt exports here
Sniffer idle.
One entry per landed table, before any translation. Confirm the record type the sniffer assigned before moving on.
Two things live here. Columns the cargo model has no field for can be carried across as extension fields, if the target has room and if you say so. And any column, mapped or carried, can be put through a transform before it is read, so a value that is nearly right can be repaired once rather than by hand a thousand times. Every transform that moves a value is written into the exception report.
A profile is the mapping, the carry choices, the transforms, the cadence approvals and the arbitration, written out as plain JSON so the work done once on this pair of systems can be reused on the next site. Before a profile is applied it is checked against the export in front of you, because a profile written on last quarter's export is the quiet way a load ends up full of empty columns.
What is actually being held, measured from your cargo rather than guessed from the row count. A browser has a ceiling and PORTAGE would rather show you where it is than let you find it halfway through a migration.
A migration too big for one pass can be run in several, by site or by record type. Write a receipt after each pass, load the receipts back here, and the evidence merges into one exception report and one summary. Receipts hold the counts, the findings and the exceptions, never the cargo.
Taking soundings before the cargo goes in the water. This station measures the shape of your own data: the naming convention the identifiers actually follow, collisions inside the export before any target is involved, and how your code lists compare against the ones the target already has. PORTAGE has no opinions about your taxonomy and changes nothing here. What it produces is a document to take to the owner.
The convention below was derived from your identifiers. It is a description of what is there, not a rule about what should be. Records that do not follow it are listed so somebody can decide whether they are mistakes or exceptions.
Duplicates within the export itself, on four keys: identifier, tag, serial number, and the same description in the same location. A repeated identifier is the one that does real damage, because in the target one record will overwrite the other.
Failure codes, asset types and craft codes compared against a target side export, if one has been landed at RECONCILE. Three lists and no fourth. PORTAGE will not propose a correspondence between two code lists, because how a shop describes its own failures is not a thing a translator gets to decide.
The parent and child graph is rebuilt from whatever the source used: path strings, parent identifier columns, or delimiter encoded functional locations. It is then reprojected into the target's structure rules. Orphans, cycles and depth overflows are reported as findings. Nothing is silently reparented.
Preventive maintenance rules translated one at a time. Where the target cannot express a source rule, the row becomes a named exception with a stated fallback. Approve each fallback before cast off, or the exception rides through to the report unapproved.
For a merge rather than a virgin load, drop an export from the target system. Matching runs in layers: asset identifier exact, then normalised tag, then serial number, then name plus location fuzzy. Ambiguous keys are reported, never guessed.
Files are written in the target's own load order so the receiving system can take them in sequence. The exception report is not optional and it names the source row behind every dropped, truncated, defaulted or coerced value.
Load files are what a database needs. What an owner, an auditor or a vendor needs is a document saying what was done, what was lost, who decided, and what to go and check afterwards. Everything below is built from the same run, so the three cannot drift apart.