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 3d08410e9d2a9b):

  • 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 manual item per new line.
  • _is_noop_qty() deterministically drops set_qty proposals equal to the recorded as-built (or equal to permitted when as-built unset). Restore-to-permitted over a differing as-built is kept.
  • temperature is 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