Skip to content

Repair plan Phases 2-3: signed intents by identity, KPI and notifier truth, docs truth pass, v1.2.0 - #2

Merged
QuietFireAI merged 8 commits into
mainfrom
phase2-2026-10-14
Oct 14, 2026
Merged

QuietFireAI merged 8 commits into
mainfrom
phase2-2026-10-14

Conversation

@QuietFireAI

Copy link
Copy Markdown
Owner

Phases 2 and 3 of the repair plan (owner decisions D1, D2, D5-D10, 2026-10-14: all as recommended).

Code

  • D2: signed intents are declared by the identity in routes.json (signed_intents). The core hard-codes only config.update plus the .authority suffix. A declared name no route carries is refused at load, and so is a wildcard name. dispatcher/spokes.py moved to demo/.
  • Sequence KPI: walks the log in order. A return to 1 counts as a restart only after a hub boot (hub.boot, the first line every hub writes). A duplicate, a jump, or a context still routed after release counts as a gap. A transfer's high-water mark applies where the transfer lands.
  • Notifier: nothing is posted while a credential is empty or a placeholder, or while the destination or sending number is in the 555-0100..0199 fiction block. Text messages carry no free text.
  • notifier.unarmed and verifier.unarmed are declared at boot; before, neither mode said anything.
  • D6: territories are experimental; four limits are pinned by tests.
  • D7: the MANNERS N=10 backstop is NOT IMPLEMENTED in the core. listing-assistants now fires it.
  • File handles are closed; baseline-out/ is untracked.

Docs

  • README "What runs in listing-assistants today" table (D5).
  • Pillar wording, EVIDENCE rows, and a complete stand-in and placeholder inventory in docs/TUNING_MANUAL.md.
  • CONTRIBUTING points at LICENSE (D9); pyproject 1.2.0 (D8).
  • tests/test_doc_counts.py holds the stated test counts, including the skip count, to the suite.

Gate

  • Two cold reviews by a separate agent (11 findings, then 4); all fixed.
  • Full mutation sweep: 995 mutants, 983 killed, 1 timeout. Run 19 re-swept the three files changed afterwards. The survivors are 2 equivalent, 1 CPU-only and 8 on Windows-only lines (findings/MUTATION_SWEEP_2026-10-13.md).
  • Fresh clone: 368 passed with the listing identity; 362 passed + 6 skipped alone. CI green on 5cbd395.

Merge order: this first, then listing-assistants phase2-2026-10-14, then re-run core main CI. The with-identity job clones listing main, which declares signed_intents only after the listing merge.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR


Generated by Claude Code

…leave the core package

Owner decision D2 (2026-10-14, as revised 2026-10-13).
- The core no longer hard-codes listing-assistants' listing.change.authorized.
  AUTHORITY_INTENTS is {"config.update"}; the .authority suffix rule stays.
  An identity names any other signed intent in routes.json under
  "signed_intents" (Routes.signed_intents); the hub requires a signature on
  those. A declared intent that is not on the track refuses to load, so a
  misspelling cannot leave the real intent unsigned.
- dispatcher/spokes.py (listing demo agents) moved to
  demo/listing_demo_spokes.py; the P11 demo and its tests import it there.
- Stays in core, as decided: the JEV boot declaration, the WhatsApp
  notifier, the confidence_underflow queue.
- tests/test_signed_intents_declared.py (4): the core names no identity's
  intent; declared needs a signature, undeclared does not; a misspelt
  declaration refuses to load; the real listing identity declares
  listing.change.authorized and an unsigned one is rejected (fails against
  a listing routes.json without the declaration - shown).
- The test fixture identity declares listing.change.authorized.

348 passed with the listing identity (its branch declares the intent);
342 passed + 6 skipped alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
…al with their limits pinned

2.4 (from the 2026-10-13 snapshot, #15):
- baseline-out/ was in .gitignore yet four files were tracked (the demo
  rewrote one on every run); untracked. demo/baseline_run.py regenerates it.
- Routes, the loader and the signer registry closed none of the files they
  read; now with-blocks.
- Sequence-gap KPI: a context starting over at 1 (a bare core restart) is
  a restart (new KPI sequence_restarts), and a context received by
  territory transfer continues after its high-water mark. Both used to
  count as gaps.
- The core SMS/WhatsApp text: queue, agent, context and wait id only - the
  record's free text can carry a client's words.
- The core notifier posts nothing while the Twilio credentials are the
  placeholders, and says so (status failed, "Twilio not configured").
  Before, every escalation posted to Twilio and got a 401, and one test
  depended on reaching Twilio over the network; it now checks that nothing
  is sent. Tests that capture the request set test credentials.
(Two other 2.4 items landed in Phase 1: the loader's assert, and the
after-action report scoped to its run.)

D6 (owner, 2026-10-14): dispatcher/territory.py is marked EXPERIMENTAL and
lists its limits; tests/test_territory_limits.py (3) pins each (replayed
transfer sets the sequence back; holds, dedupe and loop counts stay with
the sender; the sender's queue items stay after release).

352 passed with the listing identity; 346 passed + 6 skipped alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
- Every stand-in, unarmed mode and placeholder in the core listed in
  docs/TUNING_MANUAL.md, taken from the code (owner instruction 2026-10-14).
- A hub with no human notifier declares notifier.unarmed at boot; it was
  the one unarmed mode that was silent.
- MANNERS N=10 turn backstop relabelled NOT IMPLEMENTED (D7); notifier
  docstrings no longer describe the old 401 behaviour.
- tests/test_doc_counts.py: the counts in README, SKILL.md and
  PILLAR_TESTING_MANUAL.md must match what pytest collects (355; 349 + 6
  skipped without the identity).
- README: pillar wording, three things to know, what runs in
  listing-assistants today (D5), status v1.2.0 (D8). EVIDENCE rows for
  D1, D2, D6, the KPI restarts, the notifier guard, the counts test.
  CONTRIBUTING points at LICENSE (D9). pyproject 1.2.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
Full sweep on 56c717d (963 mutants, 2 jobs): 947 killed, 1 timeout, 15
survived - the 11 known and 4 in the new code. tests/test_phase2_coverage.py
kills the 4 (malformed transfer record in the KPI, one placeholder
credential, the 320-character cap, the not-configured channel field); each
re-run is killed by its own test. Finding and EVIDENCE updated; counts
359 / 353 + 6 skipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
…fier and verifier declarations, docs

From the 2026-10-14 cold review of phase2-2026-10-14:
- kpi: walk the log in order; a return to 1 is a restart only after a hub
  boot; a duplicate, a jump or a context still routed after release is a
  gap; a transfer's mark applies where it lands. The first version hid the
  gaps main caught.
- signed_intents: an intent carried by a wildcard route can be declared; a
  wildcard name is refused (it protected nothing).
- notifier: empty / YOUR_ / PLACEHOLDER values are unset; a destination in
  the 555-0100..0199 fiction block is never posted to.
- hub: verifier.unarmed at boot when no signature verifier is set.
- territory: sending after release is a pinned limit; the holds limit test
  now makes a real hold; docstring no longer says no context is ever in
  two regions.
- counts test also checks the skip count against a run with no identity.
- docs: held-message log contents, selfcheck declared once at boot, the
  KPI with no notifier, demo stub reviewers, analyze_diff, loader warnings,
  JEV key sources, fixed lookbacks; EVIDENCE rows; D1 ancestor check
  marked DESIGN CLAIM until it runs. 366 with the identity; 360 + 6 alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
995 mutants: 982 killed, 1 timeout, 12 survived - the 11 known and
booted_since reset where a transfer lands (no test had boot, transfer,
then 1). Case added to the restart/transfer KPI test; re-run killed by it.
Finding runs 17-18 and EVIDENCE updated. No core file changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
…igit numbers

- hub.boot is the first line every hub writes; the sequence KPI reads it
  as the boot marker (the JEV lines stay as the marker for older logs).
- notifier: a 10-digit number written without +1 is checked against the
  555-01xx block; a placeholder sending number (TWILIO_FROM_NUMBER, the
  WhatsApp from) sends nothing.
- EVIDENCE: four territory limits; KPI and notifier rows. Counts 368 /
  362 + 6 skipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
…sistants; sweep run 19

README "What runs" table, the core tuning manual's MANNERS row and the
EVIDENCE rows say what listing-assistants now does (owner decision
2026-10-14). Mutation run 19 on 6076305's three changed files: 381 mutants,
380 killed, 1 survivor (the known Reject equivalent). No code change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
@QuietFireAI
QuietFireAI merged commit bbfba2f into main Oct 14, 2026
10 checks passed
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.

2 participants