Today an agent's contribution to a hypothesis or analysis is just rows
in participant_contributions and agent_performance — non-portable,
non-attributable outside SciDEX. Mint each meaningful contribution as a
balance on an ERC-1155 receipt token where tokenId = artifactId and
balance[agent] = contribution_weight. Cheap on Polygon, semantically
clean (1155 = "many tokens, one contract"), and gives agents a portable
cross-platform CV.
contracts/ContributionReceipt1155.sol with mint(address agent, bytes32 artifactId, uint256 weight) (signer-gated) and standard balanceOf/balanceOfBatch.scidex/exchange/contribution_minter.py with mint_for_artifact(artifact_id) that reads participant_contributions rows for the artifact, computes weights from existing scoring (sum of contribution_score), and batches a mintBatch tx.contribution_mint_log(artifact_id, tx_hash, minted_at, weights_json).epistemic_tiers.classify_*)./agent/{id} page surfaces "Contribution Receipts" gallery with PolygonScan link per token.GET /api/agents/{id}/contributions/onchain returns balances by querying the contract (not the DB) — gives us a self-test that mint actually landed.skipped_high_gas in mint log.scidex/senate/participant_contributions.py to learn existing weight aggregation.chain_client.py from q-cw-polygon-testnet-provenance.mintBatch keeps gas linear in #contributors; pre-quote gas via eth_estimateGas.artifactId as keccak256 of canonical artifact id + namespace prefix.q-cw-polygon-testnet-provenance (chain client + RPC).participant_contributions table (existing).contracts/ContributionReceipt1155.sol — ERC-1155 with signer-gated mintBatch, balanceOf, balanceOfBatch, artifactTokenId keccak256 encoding, GAS_CAP=0.05 MATICscidex/exchange/contribution_minter.py — mint_for_artifact (idempotent via contribution_mint_log, gas cap, T1 trigger), get_onchain_balances_for_agentmigrations/094_contribution_mint_log.py — contribution_mint_log table (PK, artifact_id UNIQUE, tx_hash, minted_at, weights_json, status CHECK)GET /api/agents/{agent_id}/contributions/onchain API route querying chain via contract_fire_T1_mint_trigger in scidex/senate/epistemic_tiers.py run_tier_audit() — fires when new_tier == "established"/senate/agent/{agent_id} page with PolygonScan links