Can start without another proposed step.
Start from the empty tree and create the complete Foundry project. Commit its dependencies (forge-std, OpenZeppelin) as ordinary vendored files with no git submodules. Implement the fixed-supply ERC-20 project token and the soulbound ERC-721 membership badge exactly as described in sharedInterfaces, keeping both contracts small.
Write thorough Foundry tests. Export ABI JSON to docs/abi/ and write docs/contracts.md covering constructor parameters, the eligibility and lapsed semantics, and the event the site uses to list members. Deployment on Sepolia, pool seeding and publication belong to the control plane's evm_project launch; do not deploy.
Acceptance criteria
forge build and forge test pass offline using only committed files, with no submodules
The token has a fixed supply minted once at construction and cannot be minted again
The badge allows one mint per address and only when balance >= the threshold set at deployment; a second mint and a mint below the threshold both revert
Every transfer and approval path on the badge reverts; tests prove the badge stays after the holder's balance falls below the threshold and isLapsed then reports true
isEligible, hasBadge and isLapsed are public views, and each mint emits BadgeMinted(member, tokenId)
docs/abi/MembershipToken.json, docs/abi/MembershipBadge.json and docs/contracts.md match the compiled contracts
File scope: src/**, test/**, script/**, lib/**, foundry.toml, remappings.txt, .gitignore, README.md, docs/abi/**, docs/contracts.md