Skip to content
This repository was archived by the owner on Oct 10, 2026. It is now read-only.

fix(core): build pressure on distances real walks actually cover - #248

Merged
scrimshawlife-ctrl merged 1 commit into
mainfrom
fix/event-pressure-curve
Jul 29, 2026
Merged

scrimshawlife-ctrl merged 1 commit into
mainfrom
fix/event-pressure-curve

Conversation

@prabu-openclaw

Copy link
Copy Markdown
Collaborator

Half the world-event vocabulary has never been reachable on a real walk. This is the mechanism behind the recurring operator report that the companion "feels dead".

Evidence

Five of the ten event kinds are gated on pressure, and pressure came almost entirely from distance on a 3 km scale (min(0.55, distanceMeters / 3000)). Converted to walking distance, each kind needed:

Kind Pressure Distance before it could fire
companionObserves 0.04 120 m
pursuitFades 0.18 540 m
distantPresence 0.24 720 m
pursuitBegins 0.36 1 080 m
pursuitIntensifies 0.55 1 650 m

Field walks in the receipts run 17–134 m. Bounded pursuit is a binding product pillar and had never once been reachable on device — the companion could only ever draw near, move ahead, or sit quiet. Receipts show 2 world events in 255 s and 4 in 185 s, drawn from an effective vocabulary of three.

Change

Distance still leads, on a scale a real walk reaches, plus a slow duration component so a short stroll still develops texture:

let distancePressure = min(0.45, session.distanceMeters / 1200)
let durationPressure = min(0.20, session.activeTime / 900)

Both stay individually capped, so pressure remains bounded rather than a ramp toward punishment, and the pursuit rules keep their own maximumPressure gates — calm kinds recede as tension rises, which is the intended shape.

Measured through WorldState.derive:

50 m  / 60 s    pressure 0.11   5/10 kinds
150 m / 180 s   pressure 0.33   6/10   + distantPresence, pursuitFades
400 m / 420 s   pressure 0.53   6/10   + pursuitBegins
800 m / 720 s   pressure 0.65   5/10   + pursuitIntensifies; calm kinds recede

What this deliberately does not change

Event frequency. I first also reduced minimumTickSpacing 40s → 26s, which raised yield from 1.60 to 2.40 events/min — and broke the frequency bounds asserted in both WorldEventWeightTuneTests and SoloMVPVerticalSliceTests. Those encode intentional sparseness as product law, so I reverted it. This is a variety change, not a density one, and the guards remain green.

If the sparseness bound is worth revisiting that is a separate product decision, with the numbers above as input.

Validation

  • 133 Swift package tests, 0 failures
  • 415 app tests, 0 failures
  • New WorldEventCadenceTests measure yield and vocabulary reach rather than asserting intent, so future tuning can be judged against numbers

Note on authority

Sources/WaykinCore/ is your codeowner lane and this touches gameplay feel, so it wants product sign-off rather than a routine review. Happy to adjust the curve — the thresholds are a judgement call; the finding that pursuit was unreachable is not.

🤖 Generated with Claude Code

Half the world-event vocabulary was unreachable on an ordinary walk. Pressure
came almost entirely from distance on a 3km scale, and five of the ten kinds are
gated behind pressure thresholds, so they required:

    companionObserves     120 m
    pursuitFades          540 m
    distantPresence       720 m
    pursuitBegins       1 080 m
    pursuitIntensifies  1 650 m

Field walks run 17-134 m. Bounded pursuit is one of the product's pillars and had
never once been reachable on device — the companion could only ever draw near,
move ahead, or sit quiet, which is what "feels dead" actually meant.

Distance still leads, on a scale a real walk reaches (`/1200`, capped 0.45), plus
a slow duration component (capped 0.20) so a short stroll still develops texture.
Both stay individually capped, so pressure remains bounded rather than a ramp
toward punishment, and the pursuit rules keep their own maximum-pressure gates.

Measured through `WorldState.derive`:

    50 m / 60 s    pressure 0.11   5/10 kinds
    150 m / 180 s  pressure 0.33   6/10   distantPresence, pursuitFades
    400 m / 420 s  pressure 0.53   6/10   pursuitBegins
    800 m / 720 s  pressure 0.65   5/10   pursuitIntensifies; calm kinds recede

Event *frequency* is deliberately unchanged. Raising it broke the frequency
bounds asserted in `WorldEventWeightTuneTests` and `SoloMVPVerticalSliceTests`,
which encode intentional sparseness — this is a variety change, not a density one.

Adds cadence tests that measure yield and vocabulary reach rather than asserting
intent, so future tuning can be judged against numbers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants