live/stable
The label
The PULSE-1 format, where it goes, and why it's self-declared but hard to abuse.
24 bytes appended to the end of transaction calldata:
magic is 0x50554C53 and always the last four bytes. Readers check the tail and parse backwards. Full field definitions are in the spec.
| agentId (16) | framework (2) | flags (1) | version (1) | magic (4) |Where it goes
Direct transactions: appended to data. ERC-4337: appended to the inner callData. Batches: once, on the outermost call.
Why calldata
It needs no contract, costs almost nothing, and works with every wallet and dapp on the chain because standard ABI decoding ignores trailing bytes.
Self-declared, and what that means
Anyone can write any label. Pulse handles that with sender binding: a transaction is attributed to a claimed agent only if its sender is on that agent's declared list. Copying someone's ID makes an "unclaimed" row, never a row under their name. Staking $PULSE behind an ID (planned) makes a verified label costly to fake at scale.
Framework codes
Assigned by pull request in config/frameworks.json; never reassigned.