Decisions we still need to make. Grouped by where the answer lives. Resolved items are kept (not deleted) with their decision, so the history of what we settled — and why — stays legible.
Pricing
- Daily vs weekly multipliers — RESOLVED: 3-day week. Shipped.
The quote engine charges
week_multiplierdays per week (default 3.00), weeks stack, and the per-week remainder is capped at one week's charge. A manual per-item weekly override replaces the derived week price. - Deposit % of replacement value — RESOLVED: 100%.
Shipped. Gear deposit =
deposit_percent(now1.00, migration0005) × cart replacement value. There's no gear-insurance market in Colombia, so a full-replacement hold is the protection;deposit_minimum_usd_cents($500.00) is dormant at 100% and only bites if the percentage is ever lowered. Studio-space lines add their own flat damage deposit. - VAT/IVA — RESOLVED: 19% on the net total, added at checkout.
Shipped.
iva_rate(default 0.190) is applied to the net total (subtotal − discount + waiver), not to per-day rates. Day rates are quoted net of IVA; the engine returns net and gross. - Currency — RESOLVED: USD cents canonical, COP display-only.
Shipped. Every stored amount is USD cents. COP is a display
conversion at a snapshotted rate; each reservation freezes
fx_rate_snapshotfrom the orgcop_per_usd_snapshotsetting at creation. Stripe handles USD; Wompi can present COP, but the ledger stays USD cents. - Weekend rate — RESOLVED: a weekend is 3 days at the day rate.
A weekend = Friday + Saturday + Sunday = 3 calendar days, each
billed at the normal day rate. No surcharge, no discount. The quote
engine already bills calendar days, so this is current behavior —
nothing new to compute. The
weekend_multipliersetting is kept (default 1.00 = day rate) as a dormant, no-op lever for future weekend pricing, but it is NOT applied per-day today. - Damage waiver — RESOLVED: not offered. studio.chat does not
offer a damage waiver. There's no gear-insurance market in Colombia,
so the 100% replacement-value deposit is the sole damage and loss
protection (there is no insurance or COI — see Vetting, below). The
quote engine keeps a
damage_waiver_usd_centsfield as dormant plumbing, but no waiver is ever presented or sold to renters. - Late return fee — half decided. The daily overdue cron
(shipped 2026-06-10) flags confirmed reservations past
return_at+late_grace_minutes(60) and computes the per-day model (late_per_day_factor× per-day line total) into the audit payload as advisory numbers. Open: whether/when the desk actually charges it, and whether charging ever becomes automatic. - Half-day rate —
half_day_multiplierexists (default 0.60) but the engine floors every rental at 1 full day, so half-day is configured but not computed. Value + wiring open. - Cleaning / sanitization fee — RESOLVED: it's a condition penalty, not a flat fee. There is no standing cleaning/sanitization fee. Instead, a percentage charge is applied at return/inspection IF an item is not returned in the same condition it went out in. The percentage is still TBD, and this is NOT built yet — no charge surface exists. Documented as policy; the % and the wiring are both pending.
- Multi-item discount tiers — RESOLVED: none (for now). No multi-item or volume discounts are offered. Carts are billed at the sum of their line items with no quantity break. (Bundles/kits as a priced unit are deferred — see Inventory below.)
Vetting
RESOLVED: there is no vetting and no insurance. The entire vetting/insurance concept is removed. The rental gate is simply: pay the 100% deposit, provide ID, and have a verified contact phone and email. Nothing else — no tiers, no COI, no proof of project, no first-time-renter limits, no student grades. The 100% replacement-value deposit (Pricing, above) is the only loss-and-damage protection.
Schema teardown: done — migration
0005removed the vetting/insurance schema (rental_tierenum,items.tier,items.requires_coi,settings.tier_b/c_*) entirely.
- Insurance threshold — RESOLVED: no insurance, no threshold. No COI is ever required, at any replacement value. The deposit is the protection.
- Acceptable insurance providers — RESOLVED: n/a. We never receive COIs.
- ID + proof of address — RESOLVED: ID only (no proof of address). A valid government-issued photo ID (cédula, passport, or equivalent) plus a verified contact phone and email. No proof of address is required.
- First-time renter limits — RESOLVED: none. No cap by replacement value or category for first-time renters. The gate is the same for everyone: deposit, ID, and verified contact.
- Student rate / discounts — RESOLVED: none. No student rate and no student gradation.
- Outside Medellín — only pickup in MDE, or do we ship for a fee?
Operations
- Hours of pickup/return — RESOLVED and shipped (2026-06-10):
office-configurable weekly schedule.
/office/schedulesdefines per-day windows marked open (walk-in) or by reservation (staff present for scheduled handoffs); the reservation form offers pickup/return only as one-hour blocks inside those windows. Defaults: Tue–Fri open 9–12 + 13–17 and by-reservation 17–21; weekends by-reservation 9–21; Mondays closed. (This superseded the earlier "return by 11:00, pickup at 14:00" interim defaults.) - Who runs the desk — RESOLVED: Karen. The desk is run by Karen. Inquiry notifications reach the desk over Slack (the decided inquiry channel — no longer email-or-Slack-TBD).
- Inspection checklist — RESOLVED (2026-06-11): both directions,
with hard blocks. Pickup and return each get a signed per-line
condition report (the §6 category checklists in
processes.md); gear can't scan out until the pickup report is signed, and a reservation can't settle until the return report is signed. Signatures are captured in-house at the counter (drawn canvas + evidence record). The UI build is queued; until it ships, inspections run on paper. - Where do rentals physically live — same room as production gear or a separate cage / shelf?
- Production lock-out + lead-time window — RESOLVED:
confirmed-reservation-wins, no recalls, no configurable window.
Once a reservation is confirmed (
confirmed) by any party, its gear is unavailable to everyone, including internal studio.chat productions — gear is never recalled from a renter. Internal needs are expressed as blackouts (asset_blackouts/space_blackouts) entered before a conflicting booking confirms; whoever confirms first holds the dates. studio.chat may cancel its own unpaid internal plans (an admin does this in the system) to free dates for a paying client; that's the only override, and no special system accommodation is built for it. There is no lead-time "window" to set:blackout_default_dayswas dropped in migration0002, so blackouts are explicit date ranges, not an implicit buffer. Seeprocesses.md§1, §3.8, §8. - Reservation hold window — RESOLVED: 1 week, enforced
(2026-06-10). The hourly expire-holds cron cancels
heldreservations a week afterheld_at(cancel_reason='hold_expired', audited as system). The window is a documented constant; an office-configurable settings field remains a small follow-up.
Tech
- Where does the inventory live — RESOLVED: Supabase Postgres
(DB-canonical). Shipped. The catalog lives in Postgres (
items/assets/spaces). A Google Sheet was the original authoring source, but the sheet-sync subsystem (the importer,sync_events, and theinventory_canonical_sourceswitch) was removed in migration0005; the DB is now canonical. See../architecture/inventory-provenance.mdfor the emergency re-import. - Where do reservations live — RESOLVED: same Supabase DB.
Shipped.
reservationsand children (reservation_items,payments,claims,audit_log) sit in the same Postgres database as inventory. - Payments — RESOLVED: Stripe for USD, Wompi for COP. The split
is decided: Stripe collects USD, Wompi collects COP, and the two
coexist per row (the
payment_providerenum carries both). The ledger stays USD cents either way. Still deferred / not wired live — the provider split is settled, but live collection isn't built yet. - Contract generation — RESOLVED and shipped (2026-06-11):
in-office templates.
/office/contractsholds markdown templates with merge fields, rendered per-reservation with a live preview and a print-to-PDF page; executed PDFs upload to a private bucket and are searchable in the archive. (Google Drive was deliberately not used — rendering control was the requirement.) - E-signature — RESOLVED in three stages (2026-06-11). (1) Counter signatures (condition reports) will be captured in-house — drawn canvas + evidence record — with the inspection UI; no vendor at the counter. (2) Remote contract signing stays manual Google Docs for now (low volume). (3) When volume justifies automation, the penciled-in vendor is an API-first service (Documenso or similar) firing envelopes from the reservation flow. Slack notifications remain unwired.
- Contract template wording — draft from scratch, adapt an industry-standard rental MSA (e.g. PRO-T-ON, Camera Rental Agreement), or have a lawyer draft one? (Delivery and execution are decided above; the actual clause text is still open — see Legal.)
- Soft-delete / archival — RESOLVED: shipped (migration 0004).
reservations,clients, andshort_linkscarry adeleted_atmarker; archiving from the/office/dataconsole hides the row from every normal view while keeping it restorable or purgeable. Catalog tables (items / assets / spaces) are intentionally excluded for now because archiving one must also hide it from the public catalog and pickers — tracked separately. Reservation state changes are written to an append-onlyaudit_log(sourceuser|api). - Admin UI — RESOLVED: in-Next.js
/office, all the way. The office covers the full operation (reservations, inventory, kits, contracts, clients, finances, settings, team, audit); no Retool/ Airtable/external tooling, and nothing suggests changing that. - Photo/file storage — RESOLVED: Supabase Storage. Public
mediabucket for catalog imagery; privatecontractsbucket (signed URLs) for executed PDFs; condition-report photos will use a private bucket the same way when the inspection UI ships.
Inventory
- Replacement value ≠ purchase cost — RESOLVED (no rename).
items.replacement_value_usd_centsis now an admin-maintained real replacement value (not the purchase price); the importer no longer writes it, and "Approximate Value" feeds onlyassets.acquired_cost_usd_cents. Areplacement_value_updated_atstamp tracks freshness. Populate/refresh via the runbook: ../operations/replacement-prices.md. - Public visibility — RESOLVED: no public prices. Prices are not shown publicly. The catalog is "contact us / request a quote"; rates live only in the quote.
- Item bundles / kits — half shipped (2026-06-11).
/office/inventory/kitsmanages kits and the reservation picker expands one into its member item lines at normal per-item pricing (a shortcut, not a priced product). Still open: whether a kit ever becomes a priced unit with its own bundled rate. - Serial-numbered vs fungible — RESOLVED: both layers. Shipped.
itemsare models;assetsare individual serial-tracked units of a model. Reservation lines reference an item + qty and bind to specificassetsat pickup (per-unit check-out/check-in), so we get model-level catalog plus unit-level tracking. - Items we don't own but can broker (sub-rentals) — RESOLVED: not policed. studio.chat doesn't care if a renter sub-rents the gear. The only requirements are that the rental is paid for and returned on time in the same condition. This is a contract term, not an operational gate, so there's no brokering workflow to build.
- Consumables (gels, tape, batteries) — RESOLVED: out of scope. Not sold or rented today. A consumables store is a possible future add-on; for now renters buy these at a camera store.
Brand
- Naming: keep as "studio.chat rentals" or a sub-brand?
- Lead from production or rentals on a returning visitor? Cookie / preference?
- Do we publish prices publicly — RESOLVED: no. Prices are not public; the catalog is "request a quote" only (see Inventory → Public visibility).
- Social proof on rental page — list productions that have used the gear, or stay quiet about specifics?
Legal
Model: deposit-only. The 100% replacement-value deposit covers loss and damage. Sub-rental and cross-border are not policed beyond "paid + returned on time in the same condition." The contract is generated via Google Docs and emailed for e-signature, with execution tracked and Slack notifications on contract events (designed, not yet built — see Tech). Frame the contract around this deposit-only model.
- Loss vs damage — RESOLVED: combined under one deposit. Both loss and damage are covered by the single 100% replacement-value deposit; there is no separate loss instrument or insurance.
- Sub-rental / re-rental — RESOLVED: not policed. The renter may let someone else use the gear; studio.chat doesn't gate on it. The only obligation is paid + returned on time in the same condition — a contract term, not an operational restriction.
- Customs / cross-border — RESOLVED: not policed. Same as sub-rental: cross-border use isn't restricted beyond paid + returned on time in the same condition. No customs workflow.
- Liability cap — whether the contract caps the renter's liability (and at what), and the exact clause wording, remain open for counsel. The deposit is the practical ceiling on what studio.chat holds, but the contractual cap is genuinely unaddressed.
What we need from Brandon to unblock
Resolved since this list was written: the rate model (3-day week), the
weekend rate (3 day-rate days, no surcharge), the currency model (USD
cents canonical, COP display-only), the inventory home (Supabase
Postgres; the sheet importer was removed in 0005 — the DB is canonical),
the payment-provider split (Stripe for USD, Wompi for COP — though not
wired live yet), the production lock-out rule (confirmed-reservation-wins,
no recalls, no configurable window), the damage-waiver question (not
offered), the vetting/insurance concept (removed entirely — gate is
deposit + ID + verified contact), the cleaning fee (a condition penalty,
%-TBD, not built), pickup/return hours (the office-configurable weekly
schedule, shipped), public price visibility (no — quote only), kits
(shipped as unpriced shortcuts), sub-rentals and cross-border (not
policed), consumables (out of scope), contract generation (in-office
templates, shipped) and signing (in-house at the counter; Google Docs
manual remotely for now), the desk operator (Karen), and the hold window
(1 week, cron-enforced) are all decided.
The inventory sheet is no longer needed: production already holds the real catalog, and new items are added one at a time via the office (or an agent) later — there is no bulk import step.
Still genuinely needed:
- The cleaning-fee percentage (the condition-penalty rate applied at return when an item isn't returned in the same condition). Policy is decided; the number is not, and no charge surface is built yet.
- The rental-contract clause wording, including any liability cap, to be finalized with counsel.