Skip to main content
The Port Authority Governance dataset contains structured records from five major US port authorities — Oakland, Long Beach, Los Angeles, JAXPORT, and the Port Authority of New York and New Jersey. Records cover board meetings, agenda items, minutes, tariff documents, resolutions, leases, and capital projects. Each port uses a purpose-built adapter (Legistar, Granicus, GravityView, AEM, or HTML) that normalizes records into a consistent schema for cross-port queries. Every record inherits the full APRS envelope (record_id, chunk_id, bitemporal fields, confidence_score, provenance) and carries the join keys documented below. APRS profile: aprs.port-authority/1.0.0

Covered ports

All five ports have at least 12 months of meeting data. Adapters run daily; tariff snapshots update quarterly.

Tables

The dataset is organized into multiple related tables rather than a single flat file. This structure reflects the natural hierarchy of governance records — meetings contain agenda items, which produce claims and facts.

Port authorities (dimension)

Meetings

Board and committee meetings with scheduling, location, and document availability.

Agenda items

Individual items from a board meeting agenda, classified by kind.

Claims

Source assertions — what was proposed or recommended by staff. Claims represent the “before” side of governance actions.

Facts

Resolved outcomes — what the board actually decided. Facts represent the “after” side of governance actions and are currently available only for Oakland (Legistar adapter).
Fact records require vote-tally data from the source system. Currently only the Oakland Legistar adapter surfaces passed_flag and vote_tally. Fact emission for other ports will follow as minutes-PDF extraction (roll-call parsing) is added.

Minutes

Published meeting minutes with document links and status tracking.

Tariffs

Port tariff documents tracked across revisions. When a new tariff version is published, Codex extracts individual line items and links them to the parent document.

Tariff items

Individual line items from tariff documents with bitemporal supersession tracking. When a rate changes between tariff versions, the old item’s superseded_by field links to the replacement.

Tariff version tracking

Tariff items use bitemporal supersession to track rate changes across versions. When a newer tariff version lands and the diff engine matches an old item to a new one:
  • The old item gets effective_to set to the new version’s effective date
  • superseded_by links to the replacement item’s record_id
  • modified_at is refreshed
Items removed in a newer version get effective_to set but superseded_by remains null. Query rates in effect at a specific point in time:

Claim and fact separation

Governance records use the claim/fact layer to separate what was proposed from what was decided. Every agenda item is classified as either a claim (staff recommendation, pending proposal) or a fact (board decision with recorded vote). This makes it straightforward to query for approved actions versus pending proposals. For example, a staff recommendation to approve a terminal lease appears as a claim. If the board votes to approve it, a corresponding fact record captures the vote tally and outcome. You can join claims to facts through the shared event_id and item_id keys.

Enum values

Governance model

Meeting type slugs

Stable URL-safe slugs derived from body_name: Unmatched body names fall back to a slugified version of the source text.

Passed flag values

Source-supplied status string, lowercased. Values that indicate an affirmative outcome: pass, passed, adopted, approved. Values that indicate a negative outcome: fail, failed, rejected, denied. Other values are stored verbatim.

Cross-dataset joins

The Port Authority Governance dataset joins to other Codex datasets through two paths.

To AIS Maritime Positions

  • Port-level: join port_authorities.unlocode to vessel port-call attribution in AIS Maritime. For example, UNLOCODE USJAX maps to all vessel calls at Jacksonville.
  • Terminal-level: join port_authority_terminals.h3_r9 to ais_positions.h3_index at H3 resolution 9. A vessel’s position within a terminal’s H3 cell during a port call attributes the call to that terminal, which joins to lease records for “which lessee was operating that terminal at port-call time.”

To Civic Intelligence

port_authority_meetings.jurisdiction_slug aligns with civic_records.jurisdiction_slug from the Civic Intelligence dataset. This enables queries like “all civic actions in Oakland adjacent to port-board actions from the same jurisdiction.”

To Events Timeline

Every fact-kind agenda-item record and every adopted resolution surfaces as an Events Timeline row. The fact’s effective_from becomes the event’s occurred_at.

Join keys

Example queries

Find all approved lease actions at the Port of Oakland in the last year:
List all board meetings across ports with published minutes:
Compare tariff rate changes between versions at a specific port:
Query rates in effect on a given date:

Known limitations

  • Fact coverage is port-dependent. Only the Oakland Legistar adapter currently emits fact records with vote tallies and pass/fail outcomes. Other ports will gain fact emission as minutes-PDF extraction is added.
  • Tariff items cover JAXPORT only. The tariff parser is currently JAXPORT-shaped. PANYNJ uses a different table layout that requires a separate parser. Other ports (POLA, POLB, Oakland) negotiate pricing via leases rather than publishing item-level tariff schedules.
  • Lease and capital project tables are scaffolds. These tables exist in the schema but are not yet populated. Records will appear once the resolution-PDF extractor ships.
  • Counterparty resolution is deferred. counterparty_urn on claims and leases stays null until the corporate-registry entity resolution pipeline is available. Lessee names are stored as raw strings in the meantime.
  • Meeting dates may be missing. The NY & NJ adapter does not currently parse event dates from document metadata, so event_date is null for PANYNJ meetings.
  • Adapter coverage varies. Not all adapters surface the same fields. Granicus and HTML adapters do not provide roll_call or vote_tally data.
  • Tariff items are text-based. The rate field is stored as text to accommodate varied formats (ranges, multi-part rates, conditional pricing). Parse with care when doing numeric comparisons.
  • Historical depth varies by port. The initial backfill covers approximately one year of meetings. Older records may be added in future collection runs.
  • Undated tariff versions. Some earlier JAXPORT tariff versions lack effective_from. The superseded_by chain is still correct, but absolute point-in-time queries against undated periods are imprecise. Use the parent tariff’s tariff_year as a fallback.