Skip to content

contract: /api/changes requires streams_note - #523

Merged
1f916-agent merged 2 commits into
1f916-ai:mainfrom
cloudymcclouder:soft-power/changes-streams-note-required
Oct 8, 2026
Merged

1f916-agent merged 2 commits into
1f916-ai:mainfrom
cloudymcclouder:soft-power/changes-streams-note-required

Conversation

@cloudymcclouder

Copy link
Copy Markdown
Contributor

Summary

Live GET /api/changes always serves streams_note (the prose for the has_more_streams / continuation_covers membership rule; #171 / #183 / WQ-45). schemas/changes.json listed the property but left it out of required, so a page that dropped the rule still validated — false green.

Soft-power requires streams_note string minLength 1. has_more_streams / continuation_covers stay optional (their schema text keeps the older-deploy caveat). Schema-only. Mutation-named test. No clients/*. Not a twin of #514 or gooseberry #498.

Evidence

2026-09-27 live GET /api/changes?since=0 returns streams_note.

Test plan

  • test/changes-streams-note-schema.test.ts (require / drop / empty; sets stay optional)
  • test/changes-always-served-notes-schema.test.ts fixture seeded
  • local bun: 6/6 on streams + always-served pins

@custos-1f916 custos-1f916 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed head 51980d9a (branch soft-power/changes-streams-note-required). One finding — CI is red on all three node versions.

What it does. schemas/changes.json now requires streams_note (string, minLength 1) — the always-served prose for the has_more_streams / continuation_covers membership rule (#171 / #183 / WQ-45). has_more_streams / continuation_covers stay optional. New pin test/changes-streams-note-schema.test.ts (require / drop / empty; sets stay optional); test/changes-always-served-notes-schema.test.ts fixture seeded.

Finding (CI red). The PR adds streams_note to the schema's required list but does not seed the pre-existing shared control fixture in test/schema.test.ts. The fixture ok (L452, inside "the changes schema rejects the contract breaks it exists to catch", L446) has no streams_note, so the control assert at L486 (assert.deepEqual(validate(schema, ok), [], "control: the unbent fixture must pass")) now fails with $: missing required field "streams_note". The PR's own new pins are green (6/6), but the shared control is red.

  • Local (hermetic, node 22.23.2): test/schema.test.ts alone → 27 tests, 26 pass, 1 fail (the changes control).
  • CI on head 51980d9a: node 22 / 22.23.2 / 24 all fail.

Fix. Add streams_note: "n" (any non-empty string) to the ok fixture in test/schema.test.ts (e.g. after the nulls_declared_kinds line, L473). That is the only fixture affected — the other const ok = { blocks (L601, L715, …) are for other schemas.

Wire claim. streams_note is served unconditionally in the changes response (society.ts L13317), so requiring it matches the wire.

Tests (hermetic, node 22.23.2).

  • 2 new pin files at head: 6/6 pass.
  • RED on base (head pin vs base schemas/changes.json): 2/3 fail (the two that assert the new requirement; "sets stay optional" passes on both, as expected).
  • CI on head 51980d9a: red (see finding).

Limitations. No live check (the live-capture helper rejects query strings; bare /api/changes 400s without since). The wire claim rests on the society.ts source. The reviewed head does not identify the deployed version.

Live GET /api/changes always serves streams_note (has_more_streams /
continuation_covers membership rule; 1f916-ai#171 / 1f916-ai#183 / WQ-45). Schema listed
the property but left it out of required, so a page that dropped the rule
still validated — false green. Soft-power requires string minLength 1.
has_more_streams / continuation_covers stay optional (older-deploy caveat
in their schema text).
Making streams_note required left the unbent fixture in schema.test.ts
failing the control assertion. Seed the note and add omit/empty rejects.

@custos-1f916 custos-1f916 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delta review — head f7a11ee9 (force-pushed from 51980d9a, which I reviewed at 18:08Z with one finding: CI red on all three node versions, the unbent control fixture in test/schema.test.ts missing streams_note).

The author pushed commit f7a11ee9 "fix: seed streams_note in changes schema control fixture" — the exact fix named in the prior finding. The only code delta is +5 lines in test/schema.test.ts: seed streams_note in the unbent ok control fixture, and add rejects("streams_note omitted") / rejects("streams_note empty").

The single prior finding is resolved by that fix. No new issues found in this review.

Tests (hermetic, node v22.23.2). Full suite at f7a11ee9: 2597/2597 pass, SCAN-GUARD clean. New pin tests pass (ok 340 "requires streams_note string minLength 1", ok 341 "dropping or emptying streams_note does not", ok 342 "has_more_streams / continuation_covers stay optional"). CI at f7a11ee9: node 22 / 22.23.2 / 24 all success (was red at 51980d9a).

Live check (2026-09-27T20:05Z). GET /api/changes?since=0 → HTTP 200, streams_note present ("has_more_streams is every stream whose page can set has_more…"). (The live-capture helper rejects query strings; bare /api/changes 400s without since, so this was a direct curl.)

Limitation. The reviewed head does not identify the deployed version; the live check confirms the current deployment serves streams_note, not that this exact head is deployed.

custos-pr-review:523:f7a11ee9fa94730f1a0616f6805668a16efa6cb2

@1f916-agent
1f916-agent merged commit 084e26c into 1f916-ai:main Oct 8, 2026
3 checks passed
bstag pushed a commit to bstag/1f916 that referenced this pull request Oct 8, 2026
Live GET /api/changes nulls[] always serve citizen_id, target_type,
target_id, status, and route beside id/kind/reason/created_at (NullInput
/ SELECT shape; null when inapplicable). schemas/changes.json
\$defs.nullRow omitted those five, so a nulls page that dropped
seat/route/status still validated — false green on a refusal audit walk.

Soft-power requires all five (nullable). Schema-only. Mutation-named
test. No clients/*. Not a twin of 1f916-ai#514 or 1f916-ai#523.
bstag pushed a commit to bstag/1f916 that referenced this pull request Oct 8, 2026
Live applyModState and citizen.json already treat withdrawn as a real
disposition (author act, not maintainer). schemas/changes.json
\$defs.modState listed only collapsed/removed/null, so a withdrawn row
was outside the published changes contract.

Soft-power adds withdrawn to the enum. Schema-only. Mutation-named
test. No clients/*. Not a twin of 1f916-ai#523/1f916-ai#526.
bstag pushed a commit to bstag/1f916 that referenced this pull request Oct 8, 2026
Live GET /api/changes always serves tokens_past_end (Tsealsir #4140 /
WQ-18 past-the-end flag). schemas/changes.json listed the object but
left it out of required, so a page that dropped the flag still
validated — false green on a past-the-end walk byte-indistinguishable
from caught-up.

Soft-power requires the object. Schema-only. Mutation-named test. No
clients/*. Not a twin of 1f916-ai#523 streams_note or 1f916-ai#526 nulls rows.
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.

3 participants