Governed Bridge — NYCN Handoff Map
Status: draft spec, handoff map. Maps NYCN's fake airlock rehearsal outputs onto ICN's governed-bridge conformance contract, so the fake fixtures at
../../tools/bridge-conformance/nycn-intake-handoff-v0/(§3–§12) and../../tools/bridge-conformance/nycn-relationship-handoff-v0/(§14) can be read alongside their NYCN sources. It defines vocabulary/field mappings only — it implements no bridge, adds no route, reads no source, and does not imply any bridge can import real rows today. Both sides are fake. It advances ICN #2377 without closing it. Package-local source nouns appear ONLY in NYCN-source columns/labels; every ICN-side name is generic (ICN core does not know what the package's local roles mean).
1. Purpose
ICN #2375 landed the governed-bridge conformance contract and its validator
(tools/validate-governed-bridge-conformance.py), with a first fake fixture
review-coverage-v0. NYCN #85 / #87 / #88 / #89 landed fake airlock fixtures and
a local validator on the producing side. Neither side referenced the other. This
document is the explicit bridge between the two fake vocabularies, and it backs
the fixture nycn-intake-handoff-v0, which expresses NYCN's fake intake
rehearsal in the ICN contract and passes the ICN validator unchanged.
The NYCN source is docs/bridge-rehearsals/fake-intake-import-airlock/
(source-records, dry-run-plan, review-decision) in the NYCN repo. Every
value on both sides is invented.
2. Non-claims
- Fake data only; nothing was imported, handed off, synced, or written to a node.
- No runtime bridge, no connector, no live sync, no real Drive / Sheets / SimpleTix rows, no private operational data.
- No production, pilot-readiness, or live-federation claim; no claim that NYCN operations are ICN-native today.
- No payment / settlement / wallet / token / cryptocurrency framing. External references are observed, never processed.
- Action cards are derived read views, never write targets.
ArtifactReceipt(verified-transfer proof) never satisfiesArtifactRegistrationReceipt.- A receipt records an institutional fact and grants zero authority.
3. Record and field identity
| NYCN concept | ICN concept | Note |
|---|---|---|
record_id (fake-intake-001) |
source_record_ref (nycn_rec_fake_001) |
ICN requires an opaque/hash-bound ref, never a raw natural or PII key. The fixture uses fresh opaque ids; a real bridge would hash-bind the source key. |
source_field (flat, e.g. accessibility_need) |
field_path (dotted, attendee.accessibility_need) |
Mechanical rule: attendee.<source_field> for intake records. The same field_path must appear identically across binding, dry-run, and steward-review. |
source_simulated prose + external EXT-*-fake-* tokens |
allowed_source_systems + source_system_id (src_sys_nycn_fake_intake) + source_shape_ref |
NYCN names its source in prose; ICN needs an allowlisted opaque system id. |
4. Privacy-class handling
ICN's validator treats privacy_class as an opaque string, so NYCN's richer
taxonomy passes through verbatim — public, participant_visible,
care_sensitive, organizer_only, follow_up_only, external_reference,
discard. ICN does not force NYCN to collapse these into a shorter set; the
class travels with the field into the custody map. This is the anti-capture
property: the contract fixes the safety invariants (custody kinds, receipt
obligations, coverage, privacy scan) but leaves the institution's data model to
the institution.
5. Custody-target translation
NYCN's free-text future_icn_target strings map onto ICN's closed 7-kind
custody_target.kind enum:
NYCN future_icn_target |
ICN custody_target.kind |
Receipt(s) on approve |
|---|---|---|
ArtifactRegistry / icn-publish public program signal |
artifact_registry (namespace) |
BridgeImportReceipt + ArtifactRegistrationReceipt |
icn-directory participant projection |
scoped_vault (scope directory-participant-visible) |
BridgeImportReceipt + VaultObjectWriteReceipt |
ScopedVault care-restricted |
scoped_vault (scope care-restricted) |
BridgeImportReceipt + VaultObjectWriteReceipt |
ScopedVault attendees-internal |
scoped_vault (scope attendees-internal) |
BridgeImportReceipt + VaultObjectWriteReceipt |
icn-action-cards follow-up candidate (consent present) |
governed_object (follow-up-record) |
BridgeImportReceipt + FollowUpObjectCreationReceipt |
External bridge reference (ExternalCustodian) — observed, not processed |
external_reference |
BridgeImportReceipt + ExternalReferenceObservationReceipt |
none — do-not-import |
discard |
DiscardDecisionReceipt |
The intake flow naturally exercises five custody kinds (artifact_registry,
scoped_vault, governed_object, external_reference, discard). It does
not naturally exercise policy_gate or policy_block; see §7. No fields were
synthesized to reach full taxonomy coverage — review-coverage-v0 already proves
that.
6. Gate-field handling
NYCN's follow_up_consent is a gate: consent present authorizes a follow-up;
consent absent forbids it. NYCN also treats any field name containing
permission as gate-like (e.g. the sponsor flow's public_logo_permission,
out of scope here). In this intake fixture the gate is expressed on the
follow-up's own field_path: consent present → approve the underlying
governed_object; consent absent → an automatic block (see §9).
7. Custody kinds not exercised
policy_gate and policy_block are ICN custody kinds where a field is routed to
a gate/block target rather than a write target (e.g. an unapproved publication
permission that is blocked from publication, as in review-coverage-v0's sponsor
public_logo_permission). The intake flow has no such published-artifact gate;
its one gate (follow-up consent) blocks the creation of a follow-up
governed_object rather than the publication of an artifact, so it is modeled as
a steward block verb on the governed object, not as a policy_block custody
kind. A sponsor publication-permission gate — a natural policy_block — is a
candidate follow-up slice (§13).
8. Reviewer authority gap
ICN requires a verifiable reviewer_authority_ref (a DID/signature/authority
basis); a display role alone is explicitly insufficient. NYCN's fake review
decision carries only a role-only reviewer_role (summit_data_steward) and has
no verifiable-authority field. The fixture supplies a fake
reviewer_authority_ref (authref_nycn_fake_did_sig_001) with the role as a
display label. NYCN adding a verifiable authority reference to its airlock
review-decision shape is a candidate follow-up (§13).
9. Decision decomposition
ICN requires exactly one atomic decision per (source_record_ref, field_path),
using one of the closed verbs (approve, reject, hold, block, discard,
request_reobservation, request_reclassification,
request_member_consent_review). NYCN's review decisions are compound and
record-level (e.g. approve-with-split, approve-public-only-hold-rest) with
field-level lists (approved_targets / rejected_fields / held_for_review /
blocked_fields / gate_fields). The handoff decomposes each compound
record-level NYCN decision into N atomic ICN per-field decisions. For example, a
single NYCN "approve-with-split, discard the free text, block the no-consent
follow-up" record becomes distinct approve, discard, and block rows keyed
by (record, field).
An automatic block (no-consent follow-up) is marked automatic: true and
carries no BridgeReviewDecisionReceipt — an automatic policy block is not a
human review.
10. Receipt translation and the action-card conflict
NYCN's fake planning materials name a follow-up as an action-card creation and
use a receipt named ActionCardCreationReceipt. ICN forbids that name: it is
a deprecated placeholder (see governed-bridge-receipts.md), and the conformance
validator rejects it as a literal anywhere inside a fixture directory. The
doctrinal reason is ADR-0027: an action card is a derived read view of an
underlying governed object; it is never a write target, so there is no
card-write receipt. The handoff routes a consented follow-up to an underlying
governed_object with FollowUpObjectCreationReceipt; a card derives from that
object downstream. This deprecated name is named here (outside the fixture
directory) only to document the conflict; it never appears in the fixture.
Otherwise the receipt vocabularies align: BridgeDryRunReceipt,
BridgeReviewDecisionReceipt, BridgeImportReceipt, VaultObjectWriteReceipt,
ArtifactRegistrationReceipt, FollowUpObjectCreationReceipt,
ExternalReferenceObservationReceipt, DiscardDecisionReceipt, and a
consent policy-block receipt are shared by both sides.
11. External references are observe-only
NYCN's registration_reference (an external ticketing/registration id) maps to
ICN's external_reference custody kind with
ExternalReferenceObservationReceipt. ICN records that an external system
holds authority over a fact — it does not import the external document, does not
process any settlement, and does not claim to be the source of truth. The binding
marks external_reference_policy.observe_only: true.
12. Plan-hash gap
ICN binds the review to the dry-run via reviewed_plan_hash == plan_hash
(a hash-bound review). NYCN's airlock has no plan-hash concept. The fixture
supplies a fake planhash_nycn_fake_0001 on both sides. NYCN adding a
plan-hash / reviewed-plan-hash binding to its airlock shape is a candidate
follow-up (§13).
13. Candidate follow-ups (not opened by this document)
A relationship-flow handoff fixture (exercises— landed aspolicy_blockpublication gates)nycn-relationship-handoff-v0(§14).A receipt-naming decision for non-follow-up governed objects— resolved: the genericGovernedObjectCreationReceiptlanded in the receipts spec and validator family floor; the binding pins the per-field receipt.- NYCN-side plan-hash / reviewed-plan-hash support in the airlock review shape.
- NYCN-side verifiable reviewer authority reference (beyond the role-only field).
- A stronger NYCN fake-fixture privacy scan (real-name and external-id shape detection, which the NYCN validator does not yet perform).
Record-state-dependent custody— partially addressed (v0): a field's custody entry may now carry an optionalconditionpredicate declaring the source-state precondition under which its route is eligible (§15). Per-state multi-kind routing — the same field path routing to a different custody kind by record state — remains a future change (one field path still has one custody kind).
These are recorded as direction only; this document opens no issues.
14. Relationship / recognition / obligation handoff (nycn-relationship-handoff-v0)
Maps NYCN's fake sponsor-pipeline airlock rehearsal (its package-local
name; docs/bridge-rehearsals/fake-sponsor-pipeline-airlock/ in the NYCN repo)
onto generic ICN custody. The word "sponsor" is NYCN source vocabulary and
appears only in the source column below — the ICN fixture, field paths, custody
kinds, and receipts are entirely generic.
| NYCN source meaning (package-local) | Generic ICN field_path | Custody kind | Decision pattern | Expected generic receipts | Notes / limits |
|---|---|---|---|---|---|
| Sponsor public listing name + org category, gated on logo permission | relationship.public_listing_name, relationship.public_listing_category |
artifact_registry (ns public-recognition) |
approve where permission granted; automatic block where denied | review + import + ArtifactRegistrationReceipt; block: PublicationConsentBlockReceipt |
NYCN's recognition-artifact receipt name is a package alias — translated to the generic registration receipt, never imported. |
| Recognition preference | relationship.public_recognition_preference |
artifact_registry |
approve | same as above | Shapes the artifact; published only through it. |
| Public logo/name permission | relationship.public_recognition_permission |
policy_block |
automatic block where denied; where granted, consumed as the approval basis (not proposed as its own action) | PublicationConsentBlockReceipt (no review receipt) |
The one gate; policy_gate kind stays unexercised — nothing invented to reach it. |
| Sponsor obligation record (tier, table, program-ad terms) | relationship.commitment_level_label, relationship.fulfillment_request, relationship.fulfillment_preference |
governed_object, object_class: commitment-record (opaque) |
approve (001); hold where the level is ambiguous (002) | review + import + GovernedObjectCreationReceipt; hold: review only |
NYCN's obligation receipt name is a package alias — translated to the generic governed-object receipt with an opaque object_class. Levels are labels, never amounts; a commitment record is an institutional fact record, not a legal instrument. |
| Private contact fields | relationship.contact_role, relationship.contact_channel |
scoped_vault (relationship-restricted) |
approve | review + import + VaultObjectWriteReceipt |
No values are carried by the fixture. |
| Invoice reference / certificate-of-insurance status | relationship.external_invoice_reference, relationship.external_insurance_reference |
scoped_vault (finance-restricted) |
approve | review + import + VaultObjectWriteReceipt |
Held references — reference/status only; documents stay with the external custodian; nothing is processed. |
| Payment status observed | relationship.external_status_observed |
external_reference |
approve | review + import + ExternalReferenceObservationReceipt |
The only true observe-only external reference; observed, never processed. |
| Consent-gated follow-up | relationship.follow_up_consent |
governed_object, object_class: follow-up-record |
approve where consent present (001, 003); automatic block where absent (002) | review + import + FollowUpObjectCreationReceipt; block: ConsentPolicyBlockReceipt |
Same pattern as the intake handoff (§5); the follow-up class instance is its honest receipt. |
| Declined prospect (declined ≠ obligation) | relationship.closure_reason |
scoped_vault (relationship-internal) |
approve | review + import + VaultObjectWriteReceipt — never a commitment receipt |
Record-state custody: the declined record's public name is NOT proposed — public_listing_name now carries a v0 condition (eligible only where record_state == active, §15), making that source-state precondition explicit instead of silent omission. One field path still has one custody kind; no renamed field is invented. |
| Recognition-fulfillment / follow-up "cards" | — (no conformance action) | — | — | — | Cards are derived read views over the commitment and follow-up objects, which are already receipted; the deprecated card-write receipt name never appears in the fixture. |
| Free text | relationship.free_text_note |
discard |
discard | DiscardDecisionReceipt |
Discard-by-default. |
| Credential guard | — (no per-field counterpart) | — | — | — | Cross-cutting refusal doctrine, not a field decision; reject stays naturally unexercised. |
Source authorities translate as: sponsor-provided → counterparty_provided,
organizer-derived → institution_derived, external-accounting-system →
external_accounting_system. Privacy classes translate as: sponsor_restricted →
relationship_restricted, organizer_only → internal_only; the rest pass
through. All are opaque strings to ICN core.
15. Record-state-dependent custody (v0: eligibility conditions)
§14's declined-prospect row exposed a real v0 limit: the custody meaning of a
source field can depend on the source record's state. A declined record is an
internal closure record, not a commitment; a public-recognition field must stay
unproposed unless the record's state permits publication. The original fixture
handled this by omission — the declined record simply does not propose
public_listing_name — which is safe but invisible to the conformance validator,
and the tempting-but-forbidden shortcut is to invent a renamed field to bypass
source state.
v0 mechanism — an optional condition predicate on a field_custody_map
entry. A field's custody entry may declare the source-state precondition under
which its route is eligible:
relationship.public_listing_name:
custody_target: { kind: artifact_registry, namespace: public-recognition }
required_receipts: [BridgeImportReceipt, ArtifactRegistrationReceipt]
condition:
source_field_path: relationship.record_state # opaque source field
op: equals # closed ICN operator set
value: active # opaque literal
- Generic and opaque.
source_field_pathandvalueare opaque strings/scalars ICN core never interprets — exactly likefield_path,privacy_class, andobject_class. Onlyopis ICN vocabulary, drawn from a closed set:equals,not_equals,in,not_in,present,absent. The predicate's keys are strict (source_field_path/op/valueonly) so a package noun (e.g. asponsor_statuskey) cannot ride in — the Meaning Firewall holds. - Explicit, not silent. The condition records why a field is unproposed for a given record (its state does not satisfy the predicate) rather than leaving it to omission. It is producer-declared intent the validator can shape-check.
- v0 scope — shape only. The validator validates the predicate's shape; it does not evaluate it or route custody by state. A conditioned field must still be exercised by at least one dry-run action where its condition holds (the existing binding-coverage rule is unchanged), and a field path still has exactly one custody kind.
- Deferred (future change). Per-state multi-kind routing — the same field routing to a different custody kind under different record states — would require the binding to hold per-condition custody variants and the dry-run kind-match check to become condition-aware. That is a larger change, recorded here as direction only; this v0 slice does not open it.
Non-claims. Fake-fixture / conformance design only: no runtime bridge, no connector, no live source scan, no real data, no package-specific ICN custody kind or receipt class, and no claim that NYCN operations are ICN-native today.