I re-read the technical assessment, the implementation plan, and the latest ACP/address-length update. The long-address issue is not an isolated edge case. It exposes the same architectural boundary in several places.
The visible problems are:
-
Bridge semantics are validated after economically meaningful CKB state has already changed.
The published design explicitly allows Rosen metadata to be appended to a bridge-owned ACP Cell while xUDT/ACP enforce only the CKB-side state rules. Watchers and Guards validate the bridge meaning later, off-chain. The recent address-length finding proves that an on-chain-valid transition can still be unsafe at the Rosen layer. -
The ACP Cell combines several different coordinates in one mutable object.
It is simultaneously a deposit sink, token container, metadata carrier, CKB state-rent container and concurrency resource. That coupling is why a metadata-field problem can become a CKB-capacity/resource problem without violating the underlying token rules. -
“Largest expected metadata payload” is an assumption, not an enforced invariant.
The implementation plan sizes bridge ACP Cells around an expected maximum payload (for example, 144 base + 75 bytes for Cardano). The latestfromAddressfinding demonstrates that the actual input surface can exceed those sizing assumptions. A security boundary cannot depend on an expected maximum that the protocol does not itself enforce. -
The documented message schema and the currently discussed message surface are already drifting.
The published wire format describestoChain, fees and variabletoAddress, while the latest developer note explicitly discusses attachedfromAddressas a resource-relevant field. WhetherfromAddressis encoded directly or reconstructed elsewhere, there must be one canonical, versioned schema and one source of truth for every component that interprets a bridge request. -
toChainis an unversioned global index.
The plan states that a one-byte value is baked into every request and that UI, Watchers and Guards “must agree” on the sameSUPPORTED_CHAINSassignment. Agreement by deployment coordination is not the same as an invariant. The request itself does not describe a schema/configuration epoch that proves what that byte meant when the source event was created. -
The bridge operation is distributed across several identity planes without one explicit immutable binding.
A complete operation should bind at least: source OutPoint/transaction, canonical source block, confirmation state, request schema/configuration version, parsed intent, and the destination action that Guards approve/sign. The current design describes those pieces in separate scanner, extractor, configuration and TSS layers, but the published plan does not describe one operation identity that binds them end-to-end. -
ACP concurrency is also a lifecycle problem, not only a pool-size problem.
The UI may select ACP Cells that are already represented by pending transactions, and when available Cells are exhausted the design can chain from an unconfirmed output.max_ancestors_countbounds mempool depth; it does not define recovery semantics. The important invariant is what happens to every dependent bridge request when an ancestor is rejected, evicted, replaced, or invalidated. -
Deposit and custody paths share the same TSS authority root.
This may be an intentional Rosen trust-model choice, but it means the two CKB paths are not independent compromise domains. The same shared key ultimately authorizes ACP consolidation and custody spending. “Security parity” at the threshold-signature level should not be confused with isolation at the system level. -
The 50-confirmation rule is a model assumption, not the complete cross-chain finality invariant.
The stated value is derived from a particular adversarial-hash/orphan-rate model and then doubled. The scanner can roll back local source-chain state, but the real bridge invariant is stronger: no irreversible destination action should be committed under a source interpretation that another valid service/configuration epoch could later reject. -
The release gate itself has drifted.
The approved proposal states that a formal external audit occurs before final testing and public mainnet release, and separately says internal review is not a replacement for a formal audit. The current implementation plan labels mainnet release as “external audit optional,” while the discussion also describes audit as “not really mandatory.” Those are materially different acceptance conditions.
The common root is therefore not “an address is too long.”
It is a validation/projection boundary:
CKB-valid state transition
→ bridge metadata projection
→ Watcher/Guard interpretation
→ TSS authorization
→ destination-chain state
The first plane can accept a state that the later planes interpret differently or reject for reasons that were not enforced when the shared value-bearing Cell was mutated.
That is exactly what the long-address case revealed.
You can cap address length, adjust fees, resize ACP Cells, add parser checks, increase the pool and patch individual manifestations. Those fixes may be necessary, but they do not remove the architectural cause. Each new field, destination chain, parser, configuration update and ACP lifecycle rule creates another cross-layer invariant that must remain synchronized.
The stronger design requirement is that bridge intent, semantic bounds, configuration/schema epoch and source-event identity must be bound before that intent is allowed to become an economically meaningful bridge event — and the same immutable identity must survive through observation, approval, signing and destination execution.
Otherwise the system can keep improving locally while increasing the number of cross-layer conditions that must never diverge.
This is still a surface architectural review. I have deliberately not gone into implementation-level exploitation or a full code audit.