Participation Architecture - Final Grant Report

Participation Architecture - Final Grant Report

1. Executive Summary

Project: Participation Architecture - Governance Data Pipeline & Deterministic Triage Rules

Links:

Summary:
Participation Architecture is a developer-first REST API that normalizes Arbitrum DAO governance data and applies deterministic triage rules, so governance tools can prioritize what matters without building custom infrastructure. The system ingests proposals from Snapshot.org, applies a versioned rulebook (21 rules), and computes a Delegate Fatigue Index (DFI) - a 5-component deterministic score measuring governance workload burden.

Both milestones have been completed and all deliverables shipped, including a live demo endpoint, full documentation, 3 video tutorials, and a tagged release.

Impact of the grant:
This grant enabled the project to move from a research prototype to a production-grade, documented API with a live demo. Without the funding, the rulebook formalization, fatigue index implementation, video tutorials, and production deployment would not have been feasible as a solo developer effort within this timeframe. The grant also funded the infrastructure (dedicated VPS) that keeps the demo API publicly available for the ecosystem.


2. Performance Against KPIs

Milestone 1 - Pipeline Hardening + Rulebook v1 + API v1 ($3,500)

KPI Target Actual Status
Reproducible Docker setup docker compose up works Docker + manual setup both work Met
Deterministic outputs with rule IDs API returns rule IDs + reasons Every response includes reasons array with rule IDs Met
Automated rule test coverage >= 20 rule cases 30 test cases (150% of target) Exceeded
Quickstart time-to-first-call <= 10 minutes ~5 minutes (clone, venv, install, ingest, run) Exceeded

Milestone 2 - Fatigue Index + Docs/Tutorials + Public Release ($3,000)

KPI Target Actual Status
Fatigue index reproducible Documented formula + weight config 5-component formula, fatigue_config.yaml, full documentation Met
Test suite Comprehensive coverage 55/55 tests passing (25 fatigue + 30 rule engine) Met
Video tutorials published 2-3 tutorials 3 tutorials on YouTube Met
Tagged release e.g. v0.1 v0.1.0 Met
Repo open-source and runnable Docker + docs MIT license, full docs, runnable by third parties Met
Live demo endpoint Best-effort demo pa.wyszomirski.online with SSL Met
Documentation UX >= 70% complete Quickstart in <= 30 min Quickstart tested at ~5 min; structured feedback collection ongoing Met
API p95 response time < 400ms for cached queries ~1.8s uncached (399 proposals processed per request). Caching planned for next iteration Partially met

Note on p95: The current implementation processes all 399 proposals through the rule engine on each request. Adding a response cache is straightforward and planned. The proposal noted “cached feed queries” - the architecture supports this but caching was deprioritized in favor of shipping all other deliverables.

Deliverables Summary

Deliverable Status
FastAPI REST API with stable schema + OpenAPI Shipped
GET /proposals/feed - normalized proposals with scores/labels/reasons Shipped
GET /proposals/{id} - single item with rule audit trail Shipped
GET /delegates/{address}/fatigue - fatigue index + components Shipped
GET /delegates/{address}/fatigue/history - audit trail Shipped
GET /health - service health Shipped
Deterministic Rule Engine + Rulebook v2.7.0 (21 rules) Shipped
Delegate Fatigue Index (5-component deterministic formula) Shipped
FatigueSnapshot persistence to DB Shipped
OpenAPI/Swagger interactive docs Shipped
Quickstart guide Shipped
API Reference documentation Shipped
DFI deep dive documentation Shipped
Python integration example Shipped
TypeScript integration example Shipped
Video Tutorial 1: Quickstart Published
Video Tutorial 2: Notification Bot Published
Video Tutorial 3: Customize Rulebook Published
Runnable demo scripts (scripts/) Shipped
Tagged release v0.1.0 Published
Live demo API with SSL Live

3. Qualitative Impact & Community Feedback

Key non-quantitative outcomes:

  • The rulebook approach (versioned YAML + deterministic rules + test suite) demonstrates that governance triage doesn’t need AI/ML - transparent, auditable rules can do the job. This is a reusable pattern for any DAO.
  • The Delegate Fatigue Index provides the first open, reproducible formula for measuring governance workload. Every computation is stored to the database for audit.
  • All 21 rules return explicit reasons (rule IDs that fired) - no black boxes. This aligns with Arbitrum’s transparency values.
  • The project is grounded in PhD research (Design Science Research, WSB University) on DAO governance as sociotechnical systems, connecting practical tooling to academic rigor.

Alignment with Arbitrum SOS:

  • KR 7.3 (research on increasing participation): The DFI provides measurable workload signals that can be used to test what improves participation.
  • KR 7.4 (increase voting participation): The triage API reduces cognitive overload by prioritizing proposals.
  • Objective 6 (DAO efficiency): Standardized triage outputs reduce duplicated engineering across tools.
  • Objective 3 (home of builders): Open-source middleware with docs and tutorials lowers the barrier for builders.

4. Financial Summary

Category Budgeted Actual % of Grant
Engineering (pipeline + rule engine + fatigue index) $4,900 $4,900 75%
Documentation + Developer Enablement (docs, tutorials, examples) $1,200 $1,200 18.5%
Infrastructure & Ops (VPS hosting, domain, SSL) $400 $400 6.5%
Total $6,500 $6,500 100%

No meaningful difference from the original budget plan. Infrastructure costs are ongoing (~$5/month for the dedicated VPS hosting the demo API).


5. Future Plans & Continued Ecosystem Alignment

Maintenance commitment:

  • The demo API at pa.wyszomirski.online will remain live for at least 12 months post-grant.
  • The repository will remain open-source (MIT license) and maintained.

Planned improvements:

  • Response caching for feed queries (to meet the <400ms p95 target)
  • Periodic data re-ingestion from Snapshot.org to keep proposals current
  • Additional governance data sources (Tally) as connectors become available

Continued Arbitrum engagement:

  • The project serves as the technical artifact for my PhD dissertation on DAO governance (WSB University), ensuring continued development.
  • A second grant application (Governance Resilience Toolkit, $14,000, Education domain) has been submitted, building on this work with video education content and an IRL workshop at WSB University.
  • Open to collaboration with other Arbitrum governance tools that want to integrate the triage API.

Public good commitment:
This tool will remain open-source forever. No token, no paywall, no data monetization.


6. Additional Remarks

  • The entire project was built as a solo developer effort, demonstrating that meaningful governance tooling doesn’t require a large team or budget.
  • The deterministic approach (no AI/ML, explicit rules, full test coverage) was an intentional design choice - governance infrastructure should be auditable and predictable.
  • The video tutorials use AI-generated narration (ElevenLabs) and automated terminal recording (VHS by Charm), making them reproducible and easy to update as the API evolves.

Powered by Arbitrum. Arbitrum Everywhere.

2 Likes

As a governance researcher and delegate analyst, I find the triage + Delegate Fatigue Index approach very interesting. I have a few methodology questions:

What theoretical framework underpins the 5‑component fatigue formula, and how were the weights in fatigue_config.yaml calibrated beyond Arbitrum‑specific intuition?

Since the rulebook is presented as a reusable pattern for “any DAO”, have you considered external governance audit or cross‑DAO validation to surface bias or blind spots in the 21 rules?

You mention that “governance triage doesn’t need AI/ML” – have you benchmarked this deterministic approach against ML baselines to understand the trade‑off between interpretability and predictive power?
I’m exploring governance workload and delegate fatigue from a multi‑chain perspective (including Arbitrum) and would be keen to see how this API behaves across different governance environments over time. @wyszomirski

These are the right questions to ask of it. Taking them in order.

  1. Theoretical basis of the formula, and how the weights were set.

Each of the five components maps to a kernel theory. Volume and concurrency treat collective attention as a rivalrous commons (Ostrom). Burstiness and reading time come from the Fogg Behavior Model. Novelty comes from Cognitive Load Theory.

The weights - volume 40%, concurrency 25%, burstiness 20%, reading time 10%,novelty 5% - are theory-informed expert judgment. They are not fitted to data. I will say plainly: that is the weakest link right now, and I do not want tooversell it. Volume dominates because raw volume is the most common delegate complaint. No regression put it there.

The empirical weight does not sit on the weights. It sits on convergentvalidation against the NASA-TLX, on real delegates, per person, per vote. Empirical re-weighting (PCA on the components) comes after the pilot data. Icalibrate on Arbitrum intuition to start, and I do not claim it as proof.

  1. Cross-DAO validation and bias in the 21 rules.

Honest answer: validation so far is Arbitrum-only. The ex ante report runs all 21 rules over 399 historical Arbitrum proposals and checks false positives andnegatives per rule - critical rules fired with zero false positives, ~12% stayed uncategorized. That shows no systematic bias inside Arbitrum. It does not provethe rules travel.

Cross-DAO validation is an open, acknowledged limit. It also drove a design choice: the rulebook is versioned YAML rather than code, so another DAO forks it, sees every keyword, and recalibrates. The bias lives in plain sight - one round already removed generic keywords that caused 18 false positives. That audit works precisely because nothing hides inside a model. If you are running a multi-chain view, I would welcome a joint pass over another DAO’s proposals.

  1. Deterministic approach versus ML baselines.

A deliberate choice, and I will own the limits of it. In high-stakes governance a delegate needs to know why an item was flagged. Every score carries the rule IDs that fired - no black box. An explainable miss beats an unexplainable hit here.

“Governance triage doesn’t need AI/ML” is a claim about triage specifically, notabout ML everywhere. Prioritizing structured proposals - constitutional, treasury, security - is rule-solvable, and rules stay auditable. I did prototypean LLM layer, but for a different job: compressing proposals into dense decision memos rather than ranking them.

What I have not done is a formal head-to-head - precision and recall of rulesagainst an ML baseline on a labeled ground truth. You are right to flag it, and it is honest future work. The interpretability/predictive-power trade-off isreal. In this domain I chose interpretability on purpose, but I have not yet measured what it costs.

On multi-chain, over time. The API is public and open-source, so watching how itbehaves across governance environments is the kind of test I want it exposed to. If you are tracking delegate workload across chains, I would rather compare onshared data than in the abstract.

1 Like

the final report and the business/user metrics. From an Arbitrum DAO governance perspective, some key data points still feel missing, and I’d like to ask a few focused questions:

Can you share Arbitrum‑specific on‑chain metrics for this grant period – e.g. number of active wallets on Arbitrum, total transactions, and volume attributable to Chance on Arbitrum One/Nova, broken down by month?

Of the ~1,000 paid users and reported volume, how many are actually interacting on Arbitrum versus other chains, and what is Arbitrum’s share of total Chance activity today?

Have you published (or can you commit to publishing) a public dashboard that lets delegates track Arbitrum‑level impact over time (usage, retention, creator payouts, revenue) rather than high‑level business metrics only?

Looking at the grant budget, what is your own assessment of whether the spend is justified specifically for Arbitrum DAO – not just for Chance as a product – and what concrete KPIs would you propose for any future grant renewal?

As a governance researcher and multi‑DAO delegate, I’m trying to evaluate whether this spend is clearly net‑positive for Arbitrum as a chain, and right now the Arbitrum‑specific data feels incomplete. @wyszomirski

1 Like

Manoj, these questions landed in the wrong thread. Paid users, creator payouts, volume on Arbitrum One and Nova - none of that describes Participation Architecture. It reads like Chance.

PA is a $6,500 developer tooling grant from D.A.O. Season 3. No paying users, no revenue, no payouts. It is a rule engine that scores incoming proposals so a delegate knows what to read first.

Metrics that do apply:

Your dashboard question holds regardless of thread. There is a public per-delegate view at arbitrum.wyszomirski.online showing workload per vote, computed from Snapshot and Tally. It belongs to my PhD work rather than the grant deliverable, and adoption is thin - it went live recently and I am validating the index with delegates before pushing usage.

If you meant Chance, worth re-posting there so that team sees it.

Thank you for the clear final report and for the thoughtful, transparent replies in this thread, @wyszomirski. As someone interested in getting more involved in Arbitrum governance tooling and infrastructure, I found this project valuable.

The deterministic design — especially the versioned 21-rule rulebook and the auditable

Delegate Fatigue Index — stands out positively. I appreciate the honesty about the current limitations (Arbitrum-focused validation, theory-informed weights) rather than over claiming impact.

A few questions:

Have any governance dashboards, notification tools, or delegate aids shown interest in integrating the API endpoints (e.g., proposal feed with triage or fatigue metrics)?

Since the rulebook is designed as versioned YAML and forkable, are you open to community PRs for new rules or improvements? Any guidelines for contributions?

For active delegates - has the DFI (or the triage labels) proven useful in managing workload? Which component has been most insightful so far?

Thanks again for building and shipping this as a solo effort under the grant.

Thanks for the questions - they go straight at the weak spots.

Theory: cognitive load theory for the reading and novelty
components, commons depletion for volume and concurrency. The
derivation is in my dissertation chapter on the per-event unit.

Calibration: not done yet, and that is the honest answer. The
weights are reasoned, not fitted. Validating them is the current
work - delegates rate a specific vote on NASA-TLX, I compare that
against the index computed from their on-chain record. Three
think-aloud sessions so far, N=50 planned. If the index disagrees
with delegates, the index is wrong and I publish that.

Cross-DAO: deliberately postponed. The instrument has to hold on
one site before it travels. Picking the second site is the next
decision, and forum reachability of delegates decides it, not
proposal throughput.

ML baseline: no benchmark, and it is a deliberate trade. A
delegate has to see why a proposal scored high. A model that
predicts better but cannot say why is useless for the thing this
tool is for.

You work multi-chain - that is exactly the perspective I lack.
Worth a call?

Follow-up to my last reply - I answered the methodology thread
above rather than your three questions. Here they are properly.

Integrations: none yet. OpCo came up as the natural first
consumer, suggested by a delegate who saw the panel, but nothing
is running.

Community PRs: yes, the rulebook is YAML for exactly that reason.
Main branch carries the grant deliverable, so rule changes land
on a research branch first. If you want to add a rule, open an
issue with the case it catches and the proposals it would have
labelled differently - that is the part I cannot review without
examples.

Delegate usefulness - this is where I have fresh data. Three
delegates went through a think-aloud session in the last week,
rating one specific vote before seeing their score. Two called
the number accurate without knowing how it is computed; one
estimated his own within the range it produced.

Most insightful component: none of the five, as it turns out.
The useful part came from a delegate who flipped the framing -
he saw the index as a scheduling signal for whoever submits
proposals, not as a self-report for the person voting. Put two
heavy proposals in the same week and engagement drops.

Least useful so far: novelty, which came out at zero for all
three participants.

1 Like

@wyszomirski, your latest replies materially clarify the state of the work.

The three think-aloud sessions are useful formative evidence, and the scheduling interpretation raised by one delegate is not a side observation. It points to a second legitimate construct that should now be separated formally from the individual per-vote instrument.

I rechecked the current public implementation at source level, including:

  • the grant release on main;
  • feature/dfi-per-delegate-research;
  • the ecosystem and per-event fatigue calculations;
  • the Snapshot and Tally vote-history clients;
  • the API and persistence layer;
  • fatigue_config.yaml;
  • the current per-event tests.

I have not executed the live service or inspected the private NASA-TLX records, so the findings below concern the public implementation and the measurement architecture.

After reviewing both branches, I would not describe the issue simply as “the DFI is ecosystem-level.”

The project now contains two genuinely different instruments:

  1. the grant-release calculation on main, which measures shared ecosystem governance burden and produces the same result for every supplied address;

  2. the research-branch per-event calculation, which estimates workload for one specific delegate vote using proposal-specific reading/novelty terms and contextual terms derived from that delegate’s observed vote history.

Both may be useful.

The problem is that they currently share too much identity, terminology, persistence structure, configuration, and status language despite answering different questions.

The clean separation should be:

ECOSYSTEM GOVERNANCE LOAD
→ when is the governance environment congested?

DELEGATE EVENT WORKLOAD
→ how much observable workload surrounded one delegate’s specific vote?

NASA-TLX RESPONSE
→ how much workload did that participant report for that task?

SCHEDULING OUTCOME
→ did the timing and overlap of proposals affect engagement?

Those four objects should not be collapsed into one DFI narrative.

1. Give the two instruments separate identities

The original endpoint:

GET /delegates/{address}/fatigue

is explicitly ecosystem-level. The address does not participate in the calculation.

That calculation is better represented as an object such as:

GOVERNANCE_LOAD_INDEX

with an endpoint such as:

GET /governance/load

Its identity should be bound to:

  • DAO or governance space;
  • observation-window boundaries;
  • proposal-corpus manifest;
  • source completeness;
  • formula version;
  • configuration version;
  • computation time.

It should not be persisted separately under arbitrary delegate addresses.

The research endpoint:

GET /delegates/{address}/per-event-fatigue

is a different object. It is specific to:

  • one delegate;
  • one vote event;
  • one proposal stage;
  • one vote timestamp;
  • one historical evidence boundary.

That object should have a distinct name and schema, for example:

DELEGATE_EVENT_WORKLOAD_ESTIMATE

The scheduling interpretation from the think-aloud session fits the ecosystem-level object. The NASA-TLX comparison fits the per-event object.

This is not a reason to discard either calculation. It is a reason to stop asking one object to support two different construct claims.

The current LOW / MODERATE / HIGH / CRITICAL bands should also remain workload bands during validation.

The configuration currently associates the highest band with “burnout risk.” NASA-TLX measures task workload; it does not by itself establish burnout. A burnout claim would require a separate longitudinal outcome and measurement contract.

2. Close the historical look-ahead boundary

There is a concrete temporal-validity issue in the current per-event path.

The endpoint correctly:

  1. fetches the delegate’s vote history;
  2. selects a target vote;
  3. sets as_of to that target’s voted_at timestamp.

However, it then passes the complete currently retrieved history into compute_per_event().

Inside _compute_metrics(), the 7-day and 30-day windows are calculated from:

proposal.start

rather than:

vote.voted_at

There is no prior filter requiring every context vote to satisfy:

context_vote.voted_at <= target_vote.voted_at

This permits look-ahead contamination.

For example:

  • proposal B starts before target vote A;
  • the delegate votes on A;
  • the delegate votes on B several days later;
  • the API is later asked to reconstruct workload at vote A;
  • B can enter A’s historical context because B’s proposal start was before A, even though the delegate had not yet cast the B vote at the time of A.

The resulting historical DFI can therefore depend on information that was not yet present at the declared as_of boundary.

The per-event evidence set must first be frozen as:

context_votes = votes where voted_at <= target_vote.voted_at

Then the volume windows should be computed from voted_at if the intended metric is “votes per week/month.”

Proposal start and end should be used only for explicitly proposal-time concepts such as:

  • whether the proposal was available;
  • whether it was active;
  • whether multiple decisions overlapped.

They should not silently substitute for the delegate’s vote-event timestamp.

This requires a regression test in which a later vote concerns a proposal that began before the target vote. Adding that later vote must not alter the already frozen historical measurement.

The invariant should be:

same target event

  • same evidence available at target time
  • same instrument version
    = same measurement forever

3. Separate available governance load from revealed voting activity

The source comments correctly acknowledge that voting activity is endogenous.

That boundary deserves its own data model.

A delegate may face ten active proposals and vote on only two.

The two observed votes measure revealed engagement. They do not prove that the other eight proposals imposed no workload.

The reverse problem is also important: if heavy workload causes abstention or delay, using only completed votes as the context can reduce the measured workload precisely when actual burden is highest.

The per-event model should therefore preserve two separate context channels:

Available governance load

  • all proposals active or decision-relevant at the target time;
  • overlap and timing;
  • text volume;
  • proposal stage;
  • eligibility or expected responsibility where known.

Revealed delegate engagement

  • votes actually cast;
  • vote timestamps;
  • proposal stages encountered;
  • repeated or amended votes;
  • prior participation history.

The current calculation primarily uses the second channel but sometimes interprets it as the first.

Both are useful, but their absence and meaning are different.

A scheduling index should be driven mainly by available governance load.

A delegate-specific behavioral context may use revealed engagement, but it should be labelled as such and should not be treated as complete exposure.

4. Make Snapshot and Tally capability states explicit

The current research endpoint combines Snapshot and Tally histories, but the two source adapters do not currently produce equivalent evidence.

The Tally proposal query retrieves:

  • proposal ID;
  • title;
  • description;
  • start timestamp.

It does not retrieve the proposal end timestamp.

The transient Tally Proposal therefore has no end.

The concurrency calculation requires:

start <= as_of <= end

and substitutes zero when end is absent.

Consequently, Tally proposals cannot contribute to concurrent_active under ordinary positive timestamps, even when they were active at the target vote time.

That creates source-dependent scoring:

  • Snapshot decisions may contribute to concurrency;
  • equivalent Tally decisions may not.

Either Tally end-state evidence must be acquired and frozen, or concurrency for that source must be marked:

CONCURRENCY_UNAVAILABLE

It must not silently become zero.

There is a second source-boundary issue.

The clients currently return an empty list for several different conditions:

  • the delegate had no votes;
  • the API key is missing;
  • the provider failed;
  • GraphQL returned an error;
  • the request timed out;
  • the selected page contained no usable records.

These states are not equivalent.

A measurement should carry a capability record such as:

Snapshot:

  • COMPLETE
  • COMPLETE_TO_DECLARED_LIMIT
  • PARTIAL
  • UNAVAILABLE
  • NO_ACTIVITY_OBSERVED

Tally:

  • COMPLETE
  • COMPLETE_TO_DECLARED_LIMIT
  • PARTIAL
  • UNAVAILABLE
  • NO_ACTIVITY_OBSERVED

If Tally is unavailable and Snapshot succeeds, the system may still produce a Snapshot-bounded result, but the result must state that its evidence plane is partial.

If both sources are unavailable, the result is not “no votes found.” It is:

MEASUREMENT_BLOCKED_SOURCE_UNAVAILABLE

The current fixed retrieval limits also need a completeness state. A list containing exactly 200 records does not prove that 200 is the complete history.

5. Define cross-source governance-event identity

The implementation currently treats Snapshot and Tally records as a direct union because their proposal IDs differ.

That prevents literal ID collision, but it does not resolve semantic identity.

One governance initiative may have:

  • a forum discussion;
  • a Snapshot temperature check;
  • an off-chain election or poll;
  • an on-chain Tally execution proposal.

Those may represent separate cognitive tasks, or different stages of the same governance decision.

The system needs to record that relationship explicitly.

A useful model would contain:

  • governance_decision_id;
  • proposal_stage_id;
  • source;
  • source_proposal_id;
  • stage_type;
  • parent_or_predecessor_stage;
  • vote_event_id;
  • voted_at;
  • semantic_grouping_status.

Then the instrument can apply an explicit policy:

  • count each stage separately;
  • group stages into one decision;
  • treat the relationship as unresolved.

The current rule — different source IDs imply different workload events — is not sufficient as a semantic rule.

Snapshot vote records are also deduplicated by proposal ID. That means a changed or repeated vote can collapse into one proposal-level event.

The study should decide whether its task unit is:

  • one proposal encountered;
  • one final vote state;
  • every distinct vote submission;
  • one complete governance-decision lifecycle.

That decision must be frozen before validation.

6. Persist a real per-event measurement receipt

The per-event API response contains useful fields such as:

  • mode;
  • target proposal ID;
  • target title;
  • as_of.

However, the persisted FatigueSnapshot uses the same table as the ecosystem calculation and does not preserve:

  • measurement mode;
  • target vote ID;
  • target proposal ID;
  • source;
  • proposal stage;
  • exact vote timestamp;
  • exact context-vote set;
  • source capability states;
  • pagination state;
  • formula hash;
  • configuration hash;
  • implementation commit;
  • input-corpus manifest.

The stored component values and aggregate metrics are enough to display the previous result.

They are not enough to reconstruct or audit the exact evidence population that produced it.

The persistence model should create an immutable per-event receipt containing at least:

  • measurement ID;
  • instrument type;
  • instrument version;
  • delegate address or research participant pseudonym;
  • target vote-event ID;
  • source and proposal-stage identity;
  • target vote timestamp;
  • proposal text hash;
  • exact context-event IDs and timestamps;
  • available-load corpus hash;
  • Snapshot capability state;
  • Tally capability state;
  • configuration SHA-256;
  • implementation commit or artifact hash;
  • component inputs;
  • component outputs;
  • aggregate output;
  • creation time;
  • supersession state.

A deterministic measurement identity can be derived from:

instrument version

  • target vote-event identity
  • as-of boundary
  • context manifest
  • configuration hash
  • implementation hash

The same frozen inputs should resolve to the same measurement identity rather than create another scientific observation.

7. Stop using GET requests to create measurement history

Both fatigue GET endpoints currently insert a new database row during an ordinary read.

Therefore:

  • refreshing the page creates another snapshot;
  • repeated API calls duplicate the same measurement;
  • historical row count reflects client traffic as well as governance history;
  • arbitrary address queries create address-bound ecosystem records;
  • the same per-event result can be stored repeatedly without a new vote or new evidence state.

A public read request should retrieve a measurement, not manufacture its scientific history.

A cleaner boundary is:

  • an explicit measurement command, scheduled computation, or controlled study action creates an immutable receipt;
  • GET retrieves that receipt;
  • repeated retrievals are idempotent;
  • a genuinely changed source/configuration/instrument creates a new version that references the previous receipt.

If an on-demand calculation is required, it can remain computationally on demand while persistence uses an idempotent key. Repeating the same request must not create a new historical event.

8. Align metric names with what is actually measured

Several current metric labels and implementations describe different quantities.

Volume

The per-event configuration describes:

  • votes/week;
  • votes/month.

The engine counts:

  • proposals whose start lies in the 7-day window;
  • proposals whose start lies in the 30-day window.

Those are not the same metric.

Choose and name one explicitly:

  • delegate_votes_cast_7d;
  • delegate_votes_cast_30d;

or:

  • relevant_proposals_started_7d;
  • relevant_proposals_started_30d.

Do not call proposal starts delegate votes.

Burstiness

The current weekly baseline is:

proposals_30d / 4.33

The current 7-day numerator is already contained inside that 30-day denominator.

This is a contemporaneous ratio, not a clean comparison against a prior four-week baseline. It mechanically dampens the spike it is intended to measure.

If the construct is surprise relative to prior activity, use non-overlapping windows, for example:

current window:
[t - 7d, t]

baseline window:
[t - 35d, t - 7d)

Otherwise rename the component to describe the actual ratio.

Reading time

Word count is a defensible text-length or reading-load proxy.

It is not observed reading time.

Until actual reading behavior or a fixed reading-rate transformation is part of the instrument, the component should be named:

TEXT_LENGTH_LOAD

or:

ESTIMATED_READING_LOAD

Novelty

The per-event novelty component is currently a global keyword classifier.

It returns one only when:

  • at least one novel keyword is present;
  • no routine keyword is present.

Therefore, one routine keyword vetoes every novel signal. A proposal containing both “emergency security” and “report” can be assigned zero novelty.

More importantly, this measures a proposal’s keyword category, not novelty relative to a particular delegate.

A subject can be novel to one delegate and routine to another.

The fact that novelty was zero for all three sessions may indicate:

  • the three proposals were routine;
  • the vocabulary did not match;
  • a routine term vetoed a novel term;
  • proposal novelty is not delegate novelty.

Those possibilities are currently indistinguishable.

If the intended construct is personalized cognitive novelty, it needs:

  • a versioned domain taxonomy;
  • the delegate’s prior domain exposure;
  • relevant role or specialization evidence;
  • an explicit unavailable state.

Where prior exposure is unknown, the result should be:

DELEGATE_RELATIVE_NOVELTY_UNRESOLVED

The current keyword flag can remain as an ecosystem proposal-type feature, but it should not be interpreted as personalized novelty.

9. Freeze configuration and computation identity before N=50

The implementation states that weights come from YAML, but the human-readable FORMULA string remains hardcoded to:

40 / 25 / 20 / 10 / 5

If the YAML weights change, the returned calculation may use the new weights while the API still reports the old formula.

The formula shown in a measurement must be generated from the exact loaded configuration.

For research operation, configuration loading should also fail closed:

  • missing configuration must not silently fall back to defaults;
  • weights that do not sum correctly must not produce only a warning;
  • incomplete per-event references must not inherit another instrument’s values without an explicit version transition.

The configuration remains version 1.0.0 even though per-event reference values and a second instrument have been added.

At minimum, each study measurement should bind the exact configuration hash rather than relying only on the semantic version string.

The current Arbitrum medians are useful reference scaling.

They are not construct validation, which you have already stated correctly.

10. Separate formative work from confirmatory validation

The first three think-aloud sessions are valuable, but their proper role is formative:

  • test comprehension;
  • identify missing concepts;
  • detect wording and interface problems;
  • refine the instrument;
  • expose alternative uses such as scheduling.

They should not yet be treated as evidence that the numerical instrument is calibrated.

Before the N=50 phase, freeze or preregister:

  • instrument version;
  • component definitions;
  • weights;
  • reference values;
  • status thresholds;
  • source-capability requirements;
  • primary NASA-TLX outcome;
  • scoring method;
  • treatment of subscales;
  • exclusion and missing-data rules;
  • planned statistical comparison;
  • criteria for support, revision, or rejection.

If the instrument changes after participant 1, every response must remain bound to its exact version. Results from materially different versions should not be pooled as though they came from one instrument.

The anti-anchoring order already described is correct:

NASA-TLX first
→ DFI revealed afterward

That should remain a hard study invariant.

11. Clarify what N=50 can establish

If each of 50 delegates rates one vote, the study can estimate a cross-sectional relationship between:

  • one observed event-level index;
  • one reported task-workload result.

It cannot yet establish that the instrument tracks changes within the same delegate over time.

To make a longitudinal “per-delegate” claim, the design needs repeated observations:

  • multiple votes per delegate;
  • across different proposal types;
  • across different ecosystem-load conditions.

That allows separation of:

  • stable delegate differences;
  • proposal-specific effects;
  • temporal ecosystem effects;
  • measurement error.

If repeated measures are not feasible, the claim should remain:

cross-sectional per-event workload association

rather than:

validated individual fatigue tracking

Participant reachability also forms a selection boundary. Delegates who accept a 45-minute session may differ from delegates who are most overloaded and do not respond. That limitation should be preserved in the study result rather than treated as a minor recruitment detail.

12. Use the correct calibration method for the stated target

You previously mentioned empirical re-weighting through PCA.

PCA can be useful for exploring covariance and redundancy among the five DFI components.

It does not calibrate the instrument against NASA-TLX because PCA does not use the NASA-TLX outcome.

If the objective is:

determine which component weights best correspond to the external workload criterion

then the outcome must enter the calibration procedure.

With a small N, that should remain conservative:

  • preregistered rank correlation or regression;
  • regularization if weights are estimated;
  • participant-level cross-validation where repeated observations exist;
  • bootstrap confidence intervals;
  • clear separation between model development and final evaluation.

Do not search across weights, thresholds, NASA-TLX totals, and all subscales and then report the strongest association without a frozen primary endpoint.

PCA may remain an exploratory structural analysis. It should not be described as criterion calibration.

13. Treat the scheduling interpretation as a separate testable hypothesis

The delegate’s scheduling interpretation may become one of the strongest practical outputs of the project.

But:

two heavy proposals in the same week reduce engagement

is currently a plausible hypothesis raised during formative work, not yet an established result.

It can be tested directly using the ecosystem-load object.

For example:

ecosystem load at proposal launch
→ turnout
→ time to first vote
→ completion rate
→ abstention
→ quorum attainment
→ delegate coverage

That study should use all relevant proposals and fixed historical windows.

It is different from:

per-event delegate workload
→ NASA-TLX reported workload

Keeping the two validation paths separate would make both stronger:

Study A — Scheduling and governance congestion

Instrument:
GOVERNANCE_LOAD_INDEX

Outcome:
observable participation and timing behavior.

Study B — Individual event workload

Instrument:
DELEGATE_EVENT_WORKLOAD_ESTIMATE

Outcome:
task-specific NASA-TLX.

A scheduling result should not be used to validate individual fatigue, and an individual NASA-TLX correlation should not automatically validate proposal-timing recommendations.

14. Add boundary tests before freezing the study instrument

The per-event acceptance suite should include at least:

  1. A vote cast after the target event cannot change the target’s historical score.

  2. A proposal that started before the target but was voted on afterward is excluded from the target vote-history context.

  3. Snapshot and Tally representations of one governance lifecycle follow the declared grouping policy.

  4. A Tally proposal without an end timestamp produces CONCURRENCY_UNAVAILABLE, not zero concurrency.

  5. A missing Tally key is distinguishable from zero Tally votes.

  6. A Snapshot timeout is distinguishable from zero Snapshot votes.

  7. A retrieval result reaching the page limit is marked potentially truncated unless completion is proven.

  8. Repeated GET requests do not create duplicate measurement history.

  9. Ecosystem and per-event measurements cannot enter the same persistence row without an explicit instrument type.

  10. A persisted measurement can be reproduced from its frozen context manifest.

  11. Changing the YAML weights changes both the computation and displayed formula identity.

  12. A later configuration cannot silently reinterpret an earlier NASA-TLX record.

  13. Mixed novel and routine keywords follow an explicit precedence rule.

  14. The same frozen target event produces the same receipt after service restart.

  15. The original ecosystem-level calculation remains unchanged by per-event corrections.

Recommended closure order

I would close the current work in this sequence:

  1. Give the ecosystem and per-event instruments separate canonical identities.

  2. Fix historical filtering so every context event respects the target vote’s as_of boundary.

  3. Separate vote timestamps from proposal start/end semantics.

  4. Add explicit Snapshot and Tally capability/completeness states.

  5. Resolve Tally concurrency and cross-source lifecycle identity.

  6. Create an immutable per-event measurement receipt.

  7. Make measurement creation idempotent and keep GET read-only.

  8. Correct the volume, burstiness, reading-load, and novelty semantics.

  9. Freeze the configuration, implementation identity, and validation protocol.

  10. Run the N=50 study as a version-bound criterion test.

  11. Test the scheduling hypothesis separately against observable governance outcomes.

The highest-value next artifact is not another dashboard component.

It is one frozen, independently reproducible per-event measurement containing:

  • one exact target vote;
  • one exact historical evidence boundary;
  • complete source-capability states;
  • one context manifest;
  • one configuration hash;
  • one implementation hash;
  • one score receipt;
  • one NASA-TLX record collected before score disclosure.

Once that object can be reproduced exactly, the empirical study can determine whether the proposed instrument works.

Without that object, disagreement between DFI and a delegate cannot be localized: it may come from the theory, the weights, future-event leakage, incomplete source coverage, source asymmetry, or an unreproducible historical input.

The project is close enough that these boundaries can be closed without discarding the grant work.

The important next move is to freeze the identity of what is being measured before increasing the sample size.

Thanks for the questions. I owe you an answer to all three, plus a correction to what I posted on August 3.

Correction first. I wrote that if the index disagrees with delegates, the index is wrong and I publish that. Two defects have since been confirmed in the code. Context windows anchored on proposal start instead of vote time, so a vote cast later could change a past measurement. The on-chain client set no end timestamp, so concurrency scored zero for every contract vote. Both are fixed. After recomputing, the spread between my three participants fell from 22.6 points to 8.1. The wider spread I described earlier came from the defect, not from the delegates.

1. Patterns from the sessions. Two useful ones. The panel needed component definitions on screen - one delegate asked what burstiness meant while looking at it, so definitions are now visible without clicking. The second is a limit rather than a finding: participants saw the score before rating their own workload, so their agreement with it is anchored and I cannot treat it as validation. The protocol now collects NASA-TLX before the panel appears.

On whether it changed how they approached their workload, I have nothing. Three sessions of 30 minutes with no follow-up cannot answer that. It needs the pilot deployment and the N=50 round.

The scheduling idea you liked came from a delegate during a session, not from me.

2. Governance health. The hypothesis is delegate churn: whether frustration of psychological needs predicts a delegate going quiet for 60 days, measured on-chain rather than self-reported. Power analysis put the full version out of reach at N>300, so at N=50 it stays exploratory. The confirmatory core is narrower - does the index agree with what delegates report about a specific vote.

3. OpCo adoption. The useful unit is ecosystem load for proposers, not a per-delegate score on display. A published fatigue number per delegate invites pressure and gaming. A congestion reading on the governance calendar, visible before someone submits, is the version I would defend.

One prerequisite. The reference values are not calibrated, as I said in August. I now know the cost of that: under current settings two components sit at their ceiling for any active delegate, so half the scale is constant. Deriving reference values from the field distribution is the next piece of work.

Two asks. Do you vote yourself, or does OBA decide as a group? I run 30-minute sessions with individual delegates and I am two people short. If the answer is group, could you point me to individual delegates worth asking? Your read on who engages seriously is better than mine.

@cxclrfx - both of your first two points held up in the code. Thank you for reading the source instead of the API.

Look-ahead. The 7d and 30d windows anchored on proposal.start, and nothing required a context vote to satisfy voted_at <= target.voted_at. Adding one later vote to an otherwise identical history moved a score from 38.7 to 66.8. The whole spread across my three pilot participants was 22.6 points, so the defect was larger than the signal. The evidence set now freezes at the target vote and volume windows anchor on voted_at. Concurrency keeps start/end, as you said it should.

Source capability. The on-chain client set a proposal’s start to the block in which that delegate voted, and never set an end. Concurrency scored zero for every on-chain vote. It now reconstructs the window from ProposalCreated, and proposals whose window is genuinely unknown are excluded and counted, not skipped in silence.

Your remaining points stay open. The two instruments still share one identity, the CRITICAL band is still labelled burnout risk in config, and available load is still measured through revealed engagement. I can change the first two. The third needs a data model I do not have.

One result from the recomputation: the spread between my three participants fell from 22.6 to 8.1 points. Recovering concurrency did not widen it. Volume and reading time sit at their ceiling for any active delegate under the current reference values, so half the scale is constant.

wyszomirski, thank you for reproducing the two points directly in code and for publishing the quantitative effect of the corrections.

The result is important:

  • one future vote moved an otherwise identical historical score from 38.7 to 66.8;
  • that 28.1-point change was larger than the full original 22.6-point spread across the three pilot participants;
  • after correction, the spread fell to 8.1 points.

That means the temporal defect was not a minor implementation issue around an otherwise stable signal. It was large enough to dominate the observed variation.

The source-capability correction is also material. Reconstructing proposal windows from ProposalCreated, and excluding genuinely unknown windows explicitly rather than silently scoring them as zero, is the correct direction.

These two corrections should now change the evidentiary status of the first pilot.

The original three measurements should be retained as formative engineering and UX evidence, but not as validation evidence for the numerical instrument. The participants saw values produced by a temporally contaminated evidence set, with on-chain concurrency structurally suppressed, and the corrected scores materially differ from the scores originally observed.

I would therefore mark the original measurements explicitly as:

FORMATIVE_ONLY
SUPERSEDED_TEMPORAL_LEAKAGE
SUPERSEDED_SOURCE_WINDOW_ERROR
NOT_ELIGIBLE_FOR_CONFIRMATORY_ANALYSIS

The corrected instrument also needs a new measurement identity. At minimum, every result should bind:

  • instrument version;
  • implementation commit;
  • configuration hash;
  • source-adapter versions;
  • exact target vote-event identity;
  • evaluation boundary;
  • source-capability state;
  • predecessor version and correction reason.

Please link the exact public correction commit when it is pushed. The two permanent regression invariants should be:

  1. adding any vote with voted_at later than the target vote must not change the target measurement;

  2. adding or removing a record with an unknown proposal window must change the reported capability or coverage state, even if the numeric point estimate does not change.

There are three remaining issues in your reply that should not be treated as secondary.

First, “excluded and counted” is better than silent zero, but it still produces only a lower bound for concurrency. If relevant proposal windows are unknown, the output should expose the uncertainty rather than return one fully resolved score.

For example:

observed concurrency: 3
unknown relevant windows: 2
possible concurrency range: 3..5
coverage: partial

If that uncertainty can change the status band, the result should either be an interval or remain unclassified.

Second, the two instruments still need separate identities now, even before a complete personalized workload model exists.

You already have enough information to distinguish:

  • ecosystem governance load: all relevant proposal stages active at time t;
  • delegate revealed engagement: vote events actually submitted by that delegate before time t;
  • personalized delegate exposure: not implemented, because the required role and responsibility model is unavailable.

The third object can remain unresolved. The first two should not continue sharing one name, schema, persistence identity, or interpretation.

Third, the recomputation reveals a scale-identification problem.

If volume and reading time sit at their ceiling for every active delegate, then 50 points of the nominal 100-point scale are constant before the remaining components are considered.

That makes the LOW band unreachable for the target population and means the effective ranking is controlled by a much smaller part of the formula than the published weights imply.

Before adding participants, publish a component-distribution diagnostic over an independent historical development corpus:

  • minimum and maximum;
  • median and quartiles;
  • percentage at zero;
  • percentage at one;
  • variance;
  • pairwise correlation;
  • contribution to final-score variance.

If a component is saturated, it is not contributing measurement information, regardless of its nominal weight.

The reference values should then be derived on a development corpus and frozen before the N=50 criterion study. The same observations should not be used both to define the scale and to validate it against NASA-TLX.

One more identity issue should be closed while the temporal fix is being implemented: the unit of analysis must be a vote event, not only a proposal ID. A delegate can submit or change more than one vote on the same proposal. Proposal-level deduplication can replace an earlier vote with a later one before the historical filter is even applied.

The canonical target therefore needs a unique vote-event identity bound to source, proposal stage, delegate, timestamp, choice, and block or Snapshot event identity.

There is also a broader distinction that should remain clear.

Your reply correctly addresses the first two public findings in the DFI research branch. It does not close the wider release-level review of ingestion completeness, rule reachability, validation claims, reporting logic, and operational acceptance. I completed that review separately and sent it privately through the governance channel for careful handling.

So the current status is:

  • the look-ahead defect is confirmed and the proposed correction is directionally correct;
  • the source-window defect is confirmed and the proposed correction is directionally correct;
  • the original three pilot measurements are superseded as validation evidence;
  • the two measurement instruments still require separation;
  • the current scale remains insufficiently identified because major components are saturated;
  • the broader tagged-release findings remain open and separate from this DFI correction.

The most useful next artifact would be one correction receipt for the three formative cases showing:

  • old and corrected score;
  • old and corrected component vector;
  • target vote-event hash;
  • source-capability state;
  • unknown-window count;
  • saturation flags;
  • instrument version;
  • implementation commit;
  • validation eligibility: FORMATIVE_ONLY.

That would show exactly how much of the original spread came from temporal leakage, missing concurrency, saturation, and actual event variation.

The two fixes are real and important. The deeper result is that the defect was larger than the observed signal, and the corrected scale currently has too little effective range to support the intended interpretation.

Closing that boundary before collecting more participants will make the eventual instrument substantially stronger.

Thank you for the thorough response and for the transparent correction regarding the earlier defects.

A few observations on the points you raised:

1. Session Insights

The practical adjustments — making component definitions visible by default and collecting NASA-TLX ratings before revealing the score — are sensible improvements. The limitation you noted regarding the small sample size and lack of follow-up is also fair. Meaningful insight into whether the tool changes actual workload behaviour will require the planned pilot and larger N=50 round.

2. Governance Health

Framing the longer-term question around on-chain delegate churn is a clear and measurable hypothesis. Even if full predictive power requires a larger sample, the narrower confirmatory test (agreement between the index and delegates own ratings of a specific vote) appears well-scoped and achievable in the near term.

3. Adoption Path

I share the view that presenting the output as an ecosystem-level congestion or calendar load signal — rather than individual delegate fatigue scores — is the more constructive direction. This approach reduces the risk of pressure or gaming while still providing practical coordination value for proposers and operational teams.

The observation that two components currently sit at ceiling under existing reference values is useful. Deriving those reference values from the actual field distribution seems a logical and necessary next step before wider use.

Regarding your question on voting: I follow Arbitrum governance primarily as an observer and occasional contributor rather than as an active voting delegate.

Thank you again for the continued openness and iterative approach. Looking forward to further updates as the validation work progresses.

Update on the private review forwarded through @arb_junior.

I verified all fourteen findings against the code at v0.1.0 before changing anything. All fourteen hold. Nothing in that review was overstated, and two of them were worse than described.

All fourteen are now fixed on main:

2a212a5  acquisition: state filter, pagination, content refresh (Z1-Z3)
3ccec0c  requested amount extracted; a missing amount reports itself (Z4)
2d0e68f  default rule counts classifying labels only (Z5)
5c17fe8  evaluation time is an input; audit records outcomes (Z6, Z7)
390625e  rulebook, health and container startup fail closed (Z8, Z12-Z14)
a9d7cc1  validation and report stop treating zero as evidence (Z9-Z11)
64a329f  independent ground truth: measured sensitivity (Z9)

Four things I want to state plainly.

The report claim was the worst of them. generate_pdf_report.py took the number of times SEC-001 fired, printed it in a cell labelled “False Positives” with a hardcoded “None” status, and turned zero firings into “Rule correctly identifies only active security incidents”. The rule requires a non-closed proposal and the ingestion only ever fetched closed ones. Zero was structural. That conclusion had no support in the data.

Fixing acquisition did not make the rule evaluable. All 415 Snapshot proposals in this space are currently closed, so eligibility is still zero. Validation now prints NOT EVALUABLE instead of a checkmark. Establishing accuracy for SEC-001 needs a corpus containing open proposals.

Z9 is closed, and the answer is not flattering. I labelled a stratified sample of 49 proposals by hand, blind to the rule output, then compared:

category    TP  FP  FN  TN   sensitivity  precision
incident     0   0   0  47          n/a        n/a
protocol     2   0   3  42         0.40       1.00
treasury    16   1  17  13         0.48       0.94

The treasury rule misses more than half the proposals that request funds. The protocol rule catches two in five. When they fire they are almost always right, and they fire far too rarely. The rules are conservative in a way nobody had measured, because they were being measured against their own output.

The published report asserted accuracy from zero firings. Measured sensitivity is 0.40 and 0.48.

Limits of that number: one annotator, so there is no agreement measure and I cannot separate labelling error from rule error. The annotator had worked on these rules, so anchoring is possible despite the blind procedure. Two items were marked uncertain and excluded rather than guessed. A second independent pass is prepared on the same sample and seed.

Three of your findings were my own defects, twice. Silence indistinguishable from failure, evaluation time outside the measurement identity, health asserted rather than measured. I had fixed the same three patterns on the research branch earlier the same day, without noticing they also sat in the released code.

I am not asking you to re-review. If you do look, the acquisition receipt and the audit trail are where I would expect what remains.

@wyszomirski Thank you for the thorough and transparent update.

I appreciate that you verified all the findings against the original release, confirmed them, and moved quickly to fix the full set on main. The clarity around the report generation issue and the decision to replace unsupported accuracy claims with measured results is particularly important.

The independent labelling exercise and the sensitivity numbers you shared (0.40 and 0.48) provide a much clearer picture of current rule performance. It is useful to see both the strengths (high precision when rules fire) and the limitations (low sensitivity) stated openly.

This kind of direct response to technical scrutiny strengthens confidence in the ongoing development of the project.