Drop the Comp AI CRM acknowledgement
CI / verify (push) Successful in 3m33s
CI / publish (push) Has been skipped

Nothing in PIG derives from that repository. The fact model, the leased
agent task queue and the `agentBrief` field are our own designs, and MIT's
attribution condition reaches copied source, not ideas — so the credit was
a courtesy that misstated where this code came from.

The one line worth keeping was never a credit: AGENTS.md's rule against
lifting component files out of somebody else's repo. It is restated
generically, and the shadcn-from-upstream guidance stays.

Buzz keeps its NOTICE entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-13 23:41:10 -07:00
parent d7e0cbeccc
commit 76e3caa1cb
6 changed files with 28 additions and 38 deletions
+3 -3
View File
@@ -303,9 +303,9 @@ agent for it.
## 8. What not to do
- Do not copy component files from `trycompai/crm`. Most are shadcn/ui
originals — take them from upstream where they are canonical. Borrow the
compositions as ideas; the debt is credited in `NOTICE`.
- Do not copy component files out of other people's repositories. Where a
primitive is a shadcn/ui original, take it from upstream, where it is
canonical and current. Compositions we write ourselves.
- Do not open self-registration on the identity provider. It is shared with
another application. PIG mints accounts itself, gated on an invite.
- Do not put a production SSH key on the CI runner. Deployment is manual on
+3 -8
View File
@@ -19,14 +19,9 @@ limitations under the License.
ACKNOWLEDGEMENTS
Several architectural ideas in this project were studied from, and are
gratefully credited to, the following open-source projects. No source code
was copied from them; the debt is one of design.
Comp AI CRM (https://github.com/trycompai/crm) — MIT License.
The evidence-banded fact model, the leased database-backed agent task
queue, the agent-brief pattern on user-defined fields, and the
"intelligence never lives in the API" separation.
One architectural idea in this project was studied from, and is gratefully
credited to, the following open-source project. No source code was copied
from it; the debt is one of design.
Buzz (https://github.com/block/buzz) — Apache License 2.0.
The agent-as-workspace-member model that informed PIG's treatment of
+2 -3
View File
@@ -586,6 +586,5 @@ will be removed.
## Licence
Apache License 2.0 — see [LICENSE](./LICENSE) and [NOTICE](./NOTICE). The
architectural debts to [Comp AI CRM](https://github.com/trycompai/crm) (MIT)
and [Buzz](https://github.com/block/buzz) (Apache-2.0) are credited in NOTICE.
No source code was copied from either.
architectural debt to [Buzz](https://github.com/block/buzz) (Apache-2.0) is
credited in NOTICE. No source code was copied from it.
+17 -19
View File
@@ -152,31 +152,29 @@ any native mobile application.
---
## On borrowing from Comp AI CRM
## On the component library
Their repo (MIT) was cloned and inventoried early on, and three findings shaped
the plan. All three have since been acted on.
Three gaps were identified in an early review of the front end. All three have
since been acted on.
**Their component library was far deeper — 68 primitives to our 9 at the time.**
PIG now has 22, including the ones that mattered: `data-table`, `command`,
`sheet`, `drawer`, `sidebar`, `form`. The agent-chat compositions
(`message`, `reasoning`, `thinking-indicator`) were rebuilt rather than copied,
inside `PiggyChat.tsx`.
**The primitive set was too thin — 9 at the time.** PIG now has 22, including
the ones that mattered: `data-table`, `command`, `sheet`, `drawer`, `sidebar`,
`form`. The agent-chat compositions (`message`, `reasoning`,
`thinking-indicator`) are ours, written inside `PiggyChat.tsx`.
**`SourcedValue` / `Provenance` was worth adopting outright** — a dotted
underline on any agent-derived value, with a tooltip carrying the claim, the
reasons, when it was observed and the source URL. PIG already held that data in
`facts` and surfaced none of it. It does now.
**`SourcedValue` / `Provenance` had to exist** — a dotted underline on any
agent-derived value, with a tooltip carrying the claim, the reasons, when it was
observed and the source URL. PIG already held that data in `facts` and surfaced
none of it. It does now.
**We were ahead of them on mobile, not behind**, and the ratio has held: PIG is
63 `.tsx` files with safe-area handling, a bottom tab bar, a sidebar Sheet and a
hard rule that no route may scroll sideways at 393px. Their app is effectively
**Mobile is a lead, and the ratio has held:** PIG is 63 `.tsx` files with
safe-area handling, a bottom tab bar, a sidebar Sheet and a hard rule that no
route may scroll sideways at 393px. Most tools in this category are effectively
desktop-only.
**Do not copy their component files.** Most are shadcn/ui originals, which are
MIT and designed to be installed from upstream — take them from source, where
they are canonical and current. Borrow the compositions as ideas, and credit in
`NOTICE` as already done.
**Where a primitive is a shadcn/ui original, install it from upstream**, where
it is canonical and current — not lifted out of somebody else's repository.
Compositions we write ourselves.
---
-2
View File
@@ -17,8 +17,6 @@
*
* 3. **Every outward action is idempotent.** `agentActions` carries a unique
* idempotency key, so a retried task cannot send the same message twice.
*
* The pattern is adapted from Comp AI CRM (MIT); see NOTICE.
*/
import {
index,
+3 -3
View File
@@ -3,9 +3,9 @@
*
* Every CRM grows fields its designers did not anticipate, and a schema that
* refuses them is a schema that gets worked around in a spreadsheet. The
* variant here carries one idea worth borrowing from Comp AI CRM (MIT, see
* NOTICE): `agentBrief` a prose instruction telling the agent *how* to fill
* this particular field. A custom field is otherwise opaque to an agent, which
* variant here carries one idea the usual designs miss: `agentBrief` a prose
* instruction telling the agent *how* to fill this particular field. A custom
* field is otherwise opaque to an agent, which
* knows the column exists but nothing about what would constitute a good value.
*/
import {