feat: proposal lifecycle + agent-native pivot + officer bootstrap#50
Merged
Merged
Conversation
Turn proposals into first-class readable objects and wire the two
missing agent-native surfaces from specs/99.
contracts
- createProposalWithTension(...) publishes plaintext via a new
ProposalTensionPublished event; hash is derived on-chain
(keccak256) so tensionHash stays the canonical content address
- legacy createProposal(...) retained for the hash-only path
- isFacilitatorElected / isSecretaryElected views expose election
lock state so the UI can disable admin bootstrap setters instead
of learning via revert
- unit tests cover both new views + hash/event parity
indexer
- proposal.tensionText (nullable) persisted on ProposalTensionPublished;
null still resolves via the storage backend indicated by tensionHash
- ABI, schema, and indexing-client types updated end-to-end
hola-modern
- proposal wizard gains a Tension textarea (280 chars) and routes to
createProposalWithTension when non-empty, createProposal + zeroHash
otherwise
- wizard exposes caller's led roles so §5.3 attribution is pickable,
not guessable
- GovernanceView pivots from meeting-centric to proposal-queue-health
({open, expiringSoon<2d, expired}); ritual steps collapse behind a
disclosure
- new AgentIdentityCard (ERC-8004 §4) self-serve link on Members tab
- new FacilitatorsCard admin bootstrap for Facilitator/Secretary per
circle, with lock-state greyed out
- hooks: useAgentIdentity, useCircleOfficerLocks, useSetCircleFacilitator,
useSetCircleSecretary, useSetProposalMaxAge (clamped to [1h, 30d])
- PublicOrgView / PublicProposalView / OpenProposalsPanel render
tensionText when present, hash fallback otherwise
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🤖 Linear
Closes lin-XXX
Description
Omnibus branch landing three months of work: audit remediation, the full proposal/objection lifecycle, the agent-native pivot, and today's readable-tensions + officer/agent-identity bootstrap UI. 25 commits, 171 files, +19,055/-3,627.
1. Proposal + objection lifecycle (
specs/05)MeetingFactorygains full lifecycle:createProposal→raiseObjection/resolveObjection→adopt/discard(feat: governance proposal + objection lifecycle #45 merge)executeGovernancedeleted along with backward-compat scaffoldinghola-modern2. Agent-native pivot (
specs/99-agent-native-divergence.md)proposerRoleId=0means "propose as member"; contract still emits the roleId for indexer distinctionMAX_PROPOSAL_AGEper-org configurable (default 7d, bounds [1h, 30d]); frontend reads from chainOrganizationInstance.linkAgentIdentity(agentRegistry, agentId)3. Audit remediation + gas opts
OrganizationInstance_LastAdmin), gas optimizationsRoleDataRegistrysimplified via OZInitializable+EnumerableSet4. Readable tensions + officer/agent bootstrap (today)
createProposalWithTension(...)publishes plaintext viaProposalTensionPublishedevent;keccak256derived on-chain sotensionHashstays canonical. Legacy hash-only path retained.isFacilitatorElected/isSecretaryElectedviews expose election-lock state — UI greys out locked admin setters instead of learning via revertAgentIdentityCard(self-serve ERC-8004 link, Members tab) +FacilitatorsCard(admin bootstrap)GovernanceViewpivots from meeting-centric to proposal-queue-health ({open, expiringSoon<2d, expired}); ritual steps collapse behind a disclosureuseAgentIdentity,useCircleOfficerLocks,useSet{CircleFacilitator,CircleSecretary,ProposalMaxAge}Other
Checklist before requesting a review
Test plan
pnpm testpasses across all workspacesforge test -vvv— proposal lifecycle, objection lifecycle, officer-election lock flips, tension plaintext hash paritypnpm --filter hola-modern test:e2e— proposal wizard (hash + plaintext paths), objection UI, agent identity link, admin facilitator/secretary setGovernanceViewexpiry stats match indexer truth against a fresh org🤖 Generated with Claude Code