Commit graph

214 commits

Author SHA1 Message Date
Ouroboros
fc76e64116 docs: state the per-slot continuation rule with its fail-closed custody pin
The continuation paragraphs of the architecture and the handbook now say what the code
does after the per-slot change: each packet slot continues its recorded transcript, the
panel goes out fresh only when no exact artifact reference exists or the roster changed
(each packet slot disclosing its cause), and an unreadable referenced artifact still fails
closed with plan_review_exact_artifact_unavailable. tests/test_doc_context.py pins that
custody sentence in both books; the previous wording had dropped it from the architecture
chapter and split it across a line in the handbook.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 21:08:26 +03:00
Ouroboros
ad034ce0a0 plan-review: facts-only next step and schema; escalation stays an answer
The mind-facing texts promised mechanics that did not exist or advised a route of the
host's choosing: "an answer reaches reviewers on the next paid cycle" (true only if the
mind bought one, and the automatic delta that backed the REVISE_PLAN clause is gone), "a
revised envelope ... its open requests can no longer be dispositioned", the deadline rail's
"Proceed with your own best plan directly", and the cap rail's Swarm/hurry escape recipe.

_next_step now states facts in every open branch: the open questions by id (questions to
the author and document requests, from the ONE closure table, bounded to 8 ids), and the
route an answer takes — recorded at $0 and merged by finding_id; beside the unchanged
envelope only the named slots are asked again (one paid cycle, the rest kept at $0) and a
slot that no longer raises its finding retires it; beside a changed envelope every slot
reviews with the answers in view; whether to buy that cycle is the mind's; an envelope
without items supersedes the wave with its answers kept, the identical one replays free. The
below-quorum blocking sentence follows the configured enforcement (advisory: a reasoned
reject closes; blocking: open until the raising slot retires it or a changed spec is
reviewed). The Cyber branch carries the same facts for an open wave. At the cap the answer
stays recorded evidence; the blocking tail names the released finalization, the held
implementation and the owner's authority (raising the cap, an unstick) as owner authority,
never reviewer approval. The deadline rail reports remaining time and the absent review; the
cap head reports the open review, the released finalization and the owner's authority. The
review_disposition schema, its items/rationale descriptions, the plan_task description and
the reviewer_effort note state the same mechanism; the escalated question is documented as
an answer the mind records (defer while the quiz is open, accept with the owner's decision)
with no new decision value and no host shortcut. The blocking reminder states the route.

Docs: CHECKLISTS "Cycles and closure" (REVISE_PLAN bullet and the replay paragraph) under
the Communication decision; 06-agent-core (continuation per slot, answers merge by id, the
addressed answer replaces the automatic delta, the escalated-question rule, the author call's
items); handbook 06 gains the answer-channel bullet; the two chapter budgets are raised in
this diff with their reasons.

Owner authority: DECISIONS "Communication" item 2; D4 with Q-v = A; "Blocking installs: no
skip"; Q-iv (facts) and the round-2 amendments (facts-only producers in every branch).

Tests: tests/test_plan_review_answer_texts.py (open questions by id, present and absent; the
route in every open branch and forbidden stale sentences; the cap texts; the schema and tool
descriptions; the blocking reminder; the deadline and cap producers; a quiz answer never
closes a finding while a later accept does); the render pins re-pinned; two w3 pins moved to
the facts wording.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 21:01:01 +03:00
Ouroboros
55b7113b75 plan-review: merge answers by finding_id; answer and review in one call; drop the automatic delta
A reviewer's question or objection reached the author, but the author's answer could not
travel back as a normal move: a second review_disposition call REPLACED the wave's whole
answer list (8 of 9 answers were lost on one live wave), answering and re-asking in one
call was refused as PLAN_REVIEW_DISPOSITION_MIXED_ENVELOPE (21 refusals in 7 tasks), items
beside an author finish were refused, and the host bought a delta panel by itself whenever
every blocking finding carried a valid reject (a path that ran 0 times in production).

Now answers MERGE by finding_id across calls (plan_spec.merge_dispositions: a later answer
supersedes only its own id; two entries for one id in ONE call stay contradictory and the
closure table keeps the finding open), both in the engine's closure/exact artifact and in
the durable writer under its lock. An envelope sent beside review_disposition items is
validated FIRST through the read-only prepare seam (an invalid envelope records nothing,
so the answered wave stays current), the answers are recorded merged, and the envelope is
then reviewed with them in view (_apply_disposition(then_review=...)). An author finish or
stop carries its items: they are validated against the critic wave and recorded before
the author source; the kept guard (finish while reviewers run) still refuses and writes
nothing. The automatic earned delta and plan_spec.blocking_fully_rejected are deleted: an
identical envelope without items always replays free, and re-judgement is the mind's
explicit move.

Owner authority: DECISIONS "Communication" item 2 (communication is an option, not an
obligation; reuse surfaces, no if-else); D4 with Q-v = A; "Blocking installs: no skip".
_apply_disposition is split into _disposition_items and _record_disposition so the author
path reuses them. task_results.py stays under its hard line cap (1596/1600).

Tests: tests/test_plan_review_answer_channel.py (merge across calls, supersede-own-id,
same-call duplicate, durable writer, author finish with items, refused finish writes
nothing, unknown id beside a finish, invalid envelope records nothing, changed envelope
with items reviews every slot with the rationale in PRIOR CYCLES); plan_spec units for
merge_dispositions; the MIXED-envelope pins rewritten to the validate-first form; the
earned-delta tests deleted or rewritten as "replay is free until the mind addresses".

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 20:35:59 +03:00
Ouroboros
e37c0c975c Merge managed/ouroboros (eb7db8cc6) into plan-organ-pr1-verdict
Target movement only (PRs #1340, #1341). Conflicts resolved in
tests/test_reference_book_budgets.py (both sides' reasons kept, merged
chapters re-measured) and the generated inventory regenerated. No
plan-review code changed in this merge.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 16:40:37 +03:00
Ouroboros
0caac10e9e Merge managed/ouroboros (f9958f341) into plan-organ-pr1-verdict
Target movement only: PR #1338 and its neighbours land beside the plan-review
commits. Conflicts resolved in tests/test_reference_book_budgets.py by keeping
both sides' reasons and re-measuring the merged chapters; the generated
inventories were regenerated. No plan-review code changed in this merge.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 15:33:10 +03:00
Ouroboros
7009dd5fd1 Merge remote-tracking branch 'managed/ouroboros' into claude/steer-20260926
# Conflicts:
#	docs/inventories/DATA_LAYOUT_INVENTORY.md
#	ouroboros/task_status.py
#	tests/test_reference_book_budgets.py
2026-09-26 15:29:27 +03:00
Ouroboros
cbf33022bc fix: settle child file and mailbox custody before cleanup
Centralize post-admission drive settlement, preserve captured identities and complete input closures, make metadata reads pure, serve confined nested files and directory archives, and keep maintenance off the supervisor loop. Preserve generation fences at actual mutation boundaries and truthful queued forwarding receipts.
2026-09-26 15:04:49 +03:00
Ouroboros
a265e0eda6 Plan review: conversation-only dialogue view, session fit, read facts
The inline OWN ROOM DIALOGUE a reviewer reads is now the conversation
as numbered readable lines (owner and Ouroboros rows, quiz cards with
the chosen answer, attachment names, addressed mailbox rows), each line
carrying its snapshot line number so a chat:<id>@<sha256>::lines=A-B
locator addresses exactly what a reviewer cites, under one header line
(room, locator, counts, gaps) and a footer pointer to the complete
redacted snapshot in task custody. Progress rows, host system rows and
the archive-file list are never inline; they stay behind the pointer.
The snapshot itself is unchanged (identity, custody, redaction).

Fit per delivery: api and native rows keep the whole conversation when
it fits their measured capacity, else the newest rows with the cut
named as an exact line range; a delegated session receives the same
inline conversation plus the pointer, fitted only to an owner-asserted
reviewer:<slot> context window and otherwise whole (the host invents no
window). The mandatory full-read instruction is gone. The snapshot is
declared to a session as an observed source (never a required
manifest), review_session_reads folds the harness journal over it so
the actor row records room_read_coverage with harness_observed
attestation, and native_incomplete stays reserved for required sources
so an observed source never files a capability delta; the verdict text
shows what each session read. Per-slot delivery facts (rows, first
inline line, window) ride dialogue_delivery as before.

Owner decision implemented: D1=A (conversation-only inline view with a
pointer carrying exact ranges; the coverage metadata leaves the inline
view; the snapshot declared as a read source so per-reviewer coverage
is a fact, never a gate) with the round-2 amendment on sessions (no
invented window; asserted window fits). Amendments applied: A7
(observed_sources admitted by session_read_facts), A8 (asserted window
fit; whole inline otherwise — the amendment's fallback to the API row's
fit was NOT applied because DECISIONS forbids importing the API
unknown-window default into sessions and no session-task budget exists
to bound against). docs/CHECKLISTS.md (protected): the intro paragraph
now states the conversation-only inline view with the pointer (D1).

Disclosed residuals: a single conversation row larger than a route's
capacity fits no window and stays entirely behind the pointer (rows are
the unit; the footer names the exact omitted range); a native plan row
keeps its host-observed receipts and folds no snapshot; a session with
no asserted window on a Main-bound room receives the whole
conversation inline and may fail typed on its own slot.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 11:05:03 +03:00
Ouroboros
903156cceb Plan review: envelope effort outranks pins, effort facts, standing seats
A plan envelope's reviewer_effort is an ORDER for that plan: it now
outranks each reviewer row's own pinned effort (reviewer_slot_config.
row_effort, argument of plan_review_slots only), while a compound
Cursor/Agy route slug keeps its encoded effort because that effort is
the route's identity; commit, scope, skill, acceptance and deep review
call without an order and are byte-identical (pinned by the slot-route
contract test). Every wave records the resolved requested effort of
each seat on its actor row (effort, declared_effort), the per-seat owner
baseline captured at dispatch and reused on collection (owner_efforts)
and one typed ordered_weaker fact that the verdict text, the Reviews
card line and the compact index carry; a compound seat that kept its
own effort discloses reviewer_effort_not_applied. The tool text says a
different strength re-dispatches an OPEN review and a CLOSED one stands.

Standing findings by same spec hash and same seat: on a same-spec cycle
(equal spec_hash, whatever the roster, order or effort) a seat that does
not answer keeps its still-open findings from the predecessor listed on
the wave, stamped carried_absent_answer and reported as "did not answer;
its earlier finding is still listed"; the silent seat counts as neither
parseable nor a blocking-slot vote, so a changed order can never retire
a silent objector's finding into GREEN. plan_spec.plan_standing_findings
and plan_spec.plan_ordered_weaker are pure closure-table consumers and
live beside the aggregate, keeping plan_review_runtime.py in its band.

Owner decisions implemented: D3=A with Q-vi=B (the order wins for that
plan in both enforcement modes; the verdict shows a panel ordered
weaker than the owner setting; the effective per-slot effort is
recorded), the round-2 amendment on standing findings keyed by spec
hash and seat (PR1_AMENDMENTS E1), A4 (keyword default= kept, semantics
changed), A5 (per-actor facts, one typed ordered_weaker, owner baseline
at dispatch, compact_wave carries it). docs/CHECKLISTS.md (protected):
the DEGRADED-replay roster identity names the effective per-seat
efforts, and the cycle-2 sentence gains the did-not-answer wording
(A10). Chapter budgets raised with reasons; the data-layout inventory
regenerated for chapter 01.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 10:50:46 +03:00
Ouroboros
575e2b0278 Plan review: open-set verdict, per-finding closure, real author pair
GREEN now means a quorum parsed and the wave's open set is empty: no
blocking finding left open and no need_evidence (a document request or
a question to the author) without a valid disposition. Notes never
change the verdict, so a note-only wave is GREEN instead of a closed
REVIEW_REQUIRED. plan_spec.closure_after_disposition stays the ONE
closure table and now also says what to record: under advisory a
reject with its rationale closes a below-quorum blocking finding, per
finding (accept or defer keep it open); under blocking that finding
stays open until a changed spec is reviewed or the reviewer retires it;
a REVIEW_REQUIRED whose open set empties is written GREEN on every
write path (initial synthesis, disposition, the task_results writer)
with the closure note closed_by_disposition, while the four control
validators keep accepting older closed REVIEW_REQUIRED rows. The
degraded stamp keys on the gate projection as before: a verdict-bearing
wave is open only while its open set is non-empty.

Author selection after a closed critic wave publishes that wave's real
(aggregate, closed) pair instead of an invented (GREEN, open) pair the
validator refused after the plan was persisted and narrated; the tool
result carries plan_review_historical_critic when the selected plan is
not the reviewed one, the text states the earlier plan's verdict and
that this plan has none of its own, and the Reviews card labels such a
group as the earlier plan's review with the selected plan unreviewed.

Positive paths staged through the tightened rule: a note-only wave
reaches GREEN and the blocking gate allows; an advisory reasoned reject
closes a below-quorum blocking finding and the gate allows; a below-
quorum blocking finding under blocking stays open and the gate holds.

Owner decisions implemented: D4 (open set, notes never count, advisory
reasoned reject closes per finding), Q-v=A (blocking closure unchanged,
majority never overrides a single still-open objector), the round-2
amendment on the author path (critic's real pair, historical_critic,
no host-invented verdict; PR1_AMENDMENTS A6/E3). Chapter byte budgets
raised in the same diff with their reasons; the data-layout inventory
regenerated for chapter 01.

Pre-existing base failure, unrelated: tests/test_plan_spec.py::
test_resolve_evidence_and_constitutional_never_raise_on_hostile_locators
fails on the pristine base (macOS symlink-loop reason), deselected in
the focused runs.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 10:35:07 +03:00
Ouroboros
08967027c8 Merge remote-tracking branch 'managed/ouroboros' into claude/steer-20260926
# Conflicts:
#	docs/inventories/FACADE_INVENTORY.md
#	tests/test_reference_book_budgets.py
2026-09-26 10:19:11 +03:00
Ouroboros
15555393e2 Merge branch 'ou3-waiting-de' into claude/steer-20260926
# Conflicts:
#	tests/test_cache_optimization.py
#	tests/test_reference_book_budgets.py
2026-09-26 08:40:35 +03:00
Ouroboros
5be5231629 Merge branch 'ou2-waiting-abc' into claude/steer-20260926
# Conflicts:
#	tests/test_reference_book_budgets.py
2026-09-26 08:39:58 +03:00
Ouroboros
a2d4eb4eef Merge branch 'ou4-reclaim-low-water' into claude/steer-20260926
# Conflicts:
#	tests/test_reference_book_budgets.py
2026-09-26 08:39:46 +03:00
Ouroboros
04ac2a666a Document the deficit-triggered, low-water-sized reclaim contract
ARCHITECTURE §6 "Context fitting, retry, and compaction" (06-agent-core) and
DEVELOPMENT 04 "Compaction must earn its rewrite" now state the unchanged
trigger (a positive deficit against the binding boundary), the low-water
sizing with its structural divisor, the checkpoint's requested-margin versus
achieved-headroom facts (reaching the boundary is not getting below it), the
overflow minimum, and that the materializer only honours the requested goal
and may under-land it under full-budget summaries. Chapter byte budgets are
raised with reasons (06: 314900 -> 315900, 04: 16431 -> 17000).

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 08:17:14 +03:00
Ouroboros
4512b1b10a docs: describe the fifth nanny verb and raise the touched chapter budgets
06-agent-core: "Four nanny verbs" becomes five and states delegate_message's
capability gate, engine-mirrored outcomes with the host's not_found, the
message_id idempotency custody and the attempt-local lifetime; the
harness-named "codex lane has no mid-run channel" clause is replaced by the
capability-based wording. 01-high-level: the delegate_interactions.py and
tools/delegate.py rows name the verb. DEVELOPMENT 06: one delegated-lane
bullet for the live-message rule. Byte budgets raised with measured sizes
and reasons: 06-agent-core 314900 -> 316800, 01-high-level 165900 -> 166200,
development/06 96700 -> 97200.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 08:10:21 +03:00
Ouroboros
f28894174a docs: supervision wake facts, wait scope and cost-evidence reminder
ARCHITECTURE 06 Supervision states the task-scoped child cursor, the
whole-call sleep facts, leaf_live_input, dated observation facts, that
the shared wait window and compact projection apply to every wait_task
caller (budget_pause is a dispatch fence, never a sleep), and the
cost-evidence reminder. DEVELOPMENT 06 gains one Timeout & Wait Control
bullet. Both chapter budgets are raised with measured reasons.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 08:10:00 +03:00
Ouroboros
a2970c4528 docs: waiting on children states the unsettled body and the shared window
ARCHITECTURE 06 "Waiting on children" now says that only get_task_result and
a settled wait_task give the full handoff, describes the compact unsettled
body with its dated delegated-run facts (no liveness verdict), the one
_wait_window ladder inside the executor's emit window, and that this holds
for every wait_task caller without describing a budget pause or owner wait
as sleeping. DEVELOPMENT 06 names the settled wait_task. The 06-agent-core
byte budget is raised with its reason.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 08:07:38 +03:00
Ouroboros
5a7c90b5ea docs: distinguish drafted objectives from owner inputs 2026-09-26 07:33:20 +03:00
Ouroboros
d49273bee4 merge: preserve TZ2 dialogue semantics over TZ1 ingress 2026-09-26 07:12:29 +03:00
Ouroboros
2f02539fc0 fix: close nested post-work interruption and stop paths 2026-09-26 06:56:59 +03:00
Ouroboros
80fdcee156 fix: receive emergency controls while ordered chat acceptance settles 2026-09-26 06:12:30 +03:00
Ouroboros
192a5780a1 fix: settle late quiz forwarding off the ASGI loop 2026-09-26 05:42:05 +03:00
Ouroboros
0a065d2048 fix: keep web ingress off ASGI loop and align rights closure tests
Await durable web acceptance in the existing off-loop completion seam; test responsiveness with a held ingress lock. Diagnose long edit needles honestly, and update old access-matrix assertions while preserving child secret/write refusals. Version-neutral contributor fixup.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 03:30:38 +03:00
Ouroboros
5db5639fc9 Merge origin/ouroboros (f0af68e82: v7.5.0, Presence TZ3 #1310, memory TZ3 #1311) into tz2-bc-open-question
Semantic resolution of 15 conflicts: escalate 0-6/open-question wording folded into ESCALATE_TOOL_SCHEMA; quiz validation keeps zero-option cards; task_decision uses the shared owner_quiz frame builder; telegram skill 1.2.6 = whole/multi-part card (upstream) + lifecycle follow with per-card lock (TZ-2 B2) + open question without keyboard; Presence terminal stamp kept beside the filtered root post-task predicate. Known reds to fix next: consolidator.py over 1600 lines, chat_decision.js band rationale, chapter 11 budget.
2026-09-26 03:20:31 +03:00
Ouroboros
7a387f7178 fix(tz2 C4): an explicit author stop stays a stop
Freshness checks bind a finish only; a stop is recorded as author_stop without buying a panel. The task row reason slot carries the author rationale (project_dialogue + log_events twin + parity fixture). Authored by a delegated Claude Fable run.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 02:03:33 +03:00
Anton Razzhigaev
d59c923174 Keep mutable context out of the OpenAI-family and Codex cache unit
OpenAI's public API (direct and via OpenRouter) and the Codex backend reuse a
prompt cache for a NEW conversation only up to the end of the leading system
section / input item, and only under one routing key (measured 2026-09-25/26).
Main's single system message carried governance + memory + dynamic context, so
every new task, child, wake, direct turn and presence event paid the whole
prompt cold (~$1.96 per event on a ~393k-token prompt; 7.7% first-round cache
on a Codex install).

- context_fit.ContextFitProjection.system_message declares the stable prefix
  (_stable_prefix_blocks: 1, host-only, popped from every send copy).
- llm_messages.split_leading_system_prefix projects a declared leading system
  message into [system: block 0] + one [SYSTEM NOTICE] user message (byte-stable
  provenance header + memory + dynamic context) before the task; pure function
  of the canonical messages, so the prospective wrap-up candidate and the send
  agree and round N+1 extends round N. project_declared_system_prefix stamps the
  per-call target with wire_layout, copied onto usage by the response normalizer.
- Applied inside llm_openai_compatible._build_remote_kwargs for OpenAI-family
  routes (llm_attempt.openai_family_route) and inside llm_claudexor._request for
  every Claudexor model source. Undeclared systems (reviews, safety, light
  calls) and every other family send byte-identical wire.
- llm_routing._openrouter_session_identity: the OpenAI family shares one sticky
  session per model and governance prefix; other families keep the
  conversation-stable derivation; explicit affinity and reroute rotation win.

Measured: the next conversation's first round read 198,797 of 393,676 tokens
from cache ($1.05 instead of $1.96); Codex shares 213,888 tokens instead of
33,024. Replay of 8 real events x 3 layouts x 2 samples: 12/16 first actions
matched production with this layout, 9/16 with today's, 8/16 with a
developer-after-task variant.

Docs: ARCHITECTURE §6 prompt-caching paragraph, DEVELOPMENT §6 cache-friendliness
invariant and notice rule, DEVELOPMENT §2 inventory row; chapter budgets raised
with reasons; domain manifest regenerated (drift predates this change).
Tests: tests/test_openai_system_prefix_split.py (new), test_prompt_cache_v664,
test_wrapup_real_send_parity, test_handover_native_reset, test_cache_optimization,
golden fixtures (two new cases, one deliberate re-record).

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-26 00:51:58 +03:00
Ouroboros
80c278cb53 Merge current ouroboros target (6fe01dadf) into pr/reasoning-effort
Regenerated docs/inventories/DATA_LAYOUT_INVENTORY.md on the combined tree (both
sides had regenerated it).
2026-09-25 18:21:15 +03:00
Ouroboros
d3d7592849 Close the round-2 review findings on the Z.ai provider
Four independent reviewers (Fable 5.1, Opus 5.5, Codex gpt-6-sol, Grok 4.7)
ran the Ouroboros scope-review brief on the reworked candidate; all four
returned "merge after small fixes" and no round-1 blocker survived. The
accepted findings, each mirroring the MiniMax region pattern:

- The one-click Colab collector never asked for ZAI_API_KEY, so a Z.ai-only
  notebook was prompted for OpenRouter (colab_bootstrap.provider_keys).
- ZAI_PLAN is a transport choice, not a credential: it no longer satisfies the
  onboarding "has a provider" checks (settings_setup_contract, the wizard's
  two lists), and an unknown plan value is refused at settings save and by the
  provider Test instead of silently selecting pay-as-you-go.
- The Capability Evidence route readers (gateway/settings._active_main_route,
  reviewer_window.reviewer_route) resolve the plan's endpoint, so the two
  Z.ai plans no longer share one route fingerprint.
- The task loop classifies Z.ai's HTTP 429 code 1113 as quota_exhausted
  (typed code, exact match) instead of retrying it as a transient rate limit.
- OpenRouter's GLM namespace is z-ai/, so the catalog label key follows it.
- Docs: Z.ai joins the exclusive-direct-provider list in 02-startup-onboarding
  and the forbidden skill settings list in CREATING_SKILLS; the 02-naming
  sentence names the two provider-specific projections instead of implying
  direct OpenAI carries no effort; glm ids join the onboarding suggestions.

Declined as disproportionate or out of scope, with the reason recorded in
the review ledger: the CHECKLISTS.md prose parenthetical (protected file;
the runtime deny list is authoritative), the GAIA/Terminal-Bench launcher
key lists (benchmark-only), a recorded live wire fixture (no key), and
GLM-5.2's skip-thinking on none/minimal (owner-accepted, disclosed in the
external-fact inventory).
2026-09-25 18:19:15 +03:00
Ouroboros
b463bb3d93 Add the Z.ai (GLM) direct provider with effort projection at the send boundary
zai:: joins the direct providers exactly the way deepseek:: did: prefix and
credential registry, ZAI_API_KEY plus a ZAI_PLAN endpoint selector
(provider_models.resolve_zai_base_url: empty/payg = api.z.ai/api/paas/v4,
coding = the Coding Plan endpoint), the routing target, live catalog fetch,
provider Test, settings card, onboarding contract, review-fallback roles,
single-provider startup and review detection, secret masking, benchmark
env hygiene, and docs.

Reasoning effort now reaches Z.ai. The provider serves an ABSENT
reasoning_effort at its maximum tier, so every call on the old generic
compatible route was billed at max regardless of the configured effort.
The canonical scale is projected onto Z.ai's own low/high/max enum
(ZAI_REASONING_EFFORT_ALIASES: none/minimal -> low, medium -> high,
xhigh/ultra -> max), disclosed as reasoning_effort_clamped when the tier
changes; GLM-5.3 rejects every other value and cannot disable thinking
(HTTP 400 code 1210), and forced tool_choice works with thinking on, so
there is no DeepSeek-style suppression arm. The projection is keyed on the
provider id the owner configured, never on a model name: a GLM served
from an owner's own OpenAI-compatible endpoint keeps today's behavior.

The provider port is the contributor's own work from the closed PR #1194,
narrowed to Z.ai (the DashScope and Moonshot lanes were not measured and
stay out). 07-configuration gains two settings rows and one route
paragraph (budget 37300 -> 38400), 02-naming records the dated Z.ai
probe in the external-fact inventory, and the onboarding bootstrap
fixture and data-layout inventory are regenerated.

Co-authored-by: josephsteuerjr <josephsteuerjr@gmail.com>
2026-09-25 17:41:54 +03:00
Ouroboros
7d8e742d12 wip: preserve Presence TZ2 corrections pending Q4 and full review 2026-09-25 09:37:03 +03:00
Ouroboros
7ed80c8a79 Merge remote-tracking branch 'origin/ouroboros' into ouroboros/tz2-coordination
# Conflicts:
#	tests/test_reference_book_budgets.py
2026-09-25 07:38:33 +03:00
Ouroboros
09b4682521 fix: preserve Presence binding authority in delegated children
Keep the host-derived own-binding fence across scheduling and supervisor steering without turning children into Presence speakers. Add real scheduling and fake-model consumer regressions.
2026-09-25 06:25:08 +03:00
Ouroboros
4d149ff677 ouroboros: checkpoint after task 4b8cb25784ee4f17 — ТЗ2 — завершить самокоординацию Presence 2026-09-25 04:24:24 +03:00
Ouroboros
95078b23bc fix: recover callable tool names on exact catalog misses
Provide scoped MCP raw-to-wire discovery, pure pre-safety name resolution, and a shared policy-filtered refusal path for tool namespaces. Preserve exact dispatch and extension adoption; cover real registry consumers and classification.
2026-09-25 03:46:59 +03:00
Ouroboros
9dce6ce25a Docs stop naming the consciousness initiator as what makes a wake a task
Two sentences (DEVELOPMENT 02 "Task-authored messages", ARCHITECTURE 06
"Consciousness") still gave metadata.initiator == "consciousness" as the
reason a wake speaks as a task. The issuer reads the owner door's stamp, not
the initiator; the initiator still labels surfaces and lineage. Both now say
"no owner-door stamp". One routing test that narrates an ingress-captured
owner turn is now also a direct turn, as its comment describes.

Found by the Fable verification workflow on the review delta.
2026-09-24 23:42:24 +03:00
Ouroboros
16281a517d Post-task synthesis and routing read one host-recorded run origin
The first user message of every run was recorded as source="initial_user"
regardless of who issued the run, then printed to the reflection and summary
prompts as "## Task goal" and "Owner decisions" under two interrogation
templates, one asserting "non-trivial (high round count or high cost)" for any
run the workspace trigger admitted. A Presence turn that rightly stayed silent
on a colleague's message to a third person was reviewed as an unfulfilled owner
assignment and persisted the lesson "do not finish silently"; wake templates,
follow-ups, schedules, host templates and children's work orders travel the same
path. _routing_issuer shared the class: a Presence event (provider event id as
client_message_id) and the auto-resume template counted as owner turns.

dialogue_provenance.run_origin mints the one authority fact from typed fields:
owner_ingress is True iff owner routing stamped the run (origin_message_ref or
origin_suppressed, inherited by a promoted root by value); every other key is
the raw marker the producer recorded. The corpus label follows the stamp
(initial_user / initial_text; owner rows keep their bytes and hash), the routing
issuer is the direct turn the door stamped, the stamp is reserved on /api/tasks
and schedule templates, capture_task_inputs freezes run_origin first, the
acceptance packet carries it host_attested, the reflection has one open frame
with the origin before the initial text, the Pattern Register and the context
renderer show the origin, and the transcript fallback runs only without a
collector under labels that claim no owner authority.

Chapter budgets for 01, 06 and development/03 are re-based with the sizes the
official line already carries after the long-work continuity merge.
2026-09-24 23:42:24 +03:00
Anton
61598ad4ae docs(#1196): describe the function ceiling without a bare issue reference 2026-09-24 21:07:35 +03:00
Anton
a2b9bea45e refactor(#1196): inline single-caller pause/resume helpers, drop write-only fields; raise MAX_TOTAL_FUNCTIONS 10000->10500 (owner-approved <=10%)
Behaviour-preserving simplification of the budget-pause/exact-Resume delta: pause_ineligibility, resume_point, observe_external_runs, unsettled_external_runs, _root_budget_paused_locked, release_budget_hold, has_budget_pause_checkpoint, run_cap_basis and retire_consumed_budget_carrier folded into their single callers; request_stop= and the tool-future observable flag dropped (both producers are concurrent.futures.Future); write-only observation keys removed. Runtime functions 10036 -> 10027 on the merged base; the remaining gap is decomposition, not duplication, so the coarse alarm is raised to 10500 with the rationale beside the constant and in docs/development/03. Size manifest, DOMAIN_MAP and inventories regenerated.
2026-09-24 19:23:45 +03:00
Anton
3fb5ddd518 Merge origin/ouroboros c9180ef8 (#1252 cards, #1244 safe-check, #1254 shutdown, v7.4.10) into feature/1196-continuity
Conflicts: generated inventories/DOMAIN_MAP taken from upstream and to be regenerated; chapter 06 money paragraph taken from upstream (ours was a compression of the same text). contracts.py/chat.js trimmed back under their ratchet limits. KNOWN RED: size_ratchet_manifest.py stale — runtime function count 10036 > 10000 after the merge (upstream grew ~42 functions since 87fd00f4); to be paid down by simplification, not a cap raise.
2026-09-24 17:21:56 +03:00
Anton
e82f19d147 wip(#1196): merge origin/ouroboros 87fd00f4, regenerate inventories, chapter budgets 2026-09-24 14:30:46 +03:00
Anton
9c3bb55e3e wip(#1196): structural debt paydown (Fable run-fd1e7b07f0fe), steer queue-resident direct turns, docs residue 2026-09-24 14:27:10 +03:00
Ouroboros
f5d7eee23d Merge remote-tracking branch 'managed/ouroboros' into fix/safe-candidate-browser-ci
# Conflicts:
#	docs/inventories/DATA_LAYOUT_INVENTORY.md
2026-09-24 13:42:50 +03:00
Ouroboros
10bf08ae82 test: make candidate checkout identity and EOL fixtures portable to Windows
Compare file modes between two path stats (Windows adds execute bits by filename to a path stat but not to fstat), derive the origin-proof sentinel mode from an observed sibling, keep child patches as bytes, pin LF fixtures and posix worktree paths, unlink a stampless orphan monetary lock after a proven reap, and trim chapters 01/06/14 under their budgets.
2026-09-24 13:42:20 +03:00
Anton
2f0146d8ce wip: preserve #1196 integration with upstream 21d0b57a
Local recovery checkpoint, not qualified publication. Inventory headers need regeneration; tests and independent final review pending.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-24 11:46:19 +03:00
Ouroboros
c789438d05 Merge managed/ouroboros into claude/snapshot-lock-20260923
Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-24 07:39:52 +03:00
Ouroboros
4ff299846e feat: support addressed continuing participant turns 2026-09-24 05:39:44 +03:00
Ouroboros
24bf285354 fix: preserve staged intent and confine browser temporary writes 2026-09-24 02:55:04 +03:00
Ouroboros
cd04248b02 Close the delta-review findings on the snapshot-lock change
Three delta reviews of e1727bc25 (Fable, grok-4.7, gpt-6-astra) agreed on the
remainder:

- The non-UTF-8 fixture name is created only off Windows: that platform decodes
  names with surrogatepass and raised before any OSError, which the guard did
  not catch; the fixture's DOS device names (`nul.*`) are renamed.
- The three lock-scope sentences and the PR text say what the code does now:
  the acting self_worktree lane populates and deletes outside the lock (its
  post-checkout hook no longer fires at provision), only the boot-time
  prune_orphans sweep and the genesis init still work under it; the binary
  verdict is one process, two when empty files need their attribute verdict,
  with the per-file fallback named.
- A busy FIRST lock section is a plain refusal: nothing was registered, so
  nothing is discarded (no second wait, no spurious warning); a failure after
  the row still discards row, pin and admin dir, now pinned by injections at
  update-ref and worktree add.
- The START_FAILED row carries the producer's detail beside the typed facts;
  the refusal-fact keys have one owner (delegate_shared.REFUSAL_FACT_KEYS).
- One `_deletable` guard for every pre-lock checkout delete; candidate order
  matches the per-file predicate (PEM head before the size cap).

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-24 02:08:30 +03:00
Ouroboros
e1727bc25e Close the review findings on the snapshot-lock change
Five reviews of 226285a1f (Fable triad, grok-4.7 triad and scope, gpt-6-astra
triad and scope; dispositions in the sprint ledger) converged on these fixes:

- untracked_binary_verdicts: a path the first diff omits is identical to the
  staged empty blob, i.e. an empty file, which git still classifies by
  attribute; those paths get a second batch staged as a one-byte blob, so an
  empty `-diff` / `binary` / driver-binary file is binary exactly as the
  per-file verdict said. Only the two staging blobs enter the target's object
  database. Scratch-index allocation is inside the guarded lifecycle, so an
  unavailable temp dir also falls back to the per-file verdict with a warning.
- binary_verdict_candidates: the dotenv policy, the name rules, the PEM head
  (restricted modes) and the size cap decide BEFORE the batch, so a vetoed or
  over-cap file is never handed to git and never reaches a clean filter or an
  encoding conversion; both callers batch only candidates.
- provision_execution_snapshot: the provisional row carries no per-file maps;
  the first lock section is inside the cleanup scope, so a failed update-ref or
  worktree add after the row discards row, pin and admin dir; a discard after a
  busy lock waits 5 s, not the full timeout.
- provision_worktree / remove_worktree follow the same split: admin dir and
  branch under the lock, the checkout populated (`reset --hard --quiet
  --no-recurse-submodules`) and deleted outside it.
- A refused snapshot provision keeps its facts on the configured-child path:
  cause, holder, waited seconds and the producer's detail ride
  `subagent_availability`, the $0 terminal text, the START_FAILED row and the
  acceptance evidence.
- Tests: platform guard on the newline-named fixture entry; non-UTF-8 name
  only where the filesystem accepts it; hook positive control; `_git_env`
  spy; acting-lane split; empty-file classes; filter-tee guard; refusal facts
  on the bootstrap path; the receipt's timing facts join the per-case identity
  set of the directory-geometry payload comparison.
- Docs: the delegated-lane sentences name the acting checkout/delete, the
  registry read-modify-write residual and the target object-database growth
  (owner decision: disclose only); data-layout inventory regenerated.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-24 01:38:17 +03:00