Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 9 additions & 24 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ When an item from this page is done and no longer needs an LLM implementor's att

----

- Align `foldReimbursements` donation rounding with the contract’s per-share
accumulator (`accumulatedReimbursementPerClaimShare` / `mulDiv`). The fold
currently splits each donation with per-holder `claim * amount / outstanding`
integer division, then subtracts the full donation from `outstanding`, so UI
forgo/withdrawable caps can disagree with on-chain views by leftover wei.
Mirror the contract (scaled accumulator, or live view reads) and add a
remainder-aware test with two holders and a donation that does not divide
evenly. Found in review of `feature/combinator-operand-nonblocking-load`.

- **(Tell)** Refresh `data/seed-implication-evaluations.original-variants.json`
against the current implication-attester prompt fingerprint. The prompt now
rejects nested-place geographic rollup (Grey County → Ontario is a worked
Expand All @@ -22,13 +31,6 @@ When an item from this page is done and no longer needs an LLM implementor's att
remains deferred per
[belief-implication-board-inclusion-and-discovery.md](specs/product/belief-implication-board-inclusion-and-discovery.md).

- **(Ask)** Statement-generation exercise 2: abortion cutoff triple is in [`fake-data-generation/statement-generation-exercises/02-compromise-abortion.json`](fake-data-generation/statement-generation-exercises/02-compromise-abortion.json); modified-right was thickened after the attester refused the old text. Next: confirm attester blesses both modifieds, run `/critique-triple`, then Adam accept/reject before `seed-content/`.

- **(Tell)** After folding CauseStarter into `ui/src/causestarter/`, leftover package
glue still talks as if `causestarter/src` is the SPA: `causestarter/vite.config.ts`
is unused, Compose/Docker docs mix `:8090` and `:5174`, and some verifier prompts
may still cite deleted paths. Sweep when touching local-dev docs.

- Add a fresh-stack integration test for the alignment-trust bootstrap: publish
an alignment vouch from a previously unknown wallet, observe the service's
`TrustSet(..., 100)`, confirm a wallet with no personal graph sees that vouch
Expand All @@ -55,20 +57,3 @@ When an item from this page is done and no longer needs an LLM implementor's att
- Verify the new local public-goods demo-seed storyline against a live stack. `PROJECT_SEED_METADATA[0]` is now "Riverside Community Garden" (aligned to `fundable-projects`/`local-community`/`local-food-systems`), `DETERMINISTIC_SEED_PROJECT_ALIGNMENT_COUNT` is 6 so no existing storyline lost its alignment, and `gen:seed:local` runs 12 users to keep the success-attester pool satisfied. Unit tests pass, but the seed has still never been run end-to-end: `stack.fresh-seeded` now passes (2026-08-03) but it seeds `tiny`, not `demo`. Run `./scripts/data.sh --wipe && ./scripts/data.sh --seed=demo` and confirm in the UI that the garden project shows an alignment vouch, contributions, and a success attestation. Consider also regenerating `data/seed-worker-outputs.json` if the Explorer fixture should mention the new cause.

- Give the demo seed (`./scripts/data.sh --seed=demo`) more **local public-goods** coverage. One storyline now exists (see above), but rows A5 (federated regional) and E2 (nonprofit on the rails) in [use-cases.md](specs/product/use-cases.md) are still not demonstrable — and those are exactly the cases the strategy docs lean on hardest. Note also that the project-creation form ships "Community garden" / "Clean water" / "Learning circle" stock images that nothing in the seed uses. Found 2026-07-25 while verifying use-case statuses against the live UI.

- Stop combinator operand reads from holding up the whole statement page. Both
`causestarter/src/pages/StatementPage.tsx` and
`ui/src/conceptspace/pages/StatementPage.tsx` fetch every operand body of a
combinator statement *before* clearing `loading`, so one slow IPFS read leaves the
reader staring at a spinner even though the statement's own content already
resolved. Paint the statement first and let the operand bodies fill in (they
already fall back to showing the CID), rather than blocking on `Promise.all`.
Found 2026-08-19 reviewing the combinator-statements branch.

- Guard the rest of `ui/src/conceptspace/pages/StatementPage.tsx`'s loader against
navigation. The operand fetch now checks a load token before writing, but the
earlier `setStatement` / `setStatementContent` / `setContentStatus` / metrics /
`setUserBeliefState` writes are still unguarded, so a slow load that resolves after
the user has moved to another statement can paint stale content. Pre-existing, not
new to the combinator work; the same pattern is worth a sweep across the other
conceptspace pages. Found 2026-08-19.
12 changes: 11 additions & 1 deletion cause-assist/src/bridgeClusterAssist.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,19 @@ describe('bridge cluster wording verbs', () => {
assert.match(request.systemPrompt, /Do not rewrite/)
assert.match(request.systemPrompt, /routing:/)
assert.match(request.systemPrompt, /shape:/)
assert.match(request.systemPrompt, /Containment is the intended modified → bridge relationship/)
assert.match(request.systemPrompt, /Never call a bridge "decorative"/)
assert.match(request.systemPrompt, /Semantic containment expressed in genuinely camp-specific prose is the desired shape/)
assert.match(request.systemPrompt, /Parent\/natural → modified is intentionally a nudge, not an implication/)
assert.match(request.systemPrompt, /Distilling that committed conclusion from the surrounding reasons is legitimate implication/)
assert.match(request.systemPrompt, /first-person willingness to accept a non-ideal policy/)
assert.match(request.systemPrompt, /arrays contain failures only/)
assert.match(request.userPrompt, /parent_planks/)
return {
objections: ['Shared plank requires a theological premise.'],
objections: [
'routing: This is the intended shape and is not an objection.',
'Shared plank requires a theological premise.',
],
leakWarnings: ['God-talk leaked into the bridge plank.'],
} as T
})
Expand Down
21 changes: 18 additions & 3 deletions cause-assist/src/bridgeClusterAssist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,24 +153,39 @@ export const critiqueTripleStrategy: StatementStrategy<

Also apply the implication-vs-nudge routing test. For each modified plank → bridge plank: if a reasonable signer of the modified would be annoyed at being asked to explicitly sign the bridge ("I already said that"), the pair should be an implication (containment). If they would not be annoyed, the modified does not contain the shared claim yet — object. If they would be annoyed but a different reasonable person would see a real extra claim in the bridge, do not treat that as containment; object that the pair is a nudge (or that the wording hides the delta), not an implication. Unreasonable annoyance is not a reason to bless an arrow.

Containment is the intended modified → bridge relationship, not an objection. Each modified is supposed to contain its camp's reasons plus the thinner shared conclusion, while the bridge states only that shared conclusion. Never call a bridge "decorative" or object merely because either or both modifieds semantically contain or restate it; that is a successful triple. Object only when containment is absent, or when apparent containment was manufactured by copying the same shared sentence nearly verbatim into both modifieds. Different camp-specific prose that commits to the same conclusion is not subset-by-concatenation.

A thinner bridge conclusion will normally be embedded in longer, camp-specific modified prose. Distilling that committed conclusion from the surrounding reasons is legitimate implication, not "selective quotation" or a nudge. Apply signer annoyance to what the signer substantively committed to, not whether the bridge appeared as a standalone sentence.

For compromise-in-the-middle bridges, first-person willingness to accept a non-ideal policy and a desire to settle the dispute are substantive shared beliefs and may be signable parts of the bridge. Do not confuse those with a coalition caption. Coalition captions comment on the camps or their differing reasons (for example, "we come from different places"), rather than stating what the signer accepts or wants.

Parent/natural → modified is intentionally a nudge, not an implication: the modified must add the proposed compromise while reaffirming that camp's parent position. Do not object because a parent does not already contain the compromise, and do not apply the signer-annoyance test from a parent directly to the bridge. Object only if the parent itself already contains the compromise (making the modified layer decorative), or if the modified adds the compromise without preserving/reaffirming its parent's position.

Shape failures the attester will not catch (prefix with "shape:"):
- Identical or near-identical shared sentences pasted into both modifieds so subset fires (subset-by-concatenation). A bless is necessary, not sufficient.
- Identical or near-identical shared sentences pasted into both modifieds so subset fires (subset-by-concatenation). A bless is necessary, not sufficient. Semantic containment expressed in genuinely camp-specific prose is the desired shape and must not be flagged.
- Shared plank still one camp's rant with the other camp's theology deleted, or a coalition caption ("we come from different places," commentary on whose reasons or maximalism).
- Multi-register or too long to sign as a paragraph.
- Parent/natural already contains the shared claim (triple decorative), or the modified introduces a civic program the parent never held without reaffirming the rest of the bundle (withhold-from-natural / belief jump).

${MEDIATION_RULES}

Return JSON only: {"objections":["..."],"leakWarnings":["..."]}. Empty arrays mean you found nothing load-bearing to flag. Prefix routing failures with "routing:" and shape failures with "shape:".`,
Return JSON only: {"objections":["..."],"leakWarnings":["..."]}. The arrays contain failures only, never successful-check commentary or affirmations. If an analysis concludes "this is intended," "not an objection," or "no failure found," omit it. Empty arrays mean you found nothing load-bearing to flag. Prefix routing failures with "routing:" and shape failures with "shape:".`,
renderInput: (input) => ({
modified_planks: input.modifiedPlanks,
bridge_plank: input.bridgePlank,
parent_planks: input.parentPlanks ?? [],
}),
normalize: (value) => {
const record = value && typeof value === 'object' ? value as Record<string, unknown> : {}
const actualObjections = stringList(record.objections).filter((objection) => {
const normalized = objection.toLowerCase()
return !normalized.includes('not an objection')
&& !normalized.includes('no routing failure')
&& !normalized.includes('no shape failure')
&& !normalized.includes('no failure found')
})
return {
objections: stringList(record.objections).slice(0, 12),
objections: actualObjections.slice(0, 12),
leakWarnings: stringList(record.leakWarnings).slice(0, 8),
}
},
Expand Down
2 changes: 1 addition & 1 deletion cause-assist/src/coherenceClaim.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { ROSTER_COHERENCE_CLAIM, ROSTER_COHERENCE_TOPIC } from './coherenceClaim

describe('coherenceClaim well-known CIDs', () => {
it('matches causestarter pinned roster coherence topic and claim', () => {
// Keep in lockstep with causestarter/src/lib/causeRoster.test.ts
// Keep in lockstep with ui/src/causestarter/lib/causeRoster.test.ts
assert.equal(
ROSTER_COHERENCE_TOPIC,
'bafkreigcuduguak3tvfltu56ggksxheukrqtbvf22zntpb7uibbpni27zm',
Expand Down
2 changes: 1 addition & 1 deletion cause-assist/src/coherenceClaim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Well-known topic/claim CIDs for roster coherence badges.
*
* Must stay pinned to the same PublishedData CIDs as
* causestarter/src/lib/causeRoster.ts (ROSTER_COHERENCE_TOPIC / CLAIM).
* ui/src/causestarter/lib/causeRoster.ts (ROSTER_COHERENCE_TOPIC / CLAIM).
* Subject on chain is the roster document CID digest; claim/topic are these.
*/
import type { IpfsCidV1 } from '@commonality/sdk/utils'
Expand Down
2 changes: 1 addition & 1 deletion causestarter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ See [`cause-assist/README.md`](../cause-assist/README.md). Bridge-cluster wordin
- **Alignment is per statement.** The fundable-projects dashboard is inlined on
the statement page (`/statement/:cid`) and, as a union of planks, on the
cause page. `/statement/:cid/board` redirects to the statement.
- **Cause store** (`src/lib/causeStore.ts`) keeps planks in `localStorage` so
- **Cause store** (`ui/src/causestarter/lib/causeStore.ts`) keeps planks in `localStorage` so
unpublished wording survives reloads.
- On-chain actions reuse the same SDK functions the main UI uses
(`createAndSignStatement`, `browseStatements`, `believeStatement`, …).
Expand Down
14 changes: 0 additions & 14 deletions causestarter/index.html

This file was deleted.

29 changes: 0 additions & 29 deletions causestarter/tsconfig.app.json

This file was deleted.

6 changes: 1 addition & 5 deletions causestarter/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
"extends": "./tsconfig.node.json"
}
2 changes: 1 addition & 1 deletion causestarter/tsconfig.node.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts", "vitest.config.ts", "eslint.config.js"]
"include": ["playwright.config.ts", "eslint.config.js", "e2e"]
}
173 changes: 0 additions & 173 deletions causestarter/vite.config.ts

This file was deleted.

Loading
Loading