P1 (Platform) of the qbit-crm 0.2.0 design (docs/DESIGN.md):
Build: parent qbit-build-parent 2.1.2 with guardrails enforced and strict UI API routes; QQQ 4.1.0-RC.6 through the qqq-snapshot BOM profile; Java 21; Maven wrapper; CircleCI orb 0.6.9; JaCoCo gate (70% instructions, 90% classes).
Names: every table, process, widget and join is crm_ snake_case. Backend names equal table names, and columns are snake_case (inferBackendNames, default true).
Removed: the bespoke tag tables and bulk tag processes, crmAttachment, crmAuditLog and its customizer. Contact, company, deal and activity use core FIELD-level audit instead. Dead config options are removed.
Security: new permission rules (crm, crm.manage, crm.admin, DenyBehavior.HIDDEN) on every table, process and widget, plus sourceQBitName provenance.
Schema: reference Postgres DDL (docs/ddl/postgres.sql) and a Liquibase changelog (db/liquibase/qbit-crm/crm.changelog.sql) for 33 tables. H2 tests run the DDL and persist through the RDBMS backend.
Docs: README and CHANGELOG are corrected. DESIGN.md now says 0.2.0 is a fresh install with no Voyage compatibility (owner decision, 2026-10-14).
Implemented by Codex, reviewed and committed by Claude.
## Summary
P1 (Platform) of the qbit-crm 0.2.0 design (docs/DESIGN.md):
- **Build:** parent `qbit-build-parent` 2.1.2 with guardrails enforced and strict UI API routes; QQQ 4.1.0-RC.6 through the `qqq-snapshot` BOM profile; Java 21; Maven wrapper; CircleCI orb 0.6.9; JaCoCo gate (70% instructions, 90% classes).
- **Names:** every table, process, widget and join is `crm_` snake_case. Backend names equal table names, and columns are snake_case (`inferBackendNames`, default true).
- **Removed:** the bespoke tag tables and bulk tag processes, `crmAttachment`, `crmAuditLog` and its customizer. Contact, company, deal and activity use core FIELD-level audit instead. Dead config options are removed.
- **Security:** new permission rules (`crm`, `crm.manage`, `crm.admin`, `DenyBehavior.HIDDEN`) on every table, process and widget, plus `sourceQBitName` provenance.
- **Schema:** reference Postgres DDL (`docs/ddl/postgres.sql`) and a Liquibase changelog (`db/liquibase/qbit-crm/crm.changelog.sql`) for 33 tables. H2 tests run the DDL and persist through the RDBMS backend.
- **Docs:** README and CHANGELOG are corrected. DESIGN.md now says 0.2.0 is a fresh install with no Voyage compatibility (owner decision, 2026-10-14).
Implemented by Codex, reviewed and committed by Claude.
## Test plan
- [x] `./mvnw verify`: 371 tests, 0 failures; checkstyle clean; JaCoCo 91% instructions, 99% classes; guardrails G1/G4/G7 pass
- [x] H2 schema test: 33 tables, unique keys, persistence of 7 entity types, DDL and changelog parity
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
P1 (Platform) of the qbit-crm 0.2.0 design (docs/DESIGN.md):
qbit-build-parent2.1.2 with guardrails enforced and strict UI API routes; QQQ 4.1.0-RC.6 through theqqq-snapshotBOM profile; Java 21; Maven wrapper; CircleCI orb 0.6.9; JaCoCo gate (70% instructions, 90% classes).crm_snake_case. Backend names equal table names, and columns are snake_case (inferBackendNames, default true).crmAttachment,crmAuditLogand its customizer. Contact, company, deal and activity use core FIELD-level audit instead. Dead config options are removed.crm,crm.manage,crm.admin,DenyBehavior.HIDDEN) on every table, process and widget, plussourceQBitNameprovenance.docs/ddl/postgres.sql) and a Liquibase changelog (db/liquibase/qbit-crm/crm.changelog.sql) for 33 tables. H2 tests run the DDL and persist through the RDBMS backend.Implemented by Codex, reviewed and committed by Claude.
Test plan
./mvnw verify: 371 tests, 0 failures; checkstyle clean; JaCoCo 91% instructions, 99% classes; guardrails G1/G4/G7 pass🤖 Generated with Claude Code