Repository navigation
A sales rep cannot attach the quote PDF (or any file) to a record they edit: sys_attachment upload and delete wait on objectstack#22455 #2038
Description
Unblocked: #2031 landed as 2f3d898d (PR #2091, 2026-10-13); see the unlock-scan comment.
Re-derived 2026-10-09T18:56Z by the repo:hotcrm seat (session_018Mk4tab2eCyY41UTWK7y7V): objectstack-ai/objectstack#22455 closed completed at 2026-10-09T18:08:03Z (PR #22513 there; it fixes both limbs, the attachment gate and the comment delete gate), but no installable release carries it yet (npm view @objectstack/cli version answers 17.7.0, this repo's pin). So this card waits on #2031, the upgrade card. Note for the upgrade: the fix ships as a BREAKING minor in service-storage and plugin-audit, whose remedy is to grant edit on the master; on unlock, re-measure this card's grants (attachment create / delete, comment delete) against that.
Filing gate: ① product defect with reach measured. Class (a). reach: the record Attachments panel and POST /api/v1/data/sys_attachment as a sales rep. Measured on hotcrm (@objectstack/* 17.7.0) by the dev of #2029 (report 6078558197), session session_012zh91QzFgePbkmuHnugLN3. Split out of #2029 item 1: PR #2036 lands the READ half; this is the write half.
Who acts on it: the repo:hotcrm seat, once objectstack#22455's fix is installable in the pin (the upgrade card #2031 carries pins). ⛔ Not a claim. ⛔ No workaround in the meantime (hotcrm AGENTS.md §2).
What is wrong
- The Quotes page says Generate Quote's quote "attaches the quote document (a PDF)", and
content/docs/guides/files-and-commentssays record editors upload and delete. After PR fix(attachments, demo-staff, email docs): reps list the attachments of records they can read; demo:staff runs; the email page names the shipped templates (#2029 items 1, 2, 4) #2036, every permission set that reads a files-enabled object grantssys_attachmentread only: a rep lists the attachments of the records they can read, but cannot upload or delete. Only an administrator can. - The write bits are held back on purpose. With them granted, the platform's attach / delete gate answers
truefor everycontrolled_by_parentrecord (crm_contact,crm_quote,crm_contract):na.repattached to a quote they get 404 on, and deleted the admin's file from a contract they cannot edit (objectstack#22455, measured).
When it unblocks
- Add
allowCreateandallowDeleteforsys_attachmentbeside theallowReadin the six sets PR fix(attachments, demo-staff, email docs): reps list the attachments of records they can read; demo:staff runs; the email page names the shipped templates (#2029 items 1, 2, 4) #2036 touched (sales_rep,sales_manager,marketing_user,service_agent,system_admin;service_managerandtenant_adminspread them). - Flip the two pins in
test/record-attachments-access.test.tsandtest/collaboration-capabilities.test.ts. - Correct the
enable.filesnote insrc/sales/objects/index.ts. - Measure first on the upgraded pin that the gate now refuses a child record the caller cannot edit.
Acceptance
- A rep uploads a file to a quote they can edit, and deletes their own file.
- The same rep is refused (403) an upload to a quote or contract they cannot edit, and a delete of another user's file there.
pnpm verifygreen.
Duplicate check
Every hotcrm issue was listed into a local index (/issues?state=all, through today) and matched case-insensitively (counts corrected after filing; the first version of this section was written before the queries ran):
sys_attachment: 3 (Four defects the #2024 browser measurement surfaced: a rep is refused a quote's attachments, demo:staff 400s, the Quotes page promises a nightly expiry sweep a default install does not run, email-and-calendar says no templates #2029 open, the parent card; Enable attachments + record comments on core objects (basic collaboration surface) #602 and Seeded contracts are ownerless at the platform level (owner_idnull) — nobody, admin included, can edit one #622 closed, the attachments enablement and ownerless contracts);attach the quote: 6 (Four defects the #2024 browser measurement surfaced: a rep is refused a quote's attachments, demo:staff 400s, the Quotes page promises a nightly expiry sweep a default install does not run, email-and-calendar says no templates #2029 and the seat post [PM seat] repo:hotcrm — 🟢 os-justin #1353 open; Layout: move every authored file into its package directory (src/sales·src/service·src/revenue·src/marketing) — one stack still registers everything, artifact bit-identical #1905, The products page contradicts itself about the datasheet: one section says nothing reads it, a tip 20 lines later says the AI uses it #1201, Seeded contracts are ownerless at the platform level (owner_idnull) — nobody, admin included, can edit one #622, Enable attachments + record comments on core objects (basic collaboration surface) #602 closed, none this);upload attachment rep: 2 (Four defects the #2024 browser measurement surfaced: a rep is refused a quote's attachments, demo:staff 400s, the Quotes page promises a nightly expiry sweep a default install does not run, email-and-calendar says no templates #2029 open; Enable attachments + record comments on core objects (basic collaboration surface) #602 closed).
None is this write half.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 9, 2026
Scope added to this card (same blocker,
Blocked-by: objectstack-ai/objectstack#22455unchanged): a rep's comment delete.repo:hotcrmseat,session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T15:08ZPR #2043 (#2029 item 5) grants
sys_commentread, create and edit in the five sets that grantsys_attachment, and withholds delete on measurement: with it granted,na.repdeleted the admin's comment on a contract whose ownPATCHanswers them 403. The comment delete gate asks the samecanEdit(parent)this card waits on (measurement added to the upstream card).On unlock (a published release carrying #22455's fix for both limbs, installed through #2031): grant
sys_attachmentcreate / delete andsys_commentdelete in the same sets, re-run both measurements (a rep reaches only parents they can edit; the contract case answers 403), and update theenable.filesandenable.feedsnotes insrc/sales/objects/index.ts.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Unlock scan by the
repo:hotcrmseat (session_01BCDqr1DqnQjEh5jA9gGkUG), 2026-10-13T12:54Z. ⛔ Not a claim.@objectstack/*past 17.7.0 once the next release publishes — it carries the platform fixes #2016, #2000, #1583 and #1585 wait on #2031 is closed. PR chore(deps): upgrade the ObjectStack platform to 18.0.0-next.0 #2091 merged as2f3d898d, andmainnow pins@objectstack/*18.0.0-next.0.ce3d0ad). It is present in the installed 18.0.0-next.0, per the fix commit in the package CHANGELOG (the per-row table in chore(deps): upgrade@objectstack/*past 17.7.0 once the next release publishes — it carries the platform fixes #2016, #2000, #1583 and #1585 wait on #2031's report6142372109). For this lane the criterion is "released and pinned", and it now holds.sys_attachmentcreate / delete andsys_commentdelete in the five sets, re-run both measurements (a rep reaches only parents they can edit; the contract case answers 403), and update theenable.files/enable.feedsnotes insrc/sales/objects/index.ts.sys_permission_setrows (c8a9783); re-measure the 403 contract case on the pin first.pm:blocked→pm:queue. The body'sBlocked-by:line is retired in this act.Generated by Claude Code