Skip to content

Fix Raven Aperture #717

Description

@DHCross

Fix Raven Aperture Contamination + Void/Carrier Fallback Failure

Role

Act as a senior TypeScript engineer working in DHCross/Shipyard.

Context

We have a real failed Raven session export showing a product failure that is not primarily a Gemini/provider issue.

In the session:

  • LLM provider was Anthropic / Claude Sonnet 4.6, one successful attempt.
  • User was discussing Raven architecture: carrier variables, void states, math/poetry boundaries, and the rule “Do not invent the strike.”
  • Runtime initially treated this as REPORT_CONTEXT_MODE: SYMBOLIC_MOMENT but promptMode: FIELD_REPORT.
  • Astrology adapter failed: adapter_classifier_unavailable, fetch failed.
  • Transit outcome was skipped: geometry_unavailable_or_unclassified.
  • Airspace compiled: RavenRenderPlan compiled: SOLO_MIRROR | VOID.
  • But the render plan still had:
    • aperture: TRANSIT
    • reportType: SOLO_MIRROR
    • voiceRegister: RAVEN_FIELD_REPORT
    • geometryStatus: VOID
    • mayAskCalibrationQuestion: true
  • Prompt was huge and compacted:
    • totalCharsBeforeTrim: 106295
    • totalCharsAfterTrim: 79920
    • wasTruncated: true
    • userPromptCompacted: true
  • Raven then produced blunt fallback behavior:
    • “Manifestation Firewall Breach (Prophecy/Prediction). The generated text was withheld.”
    • Later: “Live astrology data did not provide a stable anchor…”

This is aperture/render-plan contamination plus product-hostile fallback behavior.

Goal

Fix the last-example failure mode:

When live astrology geometry is unavailable or unclassified, Raven must not mix TRANSIT / FIELD_REPORT / SOLO_MIRROR contracts, must not ask calibration questions in Solo Mirror / Blueprint lanes, and must degrade gracefully into carrier/void architecture language instead of sterile Manifestation Firewall replacement.

Do not refactor broadly. Make the smallest safe changes with tests.

Files to Inspect First

Start with:

Also inspect any existing tests around:

  • provider payload boundary
  • Solo Mirror clockless contract
  • aperture separation
  • symbolic moment unavailable
  • manifestation firewall
  • frontstage/backstage guard
  • render plan compilation

Required Fixes

  1. Solo Mirror / Blueprint Must Be Clockless

Ensure SOLO_MIRROR render plans never inherit TRANSIT aperture.

Expected behavior:

  • SOLO_MIRROR should stamp APERTURE: NATAL or equivalent clockless/blueprint aperture.
  • SOLO_MIRROR should not hydrate live transit telemetry.
  • SOLO_MIRROR should not use RAVEN_FIELD_REPORT voice register.
  • SOLO_MIRROR should not carry Symbolic Moment / Field Report timing language.
  • SOLO_MIRROR should not allow calibration questions.

Test this directly.

Failing shape to prevent:

{
"reportType": "SOLO_MIRROR",
"aperture": "TRANSIT",
"voiceRegister": "RAVEN_FIELD_REPORT",
"interpretiveFreedom": {
"mayAskCalibrationQuestion": true
}
}

Desired shape:

{
"reportType": "SOLO_MIRROR",
"aperture": "NATAL",
"voiceRegister": "RAVEN_BLUEPRINT",
"interpretiveFreedom": {
"mayAskCalibrationQuestion": false
}
}

Use actual repo enums/types; do not invent incompatible literal names if better canonical values already exist.

  1. Symbolic Moment Geometry Failure Must Degrade Gracefully

When the user’s request is architectural/meta-doctrine about Raven’s rules, and live geometry is unavailable, do not return only:

Manifestation Firewall Breach (Prophecy/Prediction). The generated text was withheld.

or:

Live astrology data did not provide a stable anchor...

unless the user specifically asked for a live Symbolic Moment reading that cannot be sampled.

Expected graceful behavior:

  • If user is discussing architecture / doctrine / carrier variables:
    • answer in Creator/Blueprint/architecture lane,
    • acknowledge geometry is unavailable only as context,
    • do not force a live Symbolic Moment.
  • If user asks for Symbolic Moment and geometry is unavailable:
    • say live geometry is unavailable,
    • read only permitted carrier/void frame if available,
    • explicitly do not promote carrier texture into event geometry,
    • invite resampling only as an option, not as the whole answer.

Preferred product language:

No active chamber crossing is available from live geometry in this pass, so I will not invent an event. I can still speak to the carrier layer: what the quiet field is allowed to explain, and what it cannot claim.

Do not use sterile console-only fallback unless generation truly cannot continue.

  1. Manifestation Firewall Must Not Block Meta-Architecture Discussion

The uploaded session shows a user saying:

  • “Do not invent an event.”
  • “Do not promote texture into geometry.”
  • “Read the void as void.”
  • “Read the carrier as carrier.”

That is not prophecy. That is anti-prophecy / doctrine clarification.

Audit the Manifestation Firewall trigger path.

Fix classification so architecture/meta-doctrine statements about prediction, event claims, or “withheld permission” are not treated as manifestation attempts.

Add tests:

  • User says “Do not invent the strike.” → should not trigger Manifestation Firewall.
  • User asks “What was withheld?” in this context → answer should explain withheld permission/event-claim, not imply hidden content.
  • User describes carrier variables and void rules → should stay in architecture lane.
  • Actual event prediction language should still be blocked.

  1. FIELD_REPORT Must Not Become the Default Container for Every Symbolic Failure

In the session, REPORT_CONTEXT_MODE: SYMBOLIC_MOMENT coexisted with promptMode: FIELD_REPORT, then the render plan became SOLO_MIRROR | VOID.

Audit the mode/lane resolver.

Expected behavior:

  • Symbolic Moment unavailable should not silently become Field Report unless explicitly requested.
  • Solo Mirror should not be selected as a void fallback for a Symbolic Moment unless the user is actually asking for Blueprint/Solo Mirror.
  • Creator/meta-architecture discussion should not be forced into Field Report just because it mentions Symbolic Moment architecture.

Add telemetry that makes this explicit:

  • requested aperture
  • resolved aperture
  • report type
  • fallback report type if any
  • reason for fallback
  • whether fallback changed aperture
  • whether fallback changed voice register

  1. Prompt Compaction Must Not Cut the User’s Governing Instruction

In the session:

  • total before trim: 106295
  • max: 80000
  • userPromptCompacted: true

The user’s key instruction was the doctrine itself:

“Do not break faith with the math to preserve the myth… Read the void as void. Read the carrier as carrier.”

Ensure user-supplied governing architecture is preserved over verbose doctrine/history when the turn is meta-architecture.

Audit enforcePromptBudget() usage and block ordering.

Expected priority:

  1. Current user message
  2. Active aperture contract
  3. Current geometry / signal-void state
  4. Minimal persona law
  5. Necessary validation law
  6. Recent history
  7. Retrieved doctrine / verbose rubrics / examples

Do not let long rubrics crowd out the user’s current architectural instruction.

Add test or debug assertion proving current user message survives compaction intact.

Non-Goals

Do not:

  • Reopen the Gemini architecture decision.
  • Add more broad “do not” prompt blocks.
  • Add runtime golden examples.
  • Make all style validators hard blockers.
  • Expand Manifestation Firewall with more broad regex without context.
  • Create a ten-section Solo Mirror muzzle.
  • Treat every geometry failure as a refusal.
  • Treat carrier texture as event geometry.

Tests Required

Add or update tests covering:

A. Solo Mirror Clockless Contract

Given SOLO_MIRROR render plan:

  • aperture is not TRANSIT
  • voice register is not RAVEN_FIELD_REPORT
  • live transit telemetry is not hydrated
  • mayAskCalibrationQuestion is false

B. Symbolic Moment Geometry Failure

Given adapter classifier unavailable / geometry unclassified:

  • system does not invent chamber crossings
  • system does not claim event geometry
  • system can still answer architecture/carrier-layer questions
  • output does not collapse into sterile “ask again later” unless truly necessary

C. Manifestation Firewall Anti-Prophecy Context

These should not trigger prophecy firewall:

  • “Do not invent the strike.”
  • “Do not promote carrier texture into geometry.”
  • “What was withheld was permission to invent an event.”
  • “Read the void as void.”

These should still trigger or be constrained:

  • direct future-event prediction
  • manifestation claim
  • hidden revelation / secret transit claim
  • forced event timeline

D. Mode/Aperture Resolution

Prevent this hybrid:

REPORT_CONTEXT_MODE: SYMBOLIC_MOMENT
promptMode: FIELD_REPORT
RavenRenderPlan: SOLO_MIRROR | VOID
aperture: TRANSIT
voiceRegister: RAVEN_FIELD_REPORT

There should be a single coherent resolved contract, or a visible, intentional degradation.

E. Prompt Budget Preservation

Under a long prompt:

  • current user message is preserved intact,
  • active aperture contract is preserved,
  • compacted content is lower-priority doctrine/history, not the user’s instruction.

Acceptance Criteria

The fix is accepted when:

  1. The last-example session would no longer produce “Manifestation Firewall Breach” for anti-prophecy architecture language.
  2. Solo Mirror / Blueprint lanes cannot inherit Transit / Field Report register.
  3. Geometry unavailable degrades into honest carrier/void language rather than refusal.
  4. Aperture/report-type/voice-register cannot form the bad hybrid seen in the session.
  5. Prompt compaction preserves the live user instruction.
  6. Smoke tests and typecheck pass.
  7. New tests would have caught the uploaded-session failure.

Product Rule

Protect the map without removing Raven from the room.

When geometry is absent:

  • do not invent the event,
  • do not erase carrier texture,
  • do not force the wrong aperture,
  • do not replace Raven with a console message.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions