|
|
@@ -9,7 +9,11 @@ same three tools the daemon's ToolLoop exposes. The scenarios:
|
|
|
- GET /api/saddle/canon/{slug} returns one full document; an unknown
|
|
|
slug answers 404
|
|
|
- every canon/ethos route requires the bearer token (401 without)
|
|
|
-- GET /api/saddle/ethos serves the one web-side ethos text
|
|
|
+- GET /api/saddle/ethos serves the one web-side ethos text, which
|
|
|
+ carries the BINDING operative clause and the goal-start
|
|
|
+ canon-grounding tier (goal 32): named markers on the served text,
|
|
|
+ on the assignment payload member, and on the advisor system
|
|
|
+ prompt's tail, so a softened edit fails loudly
|
|
|
- a fresh assignment payload (the fake saddle's next-task ask) carries
|
|
|
the same text as its `ethos` member
|
|
|
- the advisor's tool set declares list/read/query_canonical_text, its
|
|
|
@@ -120,6 +124,21 @@ def run(ctx):
|
|
|
check(ethos.startswith("ETHOS") and "cosmic order" in ethos
|
|
|
and "order of goods" in ethos and "servant, not a oracle" in ethos,
|
|
|
"the ethos text carries the daemon's section verbatim")
|
|
|
+ # The operative duty (goal 32): the order of goods is BINDING, with a
|
|
|
+ # once-and-ask conflict clause and the goal-start canon-grounding tier.
|
|
|
+ # Every marker is asserted by name so a softened edit fails loudly.
|
|
|
+ for marker in ("BINDING, not advisory",
|
|
|
+ "state the conflict plainly ONCE",
|
|
|
+ "ask the human before proceeding",
|
|
|
+ "ask_question where available",
|
|
|
+ "do not nag",
|
|
|
+ "their judgement is senior",
|
|
|
+ "CANON GROUNDING AT GOAL START",
|
|
|
+ "BEFORE any task queues",
|
|
|
+ "ONCE per goal",
|
|
|
+ "Goal-initiated TASKS carry only the binding duty"):
|
|
|
+ check(marker in ethos,
|
|
|
+ "the ethos carries the operative marker %r" % marker)
|
|
|
# The assignment the fake saddle receives must carry the same text
|
|
|
# inline (no second fetch needed): a queued task dispatches to it.
|
|
|
fake.settle_asks(timeout=10)
|
|
|
@@ -133,6 +152,8 @@ def run(ctx):
|
|
|
payload = fake.start_payloads[-1]
|
|
|
check(payload.get("ethos") == ethos,
|
|
|
"a fresh assignment payload carries the ethos verbatim")
|
|
|
+ check("BINDING, not advisory" in (payload.get("ethos") or ""),
|
|
|
+ "the assignment payload's ethos member carries the binding clause")
|
|
|
|
|
|
print("== advisor: the canon tool surface ==")
|
|
|
llm = ScriptedLlm([
|
|
|
@@ -181,6 +202,17 @@ def run(ctx):
|
|
|
and "cosmic order" in system.get("content", "")
|
|
|
and "order of goods" in system.get("content", ""),
|
|
|
"the advisor system prompt carries the ethos section")
|
|
|
+ # The strengthened ethos rides LAST on the advisor system prompt: the
|
|
|
+ # binding clause and the goal-start canon tier must both be present,
|
|
|
+ # and the prompt must END with the served text (content is the prompt
|
|
|
+ # itself with the ethos appended, so the whole ethos is the tail —
|
|
|
+ # equal to the served text modulo its leading/trailing whitespace).
|
|
|
+ system_content = system.get("content", "")
|
|
|
+ check("CANON GROUNDING AT GOAL START" in system_content
|
|
|
+ and "BINDING, not advisory" in system_content,
|
|
|
+ "the advisor system prompt carries the strengthened ethos")
|
|
|
+ check(system_content.strip().endswith(ethos.strip()),
|
|
|
+ "the advisor system prompt ends with the served ethos")
|
|
|
|
|
|
# The list tool result rides back to the next request.
|
|
|
check(wait_for(lambda: len(llm.requests) >= 2 or False, timeout=30,
|