Files
fpc-msgbase/docs/ftsc-compliance.md
Ken Johnson 6b225fedfc 0.4.0: PKT moves to fpc-ftn-transport (breaking change)
Removes all PKT code from fpc-msgbase. The wire format and its
container concerns now live in the sibling fpc-ftn-transport
library (units tt.pkt.format, tt.pkt.reader, tt.pkt.writer,
tt.pkt.batch).  Pair this commit with fpc-ftn-transport's
0.2.0 (commit 6bb71a6).

Why: the previous "reader here, writer there" split (briefly
landed in 0.3.5) baked in a coupling that didn't survive a
fresh look. The writer reached into fpc-msgbase for types,
the wire format lived in the wrong house, and consumers reading
fpc-msgbase saw "PKT support" that was actually only half-
support. Cleanest split: PKT is a wire format, both directions
belong with the wire-format-aware library; fpc-msgbase becomes
purely real message bases (Hudson / JAM / Squish / MSG /
PCBoard / EzyCom / GoldBase / Wildcat).

Also a cleaner separation-of-concerns story: a BBS that just
reads JAM/Squish never needs fpc-ftn-transport. A pure store-
and-forward node doing only ArcMail unbundle never depends on
storage formats. Each library = one concern.

Removed:
  src/formats/ma.fmt.pkt.pas       -> tt.pkt.format
  src/formats/ma.fmt.pkt.uni.pas   -> tt.pkt.reader
                                      (TPktMessageBase -> TPktReader)
  src/ma.batch.pas                 -> tt.pkt.batch
                                      (TPacketBatch class name unchanged)
  tests/test_batch.pas             -> tests/test_pkt_writer.pas
                                      (consolidated PKT tests)
  examples/example_tosser.pas      -> moves with the batch helper

Reduced in src/ma.types.pas:
  - PacketRecord
  - FlavourType / FlavourTypeSet / DateTimeArray
  - FlagsToFido / FidoToFlags
  - VersionNum (PKT-product-code stamping)
  All moved to tt.pkt.format.

Kept in src/ma.types.pas:
  - mbfPkt enum value (so tt.pkt.reader can register the backend
    with the unified-API factory; consumers still use the
    standard MessageBaseOpen(mbfPkt, ...) shape)

Migration for vendoring consumers:

  before:                      after:
    uses ma.fmt.pkt;             uses tt.pkt.format;
    uses ma.fmt.pkt.uni;         uses tt.pkt.reader;
    uses ma.batch;               uses tt.pkt.batch;
    (no writer surface)          uses tt.pkt.writer;

    TPktMessageBase              TPktReader
    TPktFile, TPktMessage,       (unchanged class names)
      TPktHeaderInfo, etc.
    TPacketBatch                 (unchanged)

Docs sweep:
  - README: PKT row called out as "moved to fpc-ftn-transport";
    TPacketBatch removed from features.
  - docs/architecture.md: layer diagram drops PKT + ma.batch;
    new sibling-library box added for fpc-ftn-transport.
  - docs/attributes-registry.md: PKT column dropped from per-
    format support matrix; pointer to fpc-ftn-transport.
  - docs/API.md: PKT cheat-sheet entry redirects to
    fpc-ftn-transport; TPacketBatch section reduced to a
    "moved" pointer with the new uses-clause shape.
  - docs/ftsc-compliance.md: Type-2 / 2+ / 2.2 / AuxNet rows
    annotated as living in tt.pkt.format.

Suite: 47/47 across 9 programs (was 9 with test_batch; now 9
with the PKT bits dropped from test_consumer_round1 and
test_hwm).  All other tests untouched.
2026-04-18 11:32:42 -07:00

2.3 KiB

FTSC compliance

This library treats the FTSC document collection at /home/ken/Source Code/ftsc/docs/ as authoritative for every FidoNet-family format. Wire formats, attribute bits, date strings, packet headers, and kludge syntax must match the specs exactly.

Specs applied

Area Spec Status in ma.types.pas
FTS-1 attribute word (bits 0..15) fts-0001.016 Verified: bits match spec
FTS-1 *.MSG file layout (190 bytes) fts-0001.016 Implemented per spec
FTS-1 DateTime string "DD MMM YY HH:MM:SS" fts-0001.016 MsgDateToTDateTime matches
Type-2 packet header (58 bytes) fts-0001.016 Lives in fpc-ftn-transport's tt.pkt.format
Type-2+ packet header fsc-0039.004 Lives in fpc-ftn-transport's tt.pkt.format
Type-2.2 packet header fsc-0045.001 Lives in fpc-ftn-transport's tt.pkt.format
AuxNet Type-2 variant fsc-0048.002 Lives in fpc-ftn-transport's tt.pkt.format
Kludge lines (^AMSGID, ^AREPLY, …) fsc-0009, … Implemented per spec

Non-FTSC formats

Several backends cover formats that are not FTSC:

  • Hudson — QuickBBS-style 5-file layout. Spec source: QuickBBS documentation.
  • JAM — jam.txt by Joaquim Homrighausen, Andrew Milner, Mats Birch, Mats Wallin. Canonical spec shipped with the JAM reference code.
  • Squish — Lanius squish.doc by Scott Dudley.
  • PCBoard — Clark Development pcboard.doc.
  • EzyCom — EzyCom reference.
  • GoldBase — widened Hudson variant.
  • Wildcat — MSI SDK (vendored in src/wc_sdk/).

Verification protocol per format

Before marking a format implementation complete:

  1. Open every sample base under tests/data/<format>/ read-only, walk all messages, dump to text. Verify counts and known field values.
  2. Round-trip: read every message, write it to a fresh base, read back, compare. Every field a backend writes during a Read it MUST re-consume during a subsequent Write.
  3. Re-read the relevant FTSC / format spec and confirm every field in TUniMessage is preserved.