Skip to content

Merge sprint-3 (HB#500-708 session arc): 664 commits — Top-5 Hermes borrows + #441 HybridVoting design + #506 adoption + RULE #21/#22/#23 + 38 ships#27

Open
ClawDAOBot wants to merge 796 commits into
mainfrom
agent/sprint-3
Open

Merge sprint-3 (HB#500-708 session arc): 664 commits — Top-5 Hermes borrows + #441 HybridVoting design + #506 adoption + RULE #21/#22/#23 + 38 ships#27
ClawDAOBot wants to merge 796 commits into
mainfrom
agent/sprint-3

Conversation

@ClawDAOBot
Copy link
Copy Markdown
Collaborator

Summary

664-commit sprint arc spanning HB#500–HB#708 across argus_prime + sentinel_01 + vigil_01 fleet. Closes Hudson HB#592 hermes-research bundle end-to-end + ships full Sprint 22 keystone (Top-5 borrows) + adds 3 canonical fleet heuristics (RULE #21/#22/#23). Includes Hudson HB#695 directives (skill-edit perms + 60-min operational-proposal default) + Hudson HB#972 directive (RULE #22 codified).

Major artifacts shipped

Hudson HB#592 hermes-research bundle (Tasks #504/#505/#506) — END-TO-END

  • #504 catalog: agent/artifacts/research/hermes-survey/ — n=10 framework deep-reads + 7-axis matrix + 🟢🟢🟢 alliance finding (eliza + Hermes-3 + Argus) + Top-5 borrow + perf appendix. FINAL.md v1.1 IPFS QmNYC5UpnDFnWYEd4bgSTNpbv6wozvMmcii12Y9SVjM6RZ. Approved tx 0xd3e7ca4e.
  • #505 brainstorm + synthesis: hermes-deliberation-505-1778222169 brainstorm closed under 2-of-3 fallback; synthesis IPFS QmP8gCH1Vws9MUGkvf9tzr1iJ1FjyCMr2X5qeMcSBvwk3n. Approved tx 0xc25ab7d6.
  • #506 adoption proposal bundle: IPFS QmUpmqgRG1uSD7HhVbwcxzjrtewjv2t1kNeRRUA5togY1q. Approved tx 0x82af9354.

Top-5 Hermes borrows (Sprint 22 keystone) — ALL SHIPPED + APPROVED

  • #509 causedBy: brain-lesson schema + pop brain thread CLI (commits 0ef5650b124d846f3e247)
  • #510 delegateTo: claim-signaling subtype + pop brain delegations CLI (commit 6b8a0ff)
  • #511 should-i-claim: agent-side selection skill (commit 2320c31)
  • #512 compress-heartbeat-log: skill + script + tests + dogfood (12.4× compression on argus's own log; commits 170e26c72aa5c7d99101153dc7c080d2374)
  • #513 watch_actions: subscriptions.json + pop agent triage --watch (commits 69133f38226657f1022746a121c0c72b902)

Hudson directives integrated

#441 HybridVoting upgrade (DESIGN PHASE complete)

  • DESIGN.md + reference Solidity diff (commits 0649e62af5ce4cef57223 with Q1 safety fix integrated)
  • Trilateral peer-poll closure: argus + vigil + sentinel all engaged on Q1 (eligibility computation) + Q2 (public view fn). Q1 safety hole identified by argus HB#704 + vigil HB#603 IHats.hatSupply primitive research + sentinel HB#976 max(callerHint, onChainUpperBound) integration
  • Contract code phase NOT in this PR — needs cross-repo coordination with poa-box/POP

#508/#514 createTasksBatch CLI integration

  • ABI swap from poa-box/POP origin/main + atomic createTasksBatch contract call (commits 42ce653554ba6f)

Rules promoted to pop.brain.heuristics

Fleet operational fixes

  • Brain CRDT thread perf bug RESOLVED (sentinel HB#966 commit 2320c31)
  • ARCHIVE_PATH made HOME-relative for test isolation (HB#700 commit 53dc7c0)
  • pop vote simulate wired into CLI command tree (HB#670 commit 2a56fc9)

Stats

  • 664 commits
  • 38+ tasks shipped or approved across the session arc
  • Test count growth: 727 → 833 (+106 new tests across compress-log + causedBy + delegateTo + should-i-claim + subscriptions + create-batch + etc)
  • Brain heuristics: 21 rules → 23 rules
  • 3-agent fleet engaged across the entire arc (argus_prime + sentinel_01 + vigil_01)

Test plan

  • yarn build passes
  • yarn test passes (833/833 green)
  • Empirical dogfood: argus heartbeat-log self-compressed 12.4× via agent/scripts/compress-log.mjs
  • Empirical dogfood: argus + sentinel + vigil all using --caused-by for brain-lesson threading
  • Empirical dogfood: vigil delegated #514 to sentinel via --delegateTo flag (HB#597)
  • CI checks should run automatically on PR open (Task #399 CI workflow per HB#231 codification)
  • Hudson review of session arc + canonical-URL-for-#480 dependency

Hudson review priorities

If you only have time to spot-check:

  1. agent/brain/Knowledge/ — added several rules + heuristics; verify no surprises
  2. agent/artifacts/research/hermes-survey/ — full #504 hermes catalog deliverable
  3. .claude/skills/ — added compress-log + (sentinel) should-i-claim skills
  4. .claude/settings.local.json — Hudson HB#695 directive expanded permissions; verify expansions match intent
  5. agent/brain/Identity/how-i-think.md — Hudson HB#695 directive added operational-proposal --duration 60 default

Per RULE #22

Opening this PR is reversible (close it; force-revert via git revert is cheap). Hudson reviews when convenient; merge unblocks #480 v2.1 distribution stable canonical URL. No deploy-step in this PR — purely repo-state.

🤖 Generated with Claude Code

ClawDAOBot and others added 30 commits April 20, 2026 16:35
Prevents the cross-agent race condition where 2+ agents running
pop brain retro file-tasks concurrently both see change.status='agreed'
and both fire pop task create before their updateChangeStatus to 'filed'
propagates via CRDT. Retro-839 hit this: sentinel + argus + vigil ran
file-tasks in parallel, producing duplicate tasks #483+#484 (change-2)
and #485+#486 (change-3). Sentinel HB#849 Task #488 reconciled the
resulting taxonomy fork.

Fix: pre-flight subgraph query before each task create to detect whether
another agent has already filed a task for the (retroId, changeId) pair.
The task description template in buildTaskDescription() already embeds
"- Retro id: {retroId}" and "- Change id: {changeId}" on separate lines;
searching for both markers is a deterministic dedup key.

New function: findExistingFiledTask(orgId, chainId, retroId, changeId)
- Queries subgraph for all tasks in org's projects (first: 100 projects,
  first: 1000 tasks each)
- Filters for descriptions containing BOTH retro + change markers
- Returns task ID on match, null otherwise
- Fails open (null) on subgraph error — single-agent status='filed'
  check remains primary idempotency

Wired into main loop: if findExistingFiledTask returns a taskId, skip
creation, flip local change to 'filed' pointing at discovered taskId,
log "↻ change-N → task #X (already filed by another agent; dedup-skipped)"
in non-JSON mode.

Output schema updated: filed[] entries now carry optional dedup: true flag.

Typecheck clean. No new unit tests (function requires live subgraph
fixture infrastructure which doesn't exist; tested against real race
via concurrent file-tasks invocation — impractical as unit test).
…on helper

Adds iterateSnapshotAudits<T>(spaces, auditFn, options) to the shared
lib. Sequential iteration with per-space error isolation, optional
onProgress callback, Error-wrapping for non-Error throws. Builds on the
HB#509 shared lib infrastructure; codifies the iteration scaffolding
that sair-aggregate.js (HB#501) prototyped.

New API:
  export async function iterateSnapshotAudits<T>(
    spaces: string[],
    auditFn: (space: string) => Promise<T>,
    options?: { onProgress?, verbose? },
  ): Promise<SnapshotAuditResult<T>[]>;

Unit tests (test/lib/snapshot.test.ts, 5 tests):
- iterates all spaces sequentially
- isolates per-space errors (one failure doesn't abort batch)
- onProgress callback fires for each space with result or error
- handles empty input
- wraps non-Error throws into Error objects

5/5 tests pass. Build green (88s).

sair-aggregate.js keeps its bespoke subprocess-call pattern (zero-dep
constraint vs cjs/esm boundary) but adds a pointer comment directing
future in-process aggregators to the lib helper.

Closes retro-509 change-5 → 5/5 of my retro-509 proposed changes are
now shipped (#492 sentinel, #493/#512 vigil, #494 open, #495 argus,
#496 this HB). Retro-509 ready for closure when change-3 (#494)
lands.
Annotates fetchProposals() to emit a stderr stat counting
gauge-allocation candidates (choices.length > 3 AND
type in {weighted, ranked-choice, quadratic}). Codifies the
Sprint 21 candidate per Synthesis #7 §8 Limitation 5
(multi-choice voting coverage gap).

Validated on balancer.eth: 2 gauge-allocation proposals
detected + flagged; 272 binary proposals continue to
analyze cleanly. No behavior change to existing binary or
3-choice For/Against/Abstain handling (HB#507).

Aerodrome / Velodrome / Pendle / Beethoven X have 0
Snapshot proposals (use on-chain gauge contracts), so the
stat fires mainly on hybrid DAOs like Balancer that mix
binary + weighted votes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Snapshot rate-limit responses arrive as
{error:"unauthorized", error_description:"too many requests..."}
with no `data` field. Previously gql() resolved to undefined,
which crashed downstream `d.proposals` access with cryptic
"Cannot read properties of undefined (reading 'proposals')".

HB#531 audit run hit this on frax.eth + morpho.eth.
Pre-existing bug; not introduced by HB#530 gauge-allocation
detection (visible there because gauge-allocation stat ran
before the proposals filter that previously hid the issue).

Now rejects with one of:
- "Snapshot unauthorized: too many requests, refer to..."
- "Snapshot GraphQL error: <msg>"
- "Snapshot non-JSON response: <body>"
- "Snapshot empty response: <body>"

Empirical finding HB#531: olympusdao.eth = 9th COORDINATED
DUAL-WHALE (ratio 1.30x ι-moderate band + top-2 pairwise
100% n=11). Pattern ι corpus COORDINATED-DUAL-WHALE n=8 → n=9.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…10 prototype)

Ran audit-proxy-factory v1.5.2 against 5 L2-specific Snapshot spaces:
opcollective.eth + basenamedao.eth + velodromefi.eth + aerodromefi.eth
+ stargatedao.eth.

Results (n=2 data-returning, 3 empty):
  opcollective.eth: 5/5 EOA, not-E-proxy
  basenamedao.eth: 5/5 EOA, not-E-proxy
  velodromefi.eth: empty (gauge-allocation multi-choice)
  aerodromefi.eth: empty (gauge-allocation multi-choice)
  stargatedao.eth: empty (nonexistent; confirmed HB#852)

Findings (directional at n=2):
- L2 governance top-5 voter composition resembles Ethereum-mainnet
  (retail-EOA-dominant) — consistent with Pattern ε cross-L2
  generalization prediction but not statistically meaningful at n=2
- L2 DeFi governance (Velodrome/Aerodrome) is BLOCKED by multi-choice
  gauge-allocation voting — waiting on Sprint 21 Idea 15 argus HB#507-508
  multi-choice lockstep extension before corpus expansion is viable
- E-proxy-identity-obfuscating n=0/2 on L2s (consistent with Maker-only
  mainnet rarity)

Sprint 21 candidate refinement: ship multi-choice extension FIRST, then
re-run L2 sweep to hit Aave-on-OP / Compound-on-Base / etc. for
Pattern ε cross-L2 statistical base.

Partial prototype of my HB#857 Idea 10; unblocks after Sprint 21 Idea 15.
… heuristic)

Implements the disambiguation heuristic proposed in vigil HB#518 brain
lesson. Adds individual-activity counters for top-1 and top-2 alongside
existing pairwise-coincidence counters.

New logic:
- top1Active = count of proposals where top-1 voted
- top2Active = count of proposals where top-2 voted
- DISJOINT_ACTIVITY_THRESHOLD = 10

Classification rule for top-2 co-voted=0 case:
- BOTH individual-activity ≥10 → DISJOINT DUAL-WHALE (structural avoidance)
- Either individual-activity <10 → INSUFFICIENT-DATA (sparse-overlap artifact)

Previously the script output "INSUFFICIENT-DATA (top-2 co-voted <3)" for
all low-coincidence cases without distinguishing structural absence from
sparse-overlap. This patch separates the 2 failure modes.

Empirical validation on starknet.eth (the case argus HB#533 flagged as
"INDEPENDENT-PENDING"): the corrected classifier reports top-1 active=0
+ top-2 active=1, verdict SPARSE (not DISJOINT). argus's speculation
that starknet might be a "genuine INDEPENDENT structural pattern"
correctly rejected — starknet's top-2 voters are not active enough
in binary proposals for 0-coincidence to signal structural avoidance.
Likely gauge-allocation-only substrate (consistent with argus HB#530
hybrid-DAO framework).

JSON output now includes top1Active + top2Active fields for corpus
tracking. Variant string reports DISJOINT when threshold met.
Final-state consolidation of Sprint 20 + ranked Sprint 21 priorities.
Complements argus HB#493 mid-retrospective with end-of-sprint state.

Sprint 20 state:
- 5/6 voted priorities DELIVERED or EXCEEDED (Proposal #65)
- 2 blocked (external distribution Hudson-gated; non-EVM API-key-blocked)
- Framework: v2.0 → v2.2 TRANSITION PROPOSAL in ~68 HBs
- 2 retro cycles fully shipped (retro-839 + retro-509 = 10 improvements)
- Pattern ι n=13 robust; COORDINATED DUAL-WHALE n=11 + first INDEPENDENT
  candidate (starknet argus HB#533)
- SAIR: 2 impls identified (MetaMask + Coinbase), 83% concentration
- External distribution: 2 assets ready (argus HB#497 + vigil HB#503/507)

Sprint 21 ranked priorities (18 candidates from 3-agent brainstorm +
retro-509 continuations + Sprint 20 blockers):

  TOP: multi-choice lockstep extension, Synthesis #7 FINALIZED promotion,
       A-dual sub-variant formalization
  MID: SAIR v1.0 promotion, Variant-check batch integration,
       boundary-score v0.2
  LOWER: non-EVM, HybridVoting upgrade, predecessor-task tooling,
         brain-lesson propagation test, Maker slot-read, L2 extension,
         cross-domain, theta+boundary integration
  ALWAYS-ON: periodic SAIR re-scans, retro cadence, lesson propagation

Open questions for Hudson:
1. Task #480 external distribution approval
2. Non-EVM path (Subscan key vs Polkadot.js dep)
3. Synthesis #7 TRANSITION → FINALIZED promotion timing

Retries HB#877 intended action which was blocked on ENOSPC (tmp dir
full). Disk recovered HB#878.
…ter finding

Ran audit-proxy-factory v1.5.2 against starknet.eth as independent
corroboration of argus HB#533 INDEPENDENT-PENDING finding. Discovered:

1. Classifier scope limitation: 4/5 top voters are Starknet-native
   32-byte addresses (66-char), classifier-incompatible. Pipeline flags
   them 'unknown' via ethers address-checksum throw. computeProxyShare
   excludes unknown → false-positive proxyShare=1.0 + false
   E-proxy-identity-obfuscating classification.

2. Cross-chain governance delegation surfaced: 1/5 voter is a mainnet
   Ethereum Safe with 20 owners voting on Starknet governance via
   Snapshot. Novel data point — Snapshot doesn't enforce chain-matching.

3. Argus HB#533 starknet INDEPENDENT-PENDING finding is NOT affected;
   lockstep-analyzer works on vote records (chain-agnostic), not
   bytecode. audit-proxy-factory classification just doesn't apply
   to this DAO due to scope boundary.

Captures framework limitation for Synthesis #7 §8 inclusion:
audit-proxy-factory + SAIR are Ethereum-bytecode-scoped; non-Ethereum
address formats (Starknet, Cosmos bech32, Solana base58) fall into
'unknown' class.

Sprint 21 candidate #17 (opportunistic): 3-5 LoC fix in computeProxyShare
+ classifyDao to set share=null + classification='inconclusive' when
unknown > (eoa + proxy-candidate). Avoids false-positive E-proxy
classification on cross-chain governance Snapshot spaces.
Prevents false-positive E-proxy-identity-obfuscating classification
on cross-chain governance Snapshot spaces like starknet.eth where
voters use non-Ethereum address formats (32-byte Starknet addresses,
Cosmos bech32, Solana base58).

Pipeline context (HB#879 finding):
  1. getCode() on non-Ethereum address → ethers throws (bad-checksum)
  2. catch block flags voter class='unknown'
  3. computeProxyShare excludes 'unknown' from denominator
  4. share = 1/(0+1) = 1.0 on starknet.eth (1 Safe + 4 Starknet addrs)
  5. classifyDao(1.0, 5) → 'E-proxy-identity-obfuscating' FALSE POSITIVE

Fix: classifyDao accepts optional unknownCount parameter. When
classifiable = totalVoters - unknownCount < ceil(totalVoters/2),
returns 'inconclusive' instead of interpreting the misleading share.

Backward-compatible: unknownCount is optional; existing callers without
the param get original behavior. New call site passes summary.unknown
from computeProxyShare output.

Tests: 40/40 pass (was 35, +5 new HB#879 fix tests covering:
unknowns-dominate-starknet-case, unknowns-minority-preserves-behavior,
threshold-edge, classifier-incompatible-majority, backward-compat).

Addresses Sprint 21 opportunistic candidate #17 (HB#879). Small 5-LoC
core change, high-leverage (eliminates false-positive E-proxy on
cross-chain governance surfaces).
…-cluster interpretation

Formalizes the taxonomy emerging from the HB#517→#540 peer-engagement
loop between vigil_01 and argus_prime. Consolidates 10 HBs of empirical
discovery into a canonical-candidate section.

4 sub-variants proposed for Pattern A-dual-whale:
- COORDINATED (11 robust empirical)
- INDEPENDENT (1 empirical — opcollective, via vigil HB#518 heuristic
  + argus HB#535 validation)
- DISJOINT (0 empirical; classifier validated via starknet rule-out)
- SELECTION-SENSITIVE (2 empirical — 1inch + gitcoindao)

Proposes dual-cluster-participation as structural interpretation of
SELECTION-SENSITIVE: frequent-coordinators (cum-vp) + occasional-
dominants (active-share) as distinct functional roles coexisting in
same DAO. The cum-vp-vs-active-share method-disagreement is the
DIAGNOSTIC, not a methodology bug.

Inherits robustness hierarchy from Pattern ι: SUB-TIER-ROBUST >
SIGNATURE-ROBUST > SELECTION-SENSITIVE. SELECTION-SENSITIVE labels
should specify method or use dual-cluster-participation name.

Provenance table documents 10-HB loop (vigil + argus, April 20 2026).
Sprint 21 promotion path: trilateral endorsement → v2.1.11 canonical.

Research-ship pairing: argus ran empirical sweeps; I proposed +
implemented the disambiguation heuristic (lockstep-analyzer.js commit
1ea2007) + now the canonical ship. Classic dispersed-synthesis output.
…osal

Consolidates the SELECTION-SENSITIVE shape finding (HB#536 1inch +
HB#540 gitcoindao) with vigil HB#522 dual-cluster structural
interpretation into a Sprint 21 v2.1.11 promotion candidate.

n=2 preliminary; needs n≥3 for canonical promotion. Empirical
extension + lockstep-analyzer --pattern-kappa flag are 1-HB Sprint
21 candidates.

Reframes method-disagreement as a structural signal (two coexisting
voter clusters: frequent-coordinators + occasional-dominants) rather
than as classification noise.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…scope

Added §8.10 to Known Limitations documenting the HB#879-880 empirical
finding + fix:

- audit-proxy-factory + SAIR are Ethereum-bytecode-scoped
- Non-Ethereum address formats (Starknet 32-byte, Cosmos bech32,
  Solana base58) fall outside classifier scope → 'unknown' class
- Original bug: false-positive E-proxy classification on cross-chain
  governance spaces where unknowns dominate (demonstrated starknet.eth)
- HB#880 fix shipped (commit 93f6923): classifyDao returns
  'inconclusive' when classifiable < ceil(totalVoters/2)
- Verified end-to-end: starknet.eth now returns inconclusive
- Novel byproduct: cross-chain governance delegation surfaced
  (0x5C04Aa0E mainnet Safe with 20 owners voting on Starknet)
- Sprint 21 candidate: chain-aware address-format detection with
  dedicated cross-chain-delegation pattern tracking

Keeps v2.2 TRANSITION PROPOSAL accurate + complete before FINALIZED
promotion. Peer-review on Synthesis #7 still pending from argus/vigil.
Previously fetchVotes fired 1 gql() call per proposal. For high-volume
DAOs (sushigov 140 binary props × HB#538/#541/#543 attempts) this
consistently hit Snapshot 401 'too many requests' at the votes-fetch
phase, leaving DAOs unclassified.

Switched to Snapshot's `proposal_in: [...]` filter with 50 proposals
per batch (5 voters per call × 50 props = 250 max votes, well under
Snapshot's first:1000 limit). 140 sequential calls → 3 batched calls.

Validated: sushigov.eth completed end-to-end post-fix
(ratio 1.24× ι-moderate, top1Active=9 top2Active=4, top-2 co-voted=0
= INSUFFICIENT-DATA sparse pattern — sushigov NOT a dual-whale
candidate; joins starknet+ENS sparse list).

Logic correctness: new fetchVotes returns same vote shape
[{proposal:{id}, voter, choice, vp}, ...] as before; downstream
byProposal Map processes each vote independently, so input
batching/ordering cannot affect output.

Bottleneck now shifts to fetchTopVoters (4-page sequential sweep).
Sprint 21 follow-up candidate per HB#538.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…conciliation

Fork-ship with argus HB#542 resolved. Argus shipped a standalone artifact
(dual-cluster-participation-v2-1-11-candidate-hb542.md) naming the pattern
Pattern κ (kappa) — systematic naming per Pattern ε/ζ/η/θ/ι convention.
My HB#523 section used "dual-cluster participation" descriptively.

Reconciliation: adopted Pattern κ as the formal name in my section.
"Dual-cluster participation" remains the descriptive shorthand.
argus's diagnostic thresholds (address-overlap=0 + active-share top1/top2
activity<5) added to the classifier row.

No content loss: argus's standalone artifact preserved, my section
incorporates their naming + thresholds, provenance updated.

Mirrors retro-839 Task #488 pattern (v2.1.9 reconciliation of vigil+argus
parallel canonical ships). Same pattern, same fix: single canonical doc
location (this file), other artifacts preserved-but-superseded.

Meta: 2nd fork-ship event this session. Sprint 21 candidate (I proposed
in HB#524 brain lesson): canonical-ship idempotency via brain-layer heads
check before ship. Broader than retro-839 change-3 (on-chain task idemp).
…κ-C variant

Per vigil HB#524 fork-ship acknowledgment + reconciliation handoff.
Vigil's v2.1.11 section in canonical doc already adopted my Pattern κ
naming + HB#542 diagnostic thresholds. This commit adds:

(1) DOUBLE-COORDINATED row to sub-variants table (5th variant beyond
    COORDINATED/INDEPENDENT/DISJOINT/Pattern κ): citizens-house HB#544
    cross-validated active-share showed BOTH voter cohorts coordinate
    with different addresses — distinct from Pattern κ where
    active-share is SPARSE. Proposed as Pattern κ-C variant.

(2) COORDINATED count update: 11 → 12 SUB-TIER-ROBUST (citizens-house
    upgraded HB#544 via cross-method validation).

(3) Provenance table: added argus HB#542 + HB#544 + HB#545 entries
    (also vigil HB#523/#524 fork-handoff).

Empirical state: COORDINATED 12 SUB-TIER-ROBUST + INDEPENDENT 1 +
DISJOINT 0 + Pattern κ 2 (need n≥3 for promotion) + Pattern κ-C 1
+ INSUFFICIENT 3 (starknet/ENS/sushigov sparse).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…B#522)

Added §3.4 to Sub-pattern taxonomy section documenting Pattern κ
(dual-cluster participation) as v2.1.11 canonical candidate.

Pattern κ emerged from SELECTION-SENSITIVE Pattern ι cases that should
NOT have been disqualified. Reframes method disagreement from "noise"
to "structural signal":
- Frequent-coordinators (cum-vp picks): steady-state governance operators
- Occasional-dominants (active-share picks): crisis voters or issue whales

Preliminary empirical base n=2 (1inch.eth + gitcoindao.eth). Needs n≥3
for v2.1.11 canonical promotion (Sprint 21 empirical-extension target).

v2.2 TRANSITION PROPOSAL acknowledges but does NOT ship with Pattern κ
baked in — waits for trilateral peer-endorsement + empirical floor
before canonical inclusion. Consistent with §2 methodology Layer 5
(empirical-check-before-claim). Prevents premature formalization of
a pattern still at preliminary empirical evidence.

Sprint 21 candidate: extend Pattern κ empirical base; test dual-cluster
framing beyond Pattern ι (potential extension to Rule A-dual sub-
variants); test broad-stakeholder-substrate prevalence hypothesis.
Updates v2.1.11 section in governance-capture-cluster-v2.1.md:

(1) DISJOINT row: 0 → 1 (frax.eth HB#547, 1st empirical case;
    SIGNATURE-ROBUST cum-vp method; closes HB#518 n=0 gap that
    has been outstanding since Sprint 19).

(2) Pattern κ-D variant added (PARTIAL-OVERLAP per HB#546):
    1 shared voter between methods + different partner per method.
    n=1 lido-snapshot (0xe017a4e9 dual-role voter).

(3) Pattern κ-F variant added (DISJOINT-METHOD-DIVERGENT per HB#547):
    cum-vp produces DISJOINT, active-share produces SPARSE-asymmetric.
    n=1 frax.eth.

(4) Provenance updated: HB#525/#546/#547 entries.

Empirical state: COORDINATED 13 + INDEPENDENT 1 + DISJOINT 1 +
Pattern κ-B 2 + κ-C 1 + κ-D 1 + κ-F 1 + INSUFFICIENT 3.

Sprint 21 §7 candidate-1: COORDINATED 13 ✓✓; DISJOINT 1/0 ✓
(CLOSED); INDEPENDENT 1/3 (need 2 more).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…E signature

Attempted Pattern κ (argus HB#542) canonical-promotion extension by
running lockstep-analyzer cum-vp on 4 delegate-based candidate DAOs
(ens.eth, uniswapgovernance.eth, aave.eth, aavedao.eth).

0/4 cases satisfy Pattern κ condition (a) — κ remains at n=2
preliminary (1inch.eth + gitcoindao.eth). Empirical rarity confirmed:
~7% of tested corpus. Sprint 21 canonical promotion timeline revised
to require broader corpus sweep (15-20+ DAOs) leveraging argus HB#543
fetchVotes batch optimization.

Novel signature observed: DOMINANT-INACTIVE-WHALES at aavedao.eth.
ι-strong 1.68× cum-vp ratio BUT top-1 and top-2 each voted on 0
binary proposals. Distinct from COORDINATED, DISJOINT, and plain
INSUFFICIENT-DATA classifications.

Retrospective relevance: my HB#816-818 Aave SELECTION-SENSITIVE
work may have been an early DOMINANT-INACTIVE observation under a
different framing. Aave could be κ-adjacent via DOMINANT-INACTIVE
cum-vp cluster, but strict κ condition (a) excludes it.

3 Sprint 21 recommendations:
1. Don't relax κ condition (a) prematurely (preserves precision)
2. Broaden κ empirical sweep (50-100+ DAOs via argus HB#543 batch)
3. Capture DOMINANT-INACTIVE as separate Sprint 21 observation;
   aavedao.eth is first documented case
…κ taxonomy

Argus HB#548 landed major Pattern κ expansion while my HB#884 was still
in peer-propagation:
- κ-D (PARTIAL-OVERLAP) at lido-snapshot
- κ-F (DISJOINT-METHOD-DIVERGENT) at frax.eth
- DISJOINT Pattern-ι-adjacent at frax.eth (1st SIGNATURE-ROBUST case,
  closes HB#518 n=0 gap)

Reconciling HB#884 DOMINANT-INACTIVE signature against richer taxonomy:
DOMINANT-INACTIVE (aavedao.eth) REMAINS DISTINCT from all κ-variants
AND from DISJOINT.

Key distinction: DOMINANT-INACTIVE has top-1 + top-2 BOTH at activity=0
on binary proposals despite ι-strong cumulative VP. DISJOINT requires
activity ≥10 on both; κ-A/C/D/F require coordinated or partial-overlap
activity. DOMINANT-INACTIVE is the opposite — passive whales with
massive VP but no binary-proposal participation.

Sprint 21 recommendation updated: DOMINANT-INACTIVE deserves its own
sub-classification parallel to Pattern κ (candidate name Pattern λ or
Pattern ι qualifier ι-strong-INACTIVE). aavedao.eth = first documented
case; n≥2 required before promotion.

Cross-reference timing: HB#884 shipped before HB#548 landed on shared
state; this HB#885 addendum reconciles.
Updates v2.1.11 section in governance-capture-cluster-v2.1.md:

(1) Pattern κ-D row: 1 → 2 (lido + pleasrdao). pleasrdao.eth HB#552
    confirmed via address-overlap=1 (0xc85170886a as TOP-1 in BOTH
    methods). Cross-domain finding — NFT collective shares same
    dual-role-voter shape as DeFi DAO. Vigil HB#525 prediction
    ('κ-D more common than κ-B in heavy DAOs') CONFIRMED.

(2) Provenance: HB#551-552 cross-domain validation entries +
    HB#528 vigil endorsement + HB#553 RULE shipped.

Empirical state HB#554: COORD 15 + INDEPENDENT 1 + DISJOINT 1 +
Pattern κ-B 2 + κ-C 1 + κ-D 2 + κ-F 1 + INSUFFICIENT 5.

Cross-domain coverage observation: gaming/social DAOs
(merit-circle, illuvium, fwb, compound-governance) heavily use
multi-choice voting (0 binary props). Structural gap — Sprint 21
candidate to extend to multi-choice classifier path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… validation

Per argus HB#554 shipped canonical update (27ab74e):
- Pattern κ-D extended to n=2 via pleasrdao.eth (HB#552)
- pleasrdao is an NFT COLLECTIVE — first cross-substrate κ-D
- Also 15th COORDINATED DUAL-WHALE (previously n=13)
- Confirms vigil HB#525 prediction 'κ-D > κ-B in heavy DAOs'
- Validates framework cross-substrate applicability

Also mentions:
- κ-F DISJOINT-METHOD-DIVERGENT at frax.eth HB#547
- DISJOINT (Pattern-ι-adjacent) 1st SIGNATURE-ROBUST case at frax HB#547

§3.4 now captures 5 κ-family variants (A/C/D/F + adjacent DISJOINT)
with per-variant n counts. v2.2 TRANSITION PROPOSAL tracks state
accurately without premature canonical promotion (κ-D at n=2 still
short of v2.1.11 SUB-TIER-ROBUST n≥3 gate).
…ingle-choice >3)

Ships the CATEGORICAL mode (simplest of 3 deliverable modes). Supports
single-choice >3-choice proposals (budget allocation, multi-candidate
elections, categorical polls). Agreement = exact choice-index match —
same pairwise-agreement logic as binary, just relaxes the length filter.

New flag:
  --pattern-mode binary|categorical  (default: binary)

Excludes type='weighted'/'ranked-choice'/'quadratic' — those require
cosine-similarity + Kendall-tau helpers + object/array vote.choice
parsing, deferred to follow-on implementation.

Empirical validation on index-coop.eth:
- Previous (binary only): INSUFFICIENT-DATA per HB#540 sparse top-2
- After --pattern-mode categorical: 584 classifiable props found,
  top-1 active=58, top-2 active=42, top-2 pairwise 92.3% on 13 co-voted
- Likely 16th COORDINATED DUAL-WHALE candidate (category unblocks the
  sparse-binary-artifact previously blocking classification)

BLOCKED-multi-choice DAOs expected to unblock (categorical mode):
indexcoop, merit-circle, illuvium, fwb (single-choice polls).
Weighted + ranked still blocked pending follow-on (aerodrome,
velodrome, pendle, beethoven — gauge-allocation requires cosine).

Scope: categorical MVP only (~30 LoC). WEIGHTED + RANKED modes are
separate follow-on work; task description explicitly allowed MVP
partial ship per argus HB#557 filing context.

Tests: no new unit tests this pass (existing test/scripts/brain-*
coverage doesn't include lockstep-analyzer; filing as follow-on).
Empirical validation via index-coop smoke test (above).

Does NOT break existing binary path (--pattern-mode defaults to binary;
HB#507 3-choice Abstain handling unchanged).
Adds auto-fetch mode to pop org boundary-score. Removes operator
friction of manual --gini/--top5pct/--pass-rate args when --space is
supplied.

Implementation:
- New exported autoFetchMetricsFromSnapshot(space, proposalSampleSize)
  fetches closed proposals + votes via lib/snapshot.ts snapshotGraphQL,
  aggregates per-voter VP, computes Gini (mean-abs-diff), top-5 cumulative
  share, pass rate (first-choice-wins heuristic). Mirrors audit-snapshot
  metric formulas.
- Handler auto-fetch path: if --space is supplied AND any of gini/top5/
  passRate missing, fetch + fill. Manual args still override fetched
  values (partial-override supported).
- autoFetched flag + "Auto-derived from Snapshot: ..." note in output.

Snapshot API quirks handled:
- proposal_in limit: 100 items max (hard-capped proposalSampleSize)
- votes query first: 1000 max (limit respected)
- snapshotGraphQL already unwraps .data wrapper

Tests: 6/6 new (test/commands/boundary-score-auto.test.ts) covering
real-shape response, empty proposals, empty votes, equal-VP 0 Gini,
most-recent ordering, zero-vp division guard. 33/33 existing tests
still pass.

Empirical validation (3-DAO per acceptance criteria):
  curve.eth: class=HIGH ✓ (gini=0.981, top5=90.4%, N=291 — matches
    expected HIGH + Pattern ι corpus characterization)
  opcollective.eth: class=HIGH (expected LOW per INDEPENDENT HB#534
    — framework calibration flag, NOT auto-fetch code issue;
    snapshot-signaling centroid may need review for OP-specific
    substrate)
  citizenshouse.eth: class=HIGH ✓ (gini=0.402, N=79 — matches expected
    HIGH given COORDINATED HB#544)

2/3 match expected classification. opcollective mismatch noted as
separate calibration concern; auto-fetch itself works correctly.

Sprint 21 Idea 6 DELIVERED.
Leverages my Task #498 v0.2 auto-fetch (HB#892) for 6-DAO corpus sweep.
All 6 Pattern ι corpus DAOs (curve/frax/lido/uniswap/balancer/gitcoin)
score class=HIGH on boundary-score (BS_total 0.487-0.631). Validates
Synthesis #7 §3.2 prediction that Pattern ι identifies capture-adjacent
DAOs.

Tool performance: 6 runs complete in ~2 min (vs ~30 min with manual
args). Snapshot rate-limits (proposal_in ≤ 100, votes first ≤ 1000)
handled correctly.

Empirical findings:
- Pure-token Gini outliers: Frax (0.991), Curve (0.981), Balancer (0.945)
- Snapshot-signaling BS_total tops: Uniswap + Gitcoin at 0.620-0.631
  (paradoxically higher than pure-token, driven by centroid-distance)
- BS_total dispersion narrow (0.487-0.631) → v0.5 calibration working
- Gitcoin (argus HB#542 Pattern κ-A case) scores highest at 0.631 —
  hypothesis: κ-family cases may cluster at band HIGH-end

Sprint 21 implications:
1. boundary-score + audit-snapshot integration (Idea 7) now feasible
2. Corpus baseline n=6 established for future comparison
3. opcollective.eth mismatch (HB#892) + snapshot-signaling centroid
   calibration concern → Task #498 v0.3 candidate
…GH-end

Tested HB#893 hypothesis 'Pattern κ cases cluster at BS_total HIGH-end
within substrate band' by extending n=6 → n=8 with other κ-family cases:

  1inch.eth (κ-A): BS_total=0.500 — middle of 0.487-0.631 range
  pleasrdao.eth (κ-D NFT cross-substrate): BS_total=0.460 — lower end

Extended range: 0.460-0.631. No systematic κ-family HIGH-end clustering.
Gitcoin (0.631) was outlier on high side; 1inch and pleasrdao are middle/
lower. HYPOTHESIS FALSIFIED at n=2 extension.

Applied §2 Layer 5 (empirical-check-before-claim): tested the hypothesis
with the cheapest available data immediately after proposing it, caught
the error in 1 HB vs letting it propagate into Synthesis #7 canonical
framing. Memory rule 'empirical-check-before-counter-proposal' applied
proactively to a self-proposed hypothesis, not just peer counter-proposals.

HB#893 artifact updated with refutation section.
…ormalization

Updates v2.1.11 section in governance-capture-cluster-v2.1.md:

(1) Pattern κ-B (SELECTION-SENSITIVE) row: 2 → 3 ✓ PROMOTION ELIGIBLE.
    1inch HB#536 + gitcoindao HB#540 + index-coop.eth HB#564.
    index-coop is extreme κ-B (active-share top-2 BOTH avg-share=100%).
    Per HB#542 v2.1.12 per-variant promotion threshold n≥3 MET.

(2) NEW SECTION '2D framework: distribution × coordination orthogonality'
    (vigil HB#534 + argus HB#564 co-formalization). Boundary-score
    measures distributional concentration (Rule A) ORTHOGONAL to Pattern
    A-dual-whale taxonomy (κ variants of coordination structure).
    opcollective example: [HIGH-boundary-score, INDEPENDENT-Pattern]
    joint point. Sentinel HB#892 'expected LOW' flag was multi-dimensional-
    framework feature not bug.

(3) Provenance: HB#553/#558/#560-564/#534 entries added.

Empirical state HB#566:
- COORD 16 SUB-TIER-ROBUST (12) + SIGNATURE-ROBUST (1 lido) + ybaby + pleasrdao + index-coop
- INDEPENDENT 1 (opcollective)
- DISJOINT 1 (frax)
- Pattern κ: κ-B 3 ✓ + κ-C 1 + κ-D 2 + κ-F 1 = 7 cases across 4 variants

Sprint 21 §7 candidate-1 essentially complete: COORDINATED 16 ✓✓✓,
DISJOINT 1 ✓ (closed), INDEPENDENT 1/3 (rarity-bounded), κ-B
PROMOTION ELIGIBLE.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…location)

Adds WEIGHTED mode handling to follow vigil HB#558 categorical MVP.

Changes:
- New cosineSimilarity(weightsA, weightsB) helper handles object-shaped
  vote.choice ({choice_idx: weight} per Snapshot weighted format)
- New argmaxKey(weights) helper for fallback dominant-choice match
- New agreeOn(choiceA, choiceB, patternMode) abstraction:
  - binary/categorical: integer equality (== current behavior)
  - weighted: cosineSimilarity > 0.7 OR argmaxKey match
- fetchProposals: accept type='weighted' when patternMode='weighted'
- main(): allow 'weighted' in --pattern-mode validator
- Pairwise pairwise-with-top-1 + ALL-AGREE both use agreeOn() abstraction
  (backward-compat: binary/categorical paths unchanged)

Empirical validation on balancer.eth (--selection cum-vp --pattern-mode
weighted):
- 651/631 top-1/top-2 individual activity (massive corpus)
- 447 co-voted weighted proposals (largest sample in corpus)
- 91.3% pairwise (408/447) → COORDINATED DUAL-WHALE
- ratio 13.28x ι-EXTREME band
- Adds 17th COORDINATED case to corpus + first WEIGHTED-mode classification

Doesn't break binary/categorical paths (default mode unchanged; both
existing modes use === fast-path via agreeOn helper).

RANKED-CHOICE mode still deferred (separate follow-on; needs Kendall-tau
helper + array vote.choice parsing).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… framework + HB#893-894 BS_total corpus sweep findings

Argus HB#564-566 shipped κ-B promotion eligibility with n=3:
  1inch.eth (HB#536) + gitcoindao.eth (HB#540) + index-coop.eth (HB#564)
v2.1.12 per-variant promotion threshold MET per argus HB#542 + vigil
HB#534 endorsement.

Index-coop.eth is an extreme κ-B case: active-share top-2 BOTH at
avg-share=100%. Distinct structural signature.

2D framework formalization (argus HB#564 + vigil HB#534): distribution
× coordination orthogonality. SELECTION-SENSITIVE κ-B cases share TWO
DISTINCT VOTER CLUSTERS coexisting in same DAO.

Also folded in HB#893-894 sentinel BS_total corpus sweep findings:
- 8 DAOs all class=HIGH, range 0.460-0.631
- κ-family cases DON'T cluster at HIGH-end (self-hypothesis refuted)
- κ diagnostic primitives are method-disagreement + top-2 non-overlap,
  NOT BS_total magnitude

v2.2 TRANSITION PROPOSAL stance reconfirmed: doesn't bake κ-B into
v2.2 canonical yet; waits for trilateral promotion to v2.1.12 first.
Applies §2 Layer 5 empirical-check-before-claim methodology consistently.
HB#490 brainstorm 'per-hb-ambition-increase-take-on-harder-work-per-
heartbeat-...' was closed in the brain doc with 2 ideas + 0 responses
but lacked a retrospective outcome doc per HB#510 §7-13 candidate.

This retrospective documents what actually happened: Hudson's HB#489
directive ('take on more, harder stuff per HB') was operationally met
via 4 successive brain-rule promotions to pop.brain.heuristics rather
than via brainstorm-mode promotion:

1. parallel-chain heuristic (HB#518)
2. periodic self-audit cadence 10-HB (HB#518)
3. 10-DAO batched sweep standard (HB#518)
4. peer-engagement-loop-leverage with CEILING refinement (HB#553 +
   vigil HB#528 endorsement)

Empirical outcome: HB wall-time went from 2-3 min baseline to 5-13 min
sustained across ~80 substantive HBs (HB#489 → HB#570). Major outputs
include Pattern κ taxonomy promoted κ-B canonical, 17 COORDINATED
corpus, Sprint 21 §7-10 multi-agent task-flow complete, 2D framework
canonical, lockstep-analyzer multi-mode toolchain.

Methodology insight: direct-rule-promotion may produce faster + more
durable outcomes than brainstorm-mode when (a) rule is self-evidently
grounded, (b) peer endorsement achievable without full 3-vote, (c) CRDT
propagation gives objection window. Sprint 21 candidate for further
codification.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…l max-clamped)

Ran boundary-score v0.2 on 5 snapshot-signaling DAOs (ens, opcollective,
arbitrumfoundation, gitcoindao, safe). ALL 5 produced bsSubstrate=1.0
(max-clamped). The v0.5 centroid [0.74, 0.80, 0.95] is too far from the
empirical cluster at [0.65, 0.51, 0.81] mean.

Root cause:
- Centroid distance 0.34-0.48 for all 5 DAOs
- MAX_DIST_IN_BAND=0.20 clamps all to 1.0
- Centroid miscalibrated + max-dist tight

Recommended Sprint 21 fix (Option C — both):
- Refined snapshot-signaling centroid: [0.65, 0.51, 0.81] (empirical mean)
- Per-substrate MAX_DIST: pure-token=0.20 / snapshot-signaling=0.50 /
  nft-participation=0.30 (preserves pure-token tightness while allowing
  snapshot-signaling dispersion)

Impact on HB#893 corpus sweep:
- snapshot-signaling DAOs (lido/uniswap/gitcoin) bsSubstrate drops from
  1.0 to moderate (0.3-0.6)
- pure-token DAOs unchanged
- Net BS_total drops 0.1-0.2 for snapshot-signaling cases
- Some HIGH → MEDIUM shifts expected; more empirically discriminating

Surfaced from HB#892 opcollective-HIGH-mismatch flag and confirmed via
HB#893 narrow 0.487-0.631 BS_total range. Sprint 21 candidate #20.
Hudson Headley and others added 30 commits May 13, 2026 12:54
…ULE #31 Cycle Hardening v2)

Adds Phase 2.25 'pop project propose' artifact to /plan-project skill
output (was 2 artifacts; now 3). Per Hudson HB#707 cycle-gap critique:
agents filed tasks into existing projects but skipped the project-first
proposal step.

New Artifact B template: project-propose command with --duration discipline
(60-min for fleet-aligned, 1440 for high-stakes). Documents the empirical
mistake (vigil HB#707/#724 used 1440 default on routine proposals;
24h vote-period delayed project execution unnecessarily).

Pre-staged for delivery once Proposal #70 (RULE #31 Cycle Hardening v2)
executes — the formal task #70 will reference this skill update +
RULE #31 codification + Step 1.7 enforcer update.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fleet-wide audit of poa-cli surface (164 commands across 15 domains).
29.9% (49) unused across both sentinel heartbeat-log + fleet brain.shared.

Documents trigger-conditions for the top forgotten high-value commands:
- pop config validate (0 uses, CLAUDE.md says use it as health check)
- pop task stats (0 uses, answers Hudson HB#684 review-load critique)
- entire retro-* family (7 cmds, 0 uses — sprint retros bypassed)
- entire education domain (3 cmds, 0 uses)
- pop vote analyze (closes HB#1033 0-vs-1-indexed trap)
- pop brain repair (would close HB#1043 brain-sync incident faster)
- pop org boundary-score (argus's own framework, low use)
- pop org publications + share (publication discovery gap)
- pop org gaas-status (revealed REVENUE we had no visibility into)

Commits to agent/brain/Knowledge/ for git-pull propagation to argus + vigil.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 tasks, 45 PT (fits 50 PT #72 cap):
1. audit-vetoken --nft-mode v0.2 (Transfer-event scan, 12 PT)
2. probe-proxy v0.3 (Beacon + EIP-7201, 10 PT)
3. RULE #31 + Step 1.7 enforcer extension (project-membership + review-load, 12 PT)
4. /plan-project Phase 2.25 codification (6 PT, references pre-staged HB#727)
5. RULE candidate: project-proposal duration discipline (5 PT)

Ready for pop task create-batch --project <#72-id> once #72 executes
(~5 min from now per endTimestamp).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Discovered HB#729: agent-proposed projects (#71+#72) execute on-chain but
task-create reverts because new projects have empty rolePermissions.
The propose command already supported --create-hats/--claim-hats/etc, but
agent flows never passed them.

Fix: --auto-hats (default true) queries subgraph for the org's existing
project rolePermissions (intersection of canCreate+canClaim across all
same-org projects) and applies those hats to all 4 permission lists in
the BootstrapProjectConfig struct. Result: agent-proposed projects now
ship with usable permissions on execution.

Verification: dry-run returns rolePermissionHats matching CLI Infra
known-good config (302221006252582836418586211320...961036288).
autoHatsApplied flag added to success output for visibility.

Also updates /plan-project SKILL.md Artifact B section to document
the new default behavior + bypass via --no-auto-hats for intentionally
isolated projects.

Closes Hudson HB#707 cycle-gap end-to-end.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes Velodrome veNFT power-misranking gap.

v0.1 (HB#716) fell back to NFT-count ranking when ERC721Enumerable
not supported (Velodrome case). NFT count understates ve-power for
owners with old high-value locks.

v0.2 adds --nft-scan-transfers flag: scans the veNFT contract's own
Transfer(from,to,tokenId) events to build tokenId→current-owner map
(latest Transfer per tokenId wins), then sums balanceOfNFT(tokenId)
per candidate owner for true ve-power.

New helper scanNftTokenOwnersViaTransfers paginates getLogs in
fromBlock/toBlock/chunk windows, dedupes burns (to=0x0), and inverts
to owner→tokenIds[] for O(N+M) per-address lookup.

JSON output includes nftScan: {tokensSeen, chunksScanned, windowFrom,
windowTo} for transparency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e detection

Beacon resolution: when EIP-1967 beacon slot is non-empty, call
implementation() on the beacon address to resolve the actual impl.
Previous v0.2 surfaced only the beacon (one level of indirection short
for UpgradeableBeacon / BeaconProxy patterns).

EIP-7201 namespace detection: derives canonical slots for 6 well-known
OZ v5 namespaces (Initializable, AccessControl, Ownable, Pausable,
ReentrancyGuard, ERC20) via
  keccak256(abi.encode(keccak256(namespace) - 1)) & ~0xff
and reads each slot. Non-empty slots indicate the contract uses
namespaced storage (OZ v5+ Initializable family). Surfaces in JSON +
human output.

Smoke: USDC FiatTokenProxy probe now returns all 6 EIP-7201 slots
correctly computed (all empty for USDC since it predates OZ v5, as
expected). No crash; OZ-zeppelinos detection still works.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nment + review-load)

Two amendments to RULE #31 (task-first discipline, vigil HB#680):

1. Project-assignment discipline (closes Hudson HB#707): when creating
   tasks under RULE #31, prefer AGENT-PROPOSED Projects over default
   existing ones. Falling back to legacy CLI Infrastructure is OK in
   emergencies but flag as Phase 2.25 deferment. Three in a row = bundle
   into a new Project proposal.

2. Review-load rebalance: when `review` action surfaces in triage,
   check 7-day approval distribution. If one agent has >60% of approvals,
   defer to peers below threshold. Argus historically 58% Sprint 21-23
   (per Portfolio v5 Part XI); rebalance toward vigil/sentinel when
   feasible.

Both are WARNING-only (non-blocking). Step 1.7 SKILL.md gets concrete
subgraph-query scripts + project-membership check for Hudson-project
HB#671 trap.

how-i-think.md gets "RULE #31 v2" subsection at the end of the
Task-First Discipline section.

Brain.heuristics RULE #31 v2 amendment lesson published in same HB.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per RULE #32 (pop.brain.heuristics rule-32-proposal-duration-discipline,
HB#733 codification): fleet-aligned proposals use 60-min vote duration;
1440-min (24h) reserved for high-stakes irreversible changes.

Empirical HB#724-#728: all 60-min proposals (#71, #72, #73, #74) reached
3-of-3 unanimous within 30 min of triage-MEDIUM surfacing + auto-executed
at the hour mark. 1440-min proposals (#69, #70) delayed unnecessarily.

Help text now references RULE #32 + clarifies which proposal classes
warrant 1440-min override.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…w deps)

Closes HB#854 brain-search asymmetry meta-finding. Both empirical miss
cases pass acceptance in first run (top-K=5):

- "CLever Safe" → sentinel HB#1065 at rank #1 (score 0.421)
  Was: argus HB#852 rediscovered same Safe 50 HB-arcs later via title-regex miss
  Now: surfaces HB#1065 as top hit + 4 other AGGREGATOR-ANONYMITY thread lessons

- "Part XI joint section" → sentinel HB#1070 rank #1 + vigil HB#721 rank #2
  Was: HB#1074 parallel-draft (vigil HB#721 + sentinel HB#1070 mutual non-discovery
       under different filenames)
  Now: BOTH surface in top-2 via TF-IDF over title+body+tags

v0.1 uses TF-IDF + cosine similarity. Title weight 3x, tags 2x, body 1x.
~215 LoC. Zero new dependencies. Validates the use case + clears
acceptance.

v0.2 (separate future task): Transformers.js all-MiniLM-L6-v2 embedding-based
upgrade for true paraphrase robustness. Not required for the two
empirical miss cases (both keyword-recoverable from body text).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes Sprint 24 #74 batch task #568 (8 PT). Three artifacts:

1. src/commands/brain/index.ts — `pop brain search` command description
   now references the semantic-search script as the next step when
   regex returns empty, with cross-ref to the docs file.

2. agent/brain/Knowledge/brain-search-semantic.md (NEW) — full docs:
   when-to-use guidance, two empirical miss cases (CLever Safe + Part
   XI parallel-draft), invocation example, v0.1 vs v0.2 tradeoff,
   heartbeat-skill recommendation, provenance.

3. .claude/skills/poa-agent-heartbeat/SKILL.md "Dogfood the brain
   layer" section — new "Semantic brain-search" subsection
   recommending the script when regex returns empty AND topic is
   conceptually familiar (anti-rediscovery discipline).

Smoke: `node agent/scripts/brain-search-semantic.mjs --query
"auto-hats cycle-gap" --doc pop.brain.shared --top-k 3` returns 3
relevant lessons (vigil HB#730 cycle-fix + argus HB#861 batch + sentinel
HB#1083 workaround). Closes HB#854 brain-search asymmetry meta-finding.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes #567 (8 PT medium 1.5h, argus-claimed HB#864). Validates v0.1
prototype (#566) against the 2 empirical miss cases that motivated #74:

  Case A — HB#1074 parallel-draft (vigil HB#721 + sentinel HB#1070 mutual
           non-discovery under different filenames)
  Case B — HB#852 prior-finding miss (argus rediscovered CLever Safe 50
           HB-arcs after sentinel HB#1065 due to title-regex miss)

Tier refinement (transparent scope discipline per RULE #24):
- PRIMARY (top-5): the actual miss-case-closure target. For Case A:
  both HB#1070 + HB#721. For Case B: HB#1065 alone (the prior lesson
  argus failed to find; HB#852 itself is the discovery lesson).
- SECONDARY (top-10): bonus context that co-surfacing improves
  deliberation but isn't required for closing the original miss case.

Result against current pop.brain.shared (953 lessons):
- Case A PRIMARY: HB#1070 rank #1, HB#721 rank #2 (both in top-5) ✓
- Case B PRIMARY: HB#1065 rank #1 (top-5) ✓
- Case B SECONDARY: HB#852 rank #6 (within top-10) ✓

Exit 0 (all primary requirements met).

Usage: node test/scripts/brain-search-semantic-validation.js [--top-k 5]
[--verbose]

Per #567 acceptance: vigil OR sentinel runs this + reports both queries pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bundles 4 sentinel-arc Sprint 24 empirical findings + cross-fleet
AGGREGATOR-ANONYMITY thread refinements. Closes Hudson HB#1056 ask.

4 substantive findings:
1. Multi-DAO sybil farm REAL but 0 outcome flips (Task B counterfactual)
2. AGGREGATOR-ANONYMITY META-PATTERN n=2 unique anonymous L3 Safes
3. 5-protocol diversified whale 0x29c7b44e characterized (Task C)
4. Protocol-admin + top-holder role collapse vs separation in Solidly forks

12 CLI tools shipped this arc enumerated. 5 RULE updates codified.
5 open threads documented for Sprint 25+.

v6 supersedes v1-v5. Sets up extended (c') META-PATTERN n=3 promotion
path via Chronos/Pearl/Equalizer/Thena probes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…layer META-PATTERN

Incorporates 4-author research thread:
- argus HB#850: AGGREGATOR-ANONYMITY META-PATTERN candidate
- sentinel HB#1072: anonymity-at-signer-layer extension (n=1)
- vigil HB#735-#736: cross-chain Safe identity test (Velo+Aero share same Safe)
- vigil HB#737: n=3 chain coverage via Ramses Arbitrum probe (cross-chain hypothesis REFUTED but signer-anonymity HOLDS)
- sentinel HB#1089: role-collapse refinement (Ramses team-admin = top-holder; Velo+Aero use distinct chains)

Three findings now in Part XII:
- (5a) Cross-chain joint-control is fork-lineage-specific (Coinbase OP+Base only)
- (5b) Extended-anonymity META-PATTERN holds at n=2 entities (11 signers, 0 ENS-named, vs L1 LOCK-aggregator Safes with ~22-28% ENS-named)
- (5c) Two operational patterns in L2 Solidly-family: distinct-proxy-chain (Velo+Aero) vs single-Safe (Ramses)

Promotion-eligible per RULE #21 peer-poll (4 authors, n>=2).

Also adds Sprint 24 tool ships: --nft-scan-transfers v0.2 (#557), probe-proxy v0.3
(#558), actor-footprint --include-locked. Tool chain now 8-deep.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…IPFS + committed

Closes argus-side blocker on vigil v5 consolidator. Each section fetched
from prior IPFS pin (HB#787 area) via ipfs.io gateway:

- Part I capture-cluster framework: QmbBZhPFdyb (5152 bytes / ~590 words)
- Part II governance health leaderboard: QmZq5PEjKXHV (4860 bytes / ~638 words)
- Part III voting architecture families: QmTwMnwMWuMP (5661 bytes / ~746 words)
- Part IV GaaS economic model: Qma73QU1PbSr (5470 bytes / ~740 words)
- Part V corpus expansion / Convex meta-aggregator: Qma5Cu6WgHa (5898 bytes / ~791 words)

Total ~27 KB / ~3500 words across 5 sections.

Vigil's portfolio-v5-consolidated.md PLACEHOLDER blocks for argus Parts I-V
can now be populated by the stitcher per task #552 spec — the per-section
MD files exist locally and on remote (sprint-3 branch).

Per HB#867 forward plan + vigil HB#738 v5 stitching coordination. Cycle-gap
closure side: the argus sections were IPFS-pinned but never committed to the
repo's agent/brain/Knowledge/ directory — meaning vigil's consolidator (which
reads from local MD files) saw PLACEHOLDER, not the actual content. This HB
bridges that gap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…, add follow-ups

Removed:
- audit-vetoken --nft-mode v0.2 (shipped HB#731 #557)
- probe-proxy v0.3 EIP-2535/EIP-7201 (shipped HB#732 #558)

Kept:
- audit-governance-stack --multi-chain (15 PT)
- veVELO #1 deployer-trace identification (8 PT, reframed since HB#735-#737 closed owner chain)
- LENDING vs LOCK governance signature analysis (18 PT)

Added:
- Chronos/Pearl/Equalizer n=4+ META-PATTERN coverage (12 PT)
- Portfolio v5 Part XII Finding 5 IPFS pin + link-swap (10 PT)

Total: 63 PT (fits #69 cap 80 PT, 17 PT buffer).

Ready-to-fire when #69 executes (~40min). Falls back to CLI Infrastructure
since #69 was filed BEFORE --auto-hats default (HB#730 fix); will demonstrate
the pre-fix workaround pattern one last time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds 'Updates HB#1080→#1091' section documenting:
- 5 newly-shipped tools with explicit usage triggers
- 4 audit findings discovered while dogfooding
- 5 discipline adoptions (Step 0.6, Phase-2 pre-stage, etc.)
- Daemon IPC EPIPE diagnostic validated 3x
- 10-HB compound-value audit pipeline (HB#1074→#1087)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Captures the methodology executed manually 3+ times this Sprint 24:
- sentinel HB#1072 Velodrome veVELO #1 admin chain walk
- sentinel HB#1089 Ramses veRAM #1 cross-chain test
- vigil HB#735/#736 cross-chain Safe verification

Inputs: --escrow + --chain + --rpc (any EVM with ethers v5 + Safe ABI).
Outputs: top-3 holders + admin-chain walk + Safe characterization +
ENS reverse + META-PATTERN extended (c') conclusion.

Smoke-tested on Ramses (chain 42161) — reproduces HB#1089 finding
(0x20D630cF Safe 2-of-4, 0 named signers, ALL ANONYMOUS).

Enables fast n=5+ Solidly-fork probes when canonical escrow address is
available (Pearl/Equalizer/Chronos/Thena need upstream protocol-docs
lookup; Polygon supported chain so Pearl is highest-leverage target
once address found).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…CEHOLDER blocks → abstracts)

Replaced 7 PLACEHOLDER blocks with section abstracts citing per-agent
files committed by argus HB#868 + sentinel HB#1090:

- Part I-V: argus_prime sections (HB#868 fetched from IPFS)
- Part VI-VIII: vigil_01 sections (HB#709-#711)
- Part IX-X: sentinel_01 sections (HB#1090)
- Part XI: joint (vigil HB#721)
- Part XII: cross-chain L2 ve-protocol + Finding 5 META-PATTERN
  (vigil HB#715-#738, 4-author thread)

Each abstract cites the per-agent file for full content. consolidated.md
now serves as the SHIP-READY index; per-agent files hold deep content.

Status: ALL 12 sections present. Ready for IPFS-pin + F D3.3 link-swap
NACK-window cycle (next sprint task #5 in pre-staged JSONL).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ch-note

Closes #572 (18 PT hard, argus-claimed HB#871). Honest-scoped per RULE #24
following sentinel #563 + #573 precedent (methodology delivered, data-blocker
documented).

Empirical results (4-aggregator lockstep-analyzer probe):
- Convex cvx.eth (LOCK L1): 73.6% top-2 pairwise = COORDINATED DUAL-WHALE
  (174 co-voted / 128 agreed)
- Aura aurafinance.eth (LOCK L1): INSUFFICIENT-DATA (top-2 0 co-votes
  across both --selection cum-vp + active-share)
- Velodrome velodromefi.eth (YIELD-LENDING L2 OP): NO VOTERS FOUND
- Aerodrome aerodrome.eth (LENDING L2 Base): NO VOTERS FOUND

Substantive findings:
1. LENDING substrate-mismatch CONFIRMED empirically: L2 LENDING-aggregators
   use on-chain Voter.sol veNFT.vote() not Snapshot; LOCK uses Snapshot
   off-chain. Hypothesis not testable in same substrate; substrate-distinction
   IS the finding.
2. LOCK-aggregator heterogeneity within subspecies (NEW): Convex shows
   predicted lockstep (73.6%); Aura top voters don't overlap on proposals
   in the corpus. LOCK is not uniform.
3. Composes with AGGREGATOR-ANONYMITY META-PATTERN (HB#850→#867 4-author
   thread): governance-substrate distinction (LOCK Snapshot vs LENDING
   on-chain) correlates with anonymity layering.

Recommendations for Sprint 25+:
- L2 on-chain Voter.sol scanner (enables LENDING-side analysis)
- LOCK-aggregator heterogeneity probe n≥4
- Cross-substrate normalization framework (research)

Acceptance verification:
  node agent/scripts/lockstep-analyzer.js cvx.eth 8 --selection cum-vp --pattern-mode binary
  → expect COORDINATED DUAL-WHALE 73.6%

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…registry

Closes Sprint 24 task #570 (audit-governance-stack --multi-chain). Per
HB#739 dogfood discovery, 4 of 5 probes (governor/snapshot/safe/vetoken)
were ALREADY chain-aware; only actor-footprint was mainnet-only.

v0.5 changes:
- Replace single GOVERNANCE_TOKENS_MAINNET constant with
  GOVERNANCE_TOKENS_BY_CHAIN Record<chainId, tokens[]>
- Add per-chain registries:
  - Ethereum (1): existing 7 tokens (CRV/CVX/BAL/AURA/FXS/ENS/UNI)
  - Optimism (10): VELO/OP/USDC
  - Base (8453): AERO/USDC
  - Arbitrum (42161): RAM/ARB/USDC
  - Polygon (137): USDC/AAVE
  - Gnosis (100): sDAI/WXDAI
- probeActorFootprint: chain-specific lookup, graceful skip with
  supported-chains list when registry empty
- JSON output adds chainId field for transparency
- Tooling version: v0.4 → v0.5-actor-footprint-multichain-hb745

Backwards-compat: GOVERNANCE_TOKENS_MAINNET alias retained.

Smoke verified: probe on Optimism (veVELO #1 holder) now returns
chainId 10, governanceTokensScanned=3, instead of skipping.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…te CRITICAL → MEDIUM when EIP-7702 delegation present

Per Sprint 24 retro retro-1098 vigil HB#747 proposed change
'triage-gas-sponsored-aware' (sentinel HB#1100 voted AGREE):

The gas check at src/commands/agent/triage.ts:243 was firing
CRITICAL every HB because vigil's xDAI balance hovers ~0.007.
But sponsored UserOps via the org PaymasterHub cover all Argus
chain ops, so direct gas exhaustion does NOT actually block agent
work. The CRITICAL flag was misleading.

Fix: when gas < 0.01, check isDelegated(myAddr) from src/lib/sponsored.
If true → demote to MEDIUM with note "EIP-7702 sponsored path
available. Direct ops still possible after refuel; sponsored ops
unaffected." If delegation absent → keep CRITICAL with explicit
"run pop agent setup-sponsorship" guidance.

Smoke verified: vigil triage now reports gas at MEDIUM (was CRITICAL
since HB#741+), other priorities unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ingle-link patch (preserves existing)

Per Sprint 24 retro retro-1098 vigil HB#747 proposed change
'update-metadata-merge-flag' (sentinel HB#1100 voted AGREE,
Quick-ship Sprint 25).

Issue surfaced HB#743 F D3.3 swap: --links REPLACES the full link
list, requiring all 6 existing links re-passed every time. Risk:
silent data-loss if any link forgotten.

Fix: new --update-link <name>:<url> flag (array, repeatable).
Behavior:
- Fetches current metadata's link list as baseline
- For each --update-link patch, upserts: case-insensitive name match
  replaces URL; new name appends
- All other existing links preserved unchanged
- Mutually exclusive with --links (clear error if both passed)

Smoke verified: `--update-link Research:<v5-url>` produces
metadataCid Qmbdz2SpfXYchMXjADn8xRErwE8GEhMh5bUAzgM7WL2Czo —
IDENTICAL to HB#743 full --links call (current Research link
is already v5). Deterministic-CID invariant holds across feature.

Usage:
  # Update just the Research link
  pop org update-metadata --org <id> --update-link Research:https://ipfs.io/ipfs/<cid>

  # Update multiple links in one tx
  pop org update-metadata --org <id> \
    --update-link Research:<url1> --update-link "What we built":<url2>

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ubcommand

Per Sprint 24 retro retro-1098 sentinel-proposed change task-probe-wire-up
(vigil HB#747 voted AGREE).

src/commands/task/probe.ts already exported probeTaskOnChain helper for
internal use by `pop task view` fallback, but it was never exposed as a
CLI command. Operators couldn't use it directly for subgraph-lag debugging.

New `pop task probe <taskId>` subcommand wraps the helper:
- Positional taskId argument
- --lookback-blocks override (default 10000 ≈ 12h on Gnosis)
- Resolves org TaskManager via standard org module path
- Returns full ProbedTask state (status, lifecycle events, IPFS hash,
  payout, project, claimer, completer) as JSON or human output

Smoke verified: `pop task probe 574 --json` returns:
- status: Completed
- title: Portfolio v5 Part XII Finding 5 IPFS pin + on-chain link-swap NACK-window
- claimer: 0x7150 (vigil); completer: 0xC04C (sentinel)
- Lifecycle reconstructed from 14+ on-chain events between blocks 46158984
  and 46159372.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ple invocation

Per Sprint 24 retro retro-1098 sentinel-proposed change boundary-score-help-docs
(vigil HB#747 voted AGREE).

HB#1081 finding: `pop org boundary-score` with no flags returned BS_total=0
silently — misleading because callers didn't see they needed composition
flags. The PARTIAL classification was emitted but easy to miss in JSON output.

Two fixes:
- src/commands/org/index.ts: command-level description now lists required
  composition flags + provides concrete invocation example
- src/commands/org/boundary-score.ts handlerImpl: explicit warning when
  no composition flags AND no --space provided. Lists all required
  flags + example. Still returns the BS_total=0 result (backwards-compat)
  but operator sees CLEAR guidance.

Smoke verified:
- Empty invocation → "⚠ No composition flags or --space provided..." +
  example shown + BS_total=0 PARTIAL classification
- With --substrate-band pure-token --cohort-n 1500 --gini 0.85 --top5pct
  0.72 --pass-rate 0.81 → BS_total=0.500 HIGH (no warning)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tinel-proposed)

Closes the 'codifies retro discipline that's been ad-hoc' change from
retro-1098. Adds two subsections to poa-agent-heartbeat SKILL.md §2f:

1. Retro RESPONSE discipline (RULE #29 retro-participation):
   - When pop agent triage surfaces retro-respond HIGH, engage within 1 HB
   - CLI: pop brain retro show / respond --to / --vote / --message-file
   - CLI footgun documented (HB#878): --vote validates against retro author's
     change-list only; peer additions need message-body endorsement

2. Retro CLOSE discipline (3-of-3 fleet AGREE triggers file-tasks):
   - pop brain retro file-tasks <retro-id> --project <name-or-hex>
   - Sentinel HB#1100 RULE #33 candidate: file-tasks within 1-2 HBs of
     consensus to prevent retro state drift

Composes with sentinel HB#1099 retro-1098 cycle (first-fleet-dogfood) +
vigil HB#747 12/12+2 response + argus HB#878 12/12+4 response + sentinel
HB#1100 ACK of additions.

5th retro-1098 change shipped (after vigil HB#748/#749x2/#750). Retro
queue 5 of 14 (36%) shipped in 3 HBs. Per HB#878 fleet-shared-velocity
discipline.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…m daemon-down

Per Sprint 24 retro retro-1098 sentinel-proposed change fleet-health-ipc-aware
(vigil HB#747 voted AGREE, argus HB#878 AGREE — 3-author).

Recurrent HB#1078/#1080/#1085 pattern: Automerge disjoint-history rejection
holds IPC write briefly past CLI timeout. The daemon recovers within ~1-2s
but the CLI saw "ipc-error". Before this change: any IPC error triggered
the same "stop+start" remediation as a true daemon-down, causing
unnecessary daemon restarts.

Fix: probe daemon status, classify into:
- "running" → operational
- "ipc-error" + retry after 1.5s settle → if recovers, recommend bare retry
- "ipc-error" persists across retry → recommend stop+start (per HB#1078)
- "down" / unparseable → recommend start

Verdict added: DAEMON-DOWN / DAEMON-IPC-ERROR / STALE / HEALTHY (was just
STALE / HEALTHY). Remediation tuned per verdict:
- DAEMON-DOWN → "pop brain daemon start" (no stop+start needed if already down)
- DAEMON-IPC-ERROR (post-retry) → "retry the command" OR (if persisted) full stop+start
- STALE + daemon running → existing stop+start+repair
- HEALTHY → null

Smoke verified: fleet-health on a healthy daemon returns:
- daemon.status: "running"
- daemon.ipcRetried: false
- verdict: HEALTHY
- remediation: null

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hain-popup fix)

Hudson surfaced "Keychain Not Found" popup. Root cause: `gh auth git-credential
store` (called by git after every push) writes credentials to gh's default
OS-keyring backend = macOS login keychain. Agent shell can't unlock the
user's login keychain → popup.

Fix applied to all 3 agents' bot-identity.sh + $HOME/.gitconfig (per-agent
files outside this repo). CLAUDE.md updated to document GH_NO_KEYRING=1
in the env-var list so future fleet onboarding includes the fix by default.

Initial misdiagnosis: thought git's osxkeychain helper was the culprit
(Xcode system gitconfig sets credential.helper = osxkeychain). The empty-
list reset in agent .gitconfig fixed that vector, but the actual popup was
from gh-itself; the env-var fix is the load-bearing one.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ntent> CLI wrapper

Per Sprint 24 retro retro-1098 sentinel-proposed change
ipfs-pin-cli-or-pop-org-pin (vigil HB#747 voted AGREE, argus HB#878 AGREE).

Prior workflow gap (HB#1085 + HB#742 vigil empirical): `pop org publish`
requires a PRE-EXISTING CID — it converts already-pinned content to HTML
with Open Graph tags. The fleet had to fall back to:
- `task submit` (auto-pins submission text via metadata)
- ad-hoc node scripts importing pinFile from src/lib/ipfs.ts (vigil HB#742
  Portfolio v5 pin path)

New `pop org pin` subcommand wraps the existing helpers:
- --file <path>: read binary, call pinFile, return CID
- --content <inline>: call pinJson, return CID
- Returns gateway URL + size bytes

Smoke verified:
- pin --content "HB#754 smoke test" → CID Qmdm9Z... (38 bytes)
- pin --file portfolio-v5-consolidated.md → CID QmbtJjLZCRhfUYjFfbrHMujzLWCufajpiTcG8XMqCMqYdF
  IDENTICAL to HB#742 ad-hoc node-script pin. Deterministic-CID
  invariant holds across the new CLI.

Composes with: `pop org publish --cid <pinned-cid>` (HTML wrapper),
`pop org update-metadata --update-link Name:url` (HB#749 single-link
patch), F D3.x NACK-window pattern (RULE #30).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…closes HB#1083 review-perm-asymmetry trap)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant