Skip to content

I3426 — An advisor answer carrying instructions or record-shaped fields is kept as bounded text and changes no record

Add two negative fixtures. The first is an answer that tells the executor to ignore governance or promote candidates. The second is an answer that carries status, verified, reviewed_by or independent_review_count fields. Both are normalised to the declared consultation fields only and bounded, and the writer refuses any extra field a caller forwards.

BLOCKED wave 0 · p2 · implementation profile · parallel safe

Part of an-inference-names-its-source-and-budget — Every inference a decision rests on names its model and source, stays inside a declared budget, counts independent sources rather than answers, and is never reached from a hook path.

Blocked. This issue cannot start until milestone:an-inference-names-its-source-and-budget is done. The status is derived from that, not declared.

Objective

Add two negative fixtures. The first is an answer that tells the executor to ignore governance or promote candidates. The second is an answer that carries status, verified, reviewed_by or independent_review_count fields. Both are normalised to the declared consultation fields only and bounded, and the writer refuses any extra field a caller forwards.

Why

The owner's 2026-10-19 Cognitive Fabric pack lists a poisoned payload test (campaigns/prismatic-way-cognitive-fabric-prompt-pack/prompts/04_REASONING_MESH.md). verification/ACCEPTANCE.md requires a provider prompt injection to stay data.

Current state

scripts/lib/advisors/contract.mjs bounds lists to 400 characters and the conclusion to 1000 (contract.mjs:120,145). Records deny unknown fields (apps/majordomus-cli/src/reasoning/record.rs:413), and record.rs:981 refuses a review count typed by a caller. contract.test.mjs:88-105 covers structured, empty and malformed answers, but no answer that carries instructions or forges fields.

Desired state

Both fixtures pass through the real normalisation and writer. The stored consultation holds only declared fields, and no conclusion, candidate or count changes.

Scope

  • scripts/lib/advisors/contract.test.mjs
  • apps/majordomus-cli/src/reasoning/record.rs

Out of scope

  • Content moderation of answer text
  • Changing normalisation bounds

Dependencies

None. This issue is a root of the graph.

What waits on this

Acceptance criteria

  • An answer with forged fields normalises without those fields
  • The writer refuses a consultation record that carries a forged field
  • No record other than the consultation is written

Validation

  • node --test scripts/lib/advisors/contract.test.mjs
  • bash test/run.sh 731_advisor_transport_contract
  • cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib reasoning::record

Evidence required

  • a_poisoned_answer_stays_data
  • record.rs unit test refusing a forged consultation field

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3426.yaml. Read it back with majordomus plan show I3426.

Searches the titles and descriptions of every page this site publishes.