{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"370c264f-c400-4608-a8c3-c30098ab4c70","kind":"skill:scaffold-project","nodes":[{"acceptedSubmissionHash":"6c027ac21f099e7521d07bcdde8be62cf19f9f3b480d6e4182231fb4977c8894","dependsOn":[],"execution":{"network":false,"profile":"none","requires":[],"skillHash":"4a09b43734a4e065a2747d46a5f94af939a9b38daffc4cea4670e09a41529c8c","skillId":"scaffold-project","tools":[]},"key":"scaffold_project","kind":"code","role":"implement","skillHash":"4a09b43734a4e065a2747d46a5f94af939a9b38daffc4cea4670e09a41529c8c","skillId":"scaffold-project","state":"accepted"}],"objective":"Build a simple decentralized social network where agents linked to IdentityMD NFTs can communicate with each other and humans can observe.\n\nAgents should have profiles, create posts, reply to each other, and share their work, ideas, and discoveries. Anyone should be able to browse without an account.\n\nUse independent nodes, verifiable agent identities, and portable post histories. Keep it easy to run and pleasant to browse. Choose the technical approach.\n\nDeliver a working prototype, source code, setup instructions, and a demonstration of agents communicating across two nodes. Clearly explain anything simulated or unfinished.","parentJobId":null,"planHash":"bd3f6c9850f89d9c43fe25e4e9213799d4ac1a7a7d87c761d802bd300ffab70c","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"370c264f-c400-4608-a8c3-c30098ab4c70","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-407-build-simple-decentralized-social"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51336","feedbackHash":"ad7caac1cb26712eaa3af2ab8c34e768d9d8799cbf5809379f44468229cd7bd6","nodeKey":"scaffold_project","submissionHash":"6c027ac21f099e7521d07bcdde8be62cf19f9f3b480d6e4182231fb4977c8894","tag1":"verification:structural","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"adf13fce4c8cfe5768de262e9ac92adc2bc03ad2b2fbb626a37522460d6d3d36","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"1d1e122bd8c70b24229ea2d8febe6311d1c59b1f32f31661bf290f444e37195c","device":"00d95fd75f8b224c","findings":[],"hash":"6c027ac21f099e7521d07bcdde8be62cf19f9f3b480d6e4182231fb4977c8894","nodeId":"39d1155f-f8a5-4cb7-a572-b306b96b6d7c","outcome":"completed","summary":"I've built the prototype, **IdentityMD Agent Commons**, and committed it to `main` (`9b86a4c`). It uses only Node.js 18+ and its standard library, with no dependencies, so there is nothing to vendor and it runs offline from a fresh clone. All 8 tests pass and the two-node demo runs end to end. I couldn't open it in a real browser here; I checked the pages by fetching their HTML.\n\n**How it works**\n- **Independent nodes** (`bin/imd-node.js`): each node is its own process with its own storage. A node sends every new post to its peers straight away, and every few seconds it also asks them for anything it's missing. That second check lets a node that was offline catch up.\n- **Verifiable identities**: an agent's id is its Ed25519 public key, and every entry is signed. Nodes reject an entry if its id doesn't match its content, the signature is wrong, entries are missing before it, or it conflicts with an entry already accepted at that position.\n- **Portable histories**: each agent's entries form a hash-linked log that the agent keeps locally. It can publish through any node, export the log, and move it to a new node, which checks it independently.\n- **Browsing without an account**: every node serves a read-only site with a timeline filtered by post type, an agent directory, profiles, threads and a node status page. It needs no JavaScript and follows the system light/dark setting.\n- **Agents** use the CLI (`bin/imd-agent.js`) to create an identity, set a profile, post, reply, and push, export, import or fetch histories.\n\n**Demo across two nodes** (`npm run demo`, or add `-- --keep` to leave the nodes running for browsing at 127.0.0.1:7101 and :7102):\n- Ada posts on node A, while Turing and Hopper reply on node B. Both nodes end up returning identical threads.\n- Mallory copies Ada's name and claims Ada's NFT, and is flagged \"NFT claim rejected\".\n- An edited copy of a post is rejected (`id does not match content`), and so is a post signed with someone else's key (`bad signature`).\n- Ada's history moves to a third node that has no peers, and Ada keeps posting there.\n\n**What's simulated or unfinished** (the README explains each):\n- **The NFT link is simulated.** Nodes read which agent key owns each token from a local JSON file (`--registry`) instead of the IdentityMD contract.\n- Nodes only sync with peers you list; they don't discover each other.\n- There is no spam control, moderation or rate limiting.\n- There is no key rotation or recovery.\n- Post timestamps are whatever the author claims.\n- A node spots an agent trying to rewrite its history and refuses it, but doesn't warn the rest of the network.\n- Storage is one file per node, which suits thousands of entries, not millions.\n\nThe code is in `bin/`, `src/`, `scripts/demo.js` and `test/`, and the README covers setup and usage. Git had no user identity configured on this machine, so I set your email as author and committer for this one commit only, without changing git config.","treeHash":"b79b4ce70e0e437e8e9783ed6598a65669092d2d","usage":{"cachedInputTokens":1274068,"inputTokens":46,"model":"claude-opus-5-5","outputTokens":54175,"runtime":"claude","turns":33,"wallClockMs":514634}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"6c027ac21f099e7521d07bcdde8be62cf19f9f3b480d6e4182231fb4977c8894","verifiedTreeHash":"b79b4ce70e0e437e8e9783ed6598a65669092d2d","verifierVersion":"0.1.0+ff982c0f"}]}