Repository navigation
Repair plan Phases 2-3: signed intents by identity, KPI and notifier truth, docs truth pass, v1.2.0 - #2
Merged
Conversation
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phases 2 and 3 of the repair plan (owner decisions D1, D2, D5-D10, 2026-10-14: all as recommended).
Code
signed_intents). The core hard-codes onlyconfig.updateplus the.authoritysuffix. A declared name no route carries is refused at load, and so is a wildcard name.dispatcher/spokes.pymoved todemo/.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.unarmedandverifier.unarmedare declared at boot; before, neither mode said anything.baseline-out/is untracked.Docs
Gate
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 declaressigned_intentsonly after the listing merge.🤖 Generated with Claude Code
https://claude.ai/code/session_01CRunDQmfmnZdtJiP78e8WR
Generated by Claude Code