Eighty characters a line, and the blanks count.

AES commodity lines on the shipment, the AESTIR file written to the byte, and the ITN or the rejection read back onto the shipment through ACE WebLink.

What it does

A fixed-width file is not a text file with numbers in it.

There are no commas holding the fields apart. Column 41 is column 41, a value one place to the left is a different field entirely, and the file that results is not rejected — it is accepted, and it says something else.

Fig. 1 — Eighty columns, and column eighty-one does not exist.lib/aestir.ts
One AES commodity line eighty columns, fixed width — the position is the meaning 11020304050607080 record identifier line number HTS quantity value and so on column one to column eighty Accepted one column late record identifier line number HTS quantity value and so on not that field — the whole line comes back Rejected The response file reads the ITN and the reason for rejection back onto that shipment.
A one-column shift has no partial failure to report: there is no delimiter to resynchronise against, so the whole line comes back rejected rather than the one field that moved.
AES — HBL LAX-2609-0148 12 commodity lines
AESTIR file written — 14 records30 Aug 09:05 PT
Two of the fourteen records, exactly as they sit in the file. The ruler above them is the file’s own width.
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
CL00074407110120USCN000000012PCS000000045000000000122KGSLAX20260830             
SR0001X20260830123456ACC202608301602PT                                          
Every line, padded to80 characters
ITN X20260830123456 — acceptedFrom ACE WebLink
Where the file goes next
The office downloads it. CBMGO does not transmit it, and there is no queue on this screen of things waiting to be sent.
708
Lines that place the characters
One module whose entire job is deciding what sits in which column, and what pads the rest.

The trailing blanks are part of the record

Both lines above run the full eighty characters. The second one is mostly spaces after column 38 and those spaces are not decoration — a reader counting fields will find them, and a file that stops early is a file that has lost its last fields rather than left them empty.

And the response comes back

When it is accepted, the ITN lands on the shipment. When it is rejected, the reason lands on the shipment, where the person who has to fix it will see it.

Response — rejected Line 7
Rejected — 30 Aug 14:41 PTWritten to shipment
Line 7 — quantity and unit of measure disagreeFix
The reason is stored with the shipment, not pasted into an email. The commodity line is corrected, the file written again, and handed back to the filer.
Why this row exists at all
One of the twenty release checks caught the hole: the screen could draw a rejection and no button in the system could write one.

A rejection with nowhere to live is a rejection that gets forgotten

This is the ordinary shape of the failure. Someone forwards the rejection to the desk, the desk fixes it, and three weeks later nobody can say whether that shipment ever went out clean, because the only record of the problem was in a mailbox that belongs to one person.

So the rejection is a field on the shipment. It has a date, a reason and a line number, it exports with everything else, and it is visible to whoever opens the shipment next rather than whoever happened to be on the email.

AMS and the 24-hour rule →

The rule this file is built on

Fixed width forgives nothing, so the code does the counting.

Seven hundred lines to write a text file sounds excessive until a one-character offset has been chased through a file that was accepted.

There is no delimiter to fall back on

In a CSV, a missing value shifts one row and the parser complains. In a fixed-width record, a value that is one column short pushes everything after it left, and the file still parses. The receiving system reads a valid record that means something nobody intended. Nothing errors, nothing bounces, and the mistake surfaces days later as a rejection whose reason points at the wrong field.

So padding is a decision, not a detail

Left-pad or right-pad, zero-fill or space-fill, truncate or refuse — each field has one right answer and the wrong one is invisible. That is what the seven hundred lines are: those answers, written down once, in one place, so that no screen anywhere gets to improvise a substitute.

What this does not do

Four things it will not do.

It does not transmit the file
CBMGO writes it and the office downloads it. CBMGO holds no ABI filer code and is not a broker. The filer sends it and the response comes back onto the shipment.
No EDI over a VAN or AS2
The same rule everywhere: CBMGO writes files, the customer moves them. A 315 status file is generated and downloaded the same way. Booking EDI — 300 and 301 — does not exist here at all.
It does not classify the goods
The commodity line takes what is on the shipment. Deciding what the goods are is not a decision software should be making on the forwarder’s behalf.
It does not retry
A rejected filing is a person’s job. CBMGO records the rejection and its reason and shows it on the shipment; it does not silently correct and resend, because there is nothing here that sends.
Get a demo

An export that was rejected makes a useful demonstration.

The commodity lines are built and the file written during the call, then opened so the columns can be counted. Forty-five minutes, on a demonstration company or on a copy of the forwarder’s own spreadsheet.