Implements #43 — the two remaining good traits get deterministic, seeded mechanical effects in the explore resolver (v0.12.0):
FINDS HIDDEN THINGS → exploration hauls gain +1 item: one extra rollExploration(rng) call on the same seeded per-planet stream, appended to the haul.
TALKS TO ANYONE → crew-recruit chance raised 18% → 30% (new optional chance param on rollCrewMember, defaulting to CREW_CHANCE).
Consumes the already-present RECRUIT_CHANCE_BASE / RECRUIT_CHANCE_TALKER constants from lib/game/crew-costs.ts. No new tables, no new constants.
Determinism
Outcome stays a pure function of (seed, planetId, assigned team). The no-trait path (leadCrewId=0 / empty helpers) is byte-identical to v0.11.0 — a single new unit test pins RECRUIT_CHANCE_BASE === CREW_CHANCE so the two 0.18 constants can't silently diverge and break that pin.
Tests
3 new unit cases in lib/game/save.test.ts: no-trait regression pin; FHT "+1 item / haul-prefix / reproducible across independent runs"; TALKS-TO-ANYONE constant pins + end-to-end discrimination on a planet whose recruit gate falls in [0.18, 0.30).
OpenAPI prose updated (crewFound ~18% → 30% when the team has TALKS TO ANYONE); response shape unchanged, openapi.test.ts untouched.
Local (e2e is CI-only): tsc --noEmit clean, 185/185 vitest, playwright test --list OK.
## What
Implements #43 — the two remaining good traits get deterministic, seeded mechanical effects in the explore resolver (v0.12.0):
- **FINDS HIDDEN THINGS** → exploration hauls gain +1 item: one extra `rollExploration(rng)` call on the same seeded per-planet stream, appended to the haul.
- **TALKS TO ANYONE** → crew-recruit chance raised 18% → 30% (new optional `chance` param on `rollCrewMember`, defaulting to `CREW_CHANCE`).
Consumes the already-present `RECRUIT_CHANCE_BASE` / `RECRUIT_CHANCE_TALKER` constants from `lib/game/crew-costs.ts`. No new tables, no new constants.
## Determinism
Outcome stays a pure function of (seed, planetId, assigned team). The no-trait path (leadCrewId=0 / empty helpers) is **byte-identical to v0.11.0** — a single new unit test pins `RECRUIT_CHANCE_BASE === CREW_CHANCE` so the two 0.18 constants can't silently diverge and break that pin.
## Tests
- 3 new unit cases in `lib/game/save.test.ts`: no-trait regression pin; FHT "+1 item / haul-prefix / reproducible across independent runs"; TALKS-TO-ANYONE constant pins + end-to-end discrimination on a planet whose recruit gate falls in [0.18, 0.30).
- OpenAPI prose updated (crewFound ~18% → 30% when the team has TALKS TO ANYONE); response shape unchanged, `openapi.test.ts` untouched.
- Local (e2e is CI-only): `tsc --noEmit` clean, 185/185 vitest, `playwright test --list` OK.
Closes #43.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
Implements #43 — the two remaining good traits get deterministic, seeded mechanical effects in the explore resolver (v0.12.0):
rollExploration(rng)call on the same seeded per-planet stream, appended to the haul.chanceparam onrollCrewMember, defaulting toCREW_CHANCE).Consumes the already-present
RECRUIT_CHANCE_BASE/RECRUIT_CHANCE_TALKERconstants fromlib/game/crew-costs.ts. No new tables, no new constants.Determinism
Outcome stays a pure function of (seed, planetId, assigned team). The no-trait path (leadCrewId=0 / empty helpers) is byte-identical to v0.11.0 — a single new unit test pins
RECRUIT_CHANCE_BASE === CREW_CHANCEso the two 0.18 constants can't silently diverge and break that pin.Tests
lib/game/save.test.ts: no-trait regression pin; FHT "+1 item / haul-prefix / reproducible across independent runs"; TALKS-TO-ANYONE constant pins + end-to-end discrimination on a planet whose recruit gate falls in [0.18, 0.30).openapi.test.tsuntouched.tsc --noEmitclean, 185/185 vitest,playwright test --listOK.Closes #43.