Files
claudetools/.claude/memory/feedback_syncro_warranty_product.md
Mike Swanson 0897e5e317 fix(sync): detect untracked-only changes; reconcile timer-era memories
sync.sh: replace `git diff-index --quiet HEAD --` with
`[ -n "$(git status --porcelain)" ]` in both the main-repo (Phase 1) and
vault change-detection, so brand-new untracked files are no longer silently
skipped (the bug Howard hit 2026-04-17). Mark project_sync_script_bug.md
RESOLVED.

.gitignore: exclude the datto BSOD dumps (6 MB zip + 48 MB extracted) so the
detection fix doesn't sweep 54 MB of binaries into the repo.

memory: finish the add_line_item reconciliation — drop legacy "time entry" /
timer-billable framing from feedback_syncro_labor_type and
feedback_syncro_warranty_product (and their index lines); the product-selection
rules themselves are unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 10:19:52 -07:00

3.1 KiB
Raw Blame History

name, description, type
name description type
Syncro — warranty work uses the "Labor- Warranty work" product, never patch a billable product to $0 For warranty/no-charge labor on Syncro tickets, use product_id 1049360 (Labor- Warranty work, $0/hr). Do NOT use a regular labor product with billable=false or a patched price_retail=0. Prices are determined by the product selected; never override the dollar amount to make one product behave like another. feedback

Rule (two parts):

  1. Warranty / no-charge labor uses product 1049360 "Labor- Warranty work" ($0/hr, non-taxable). Don't pick a regular Remote/Onsite/etc. labor product and try to neutralize it.

  2. Prices are set by selecting the correct product. Never change price_retail on a line item to make a different labor product behave like a warranty (or any other) product. If you find yourself reaching for update_line_item to drop a price, that's the signal to back up and pick a different product_id instead.

Why: On 2026-05-06 (ticket #32225 Sombra Residential), I chose product 1190473 (Labor - Remote Business, $150/hr) for a follow-up warranty cleanup, set billable: false on the timer, and assumed the timer flag would zero the line. Syncro silently overrode billable: false and the resulting line came in at $75. I patched price_retail to $0 to "fix" it. Howard caught it: warranty work has a dedicated product in the dropdown, and patching dollar amounts is never how this is solved. The earlier guidance in .claude/commands/syncro.md (the "Warranty / no-charge → use closest labor product with billable=false" rule) was wrong; warranty has its own product just like Onsite, Remote, Emergency, etc., and that product is what should be used.

How to apply:

  • For any warranty / no-charge work: product_id = 1049360, qty = actual hours, no need to patch the line — it generates at $0 because the product's price_retail is $0.
  • The warranty product is $0 by design — don't fake a free line with flags. Its price_retail is $0, so the line generates at $0 from price_retail × quantity. Do NOT take a regular labor product and try to neutralize it with billable: false; that was the original mistake (see Why — and Syncro silently overrode the flag in the timer era anyway). Pick 1049360.
  • Never reach for update_line_item to drop a price as a workaround. If the dollar amount on a line is wrong, the wrong product was selected — undo, pick the correct product, redo. The only legitimate use of update_line_item price_retail is the Syncro auto-gen-zero recovery case (when the auto-line came in at $0 instead of the product's actual rate), and even that is a Syncro bug we're patching around, not a price-management tool.
  • For the dropdown of available labor products, see the rate table in .claude/commands/syncro.md. If the situation doesn't match any of those, ask before improvising.

Where this lands in skill code: .claude/commands/syncro.md — added 1049360 to the labor product table, fixed the warranty branch in the billing workflow, and added an explicit "never patch price_retail to convert products" rule.