ABSoW proposal generator — determinism rules (session 64, 2026-07-30)
Context: VAB-9004 (282 Heron Cove Lane) regenerations returned differing change counts. Root causes: sampling nondeterminism on the brand-name judgment (SettleStop IntelliJack ↔ SUP-COL) and no filter on no-op set_qty “confirmation” items. A third observed run was actually 325 Azalea Ln — misattribution.
Rules now in services/absow_proposal_service.py (entirely-api 3d08410…e9d2a9b):
- Prompt includes the product catalog (via
permit_parser._build_product_catalog_text) + brand aliases: SettleStop IntelliJack = SUP-COL, SettleStop push pier = UND-PUSH. Brand-name match to an existing SOW line = same product, never a manual/product-type item. - Items are for changes only; new scope with no SOW line is always one
manualitem per new line. _is_noop_qty()deterministically dropsset_qtyproposals equal to the recorded as-built (or equal to permitted when as-built unset). Restore-to-permitted over a differing as-built is kept.temperatureis NOT usable — claude-opus-4-7 rejects sampling params with a 400. Determinism on Opus 4.7+ comes from prompt rules + code-side post-filters only.
Related: absow-proposal-service permit-parser product-brand-aliases