Open
mAi
wants to merge 8 commits from
mai/kepler/inventorcoder-project into main
pull from: mai/kepler/inventorcoder-project
merge into: m:main
m:main
m:mai/planck/coder-b5-b6-train-share
m:mai/archimedes/fixer-port-engine
m:mai/maxwell/coder-b4-akte-mode
m:mai/lorenz/coder-b3-event-triggered
m:mai/euler/fixer-builder-add
m:mai/brunel/fixer-prod-500s-after-b1
m:mai/galileo/coder-b1-b2-mvp-train
m:mai/pasteur/fixer-pkg-litigationplann
m:mai/newton/coder-b0-scenario-db
m:mai/edison/inventor-prd-columnar
m:mai/knuth/coder-workflow-tracker
m:mai/atlas/inventor-extend-tools
m:mai/cronus/inventor-unified
m:mai/atlas/inventor-deadline-system
m:mai/atlas/inventor-followup-rules
m:mai/athena/consultant-deadline
m:mai/brunel/fixer-dark-mode-support
m:mai/knuth/coder-cronus-fristenrechn
m:mai/ritchie/coder-mig-153-proceeding
m:mai/atlas/inventor-proceeding
m:mai/cronus/inventor-fristenrechner
m:mai/curie/coder-mig152-clone-dedupe
m:mai/darwin/researcher-lexy-draft
m:mai/knuth/coder-dedupe-null
m:mai/cronus/coder-composer-slice-f
m:mai/cronus/coder-composer-slice-e
m:mai/cronus/coder-composer-slice-d
m:mai/curie/coder-slice-b6-url-rename
m:mai/curie/coder-slice-b5-go-rename
m:mai/cronus/coder-composer-slice-c
m:mai/curie/coder-slice-b4-destructive-drop
m:mai/cronus/coder-composer-slice-b
m:mai/cronus/coder-composer-slice-a
m:mai/cronus/inventor-prd-for
m:mai/knuth/coder-verfahrensablauf
m:mai/ritchie/coder-make-backup
m:mai/diesel/fixer-dark-mode-css
m:mai/curie/coder-slice-b3-read-cutover
m:mai/diesel/fixer-verfahrensablauf
m:mai/curie/coder-slice-b2-dual-write
m:mai/cronus/coder-slice-d-scenarios
m:mai/knuth/coder-backfill-applies
m:mai/hermes/gitster-verfahrensablauf
m:mai/cronus/coder-berufung-labels-refactor
m:mai/diesel/hotfix-2-mig-134-missing
m:mai/curie/coder-slice-b1-procedural-events
m:mai/cronus/coder-slice-c-upc-snapshot
m:mai/brunel/hotfix-rename-upc-apl
m:mai/cronus/coder-slice-b3-primary-party
m:mai/cronus/coder-slice-b2-catalog-query
m:mai/cronus/inventor-litigation-slice-b
m:mai/curie/researcher-slice-b-zero
m:mai/cronus/inventor-litigation
m:mai/artemis/gitster-remove-admin
m:mai/ritchie/coder-sort-post-trigger
m:mai/knuth/coder-conditional-label
m:mai/hermes/coder-verfahrensablauf
m:mai/brunel/rebase-121-conditional
m:mai/knuth/coder-conditional-rule
m:mai/hermes/gitster-dark-mode-fix
m:mai/ritchie/coder-submission-form
m:mai/artemis/gitster-re-surface
m:mai/brunel/fixer-views-any-filters
m:mai/cronus/coder-cicd-slice-a
m:mai/knuth/coder-wave-1-tier-1-rule
m:mai/ritchie/coder-upc-damages-add
m:mai/cronus/inventor-ci-cd-pre
m:mai/brunel/rebase-108-language
m:mai/hermes/gitster-admin-rules-list
m:mai/artemis/gitster-submission
m:mai/icarus/gitster-verfahrensablauf
m:mai/orpheus/gitster-search-input
m:mai/atlas/coder-event-card-choices-slice-ab
m:mai/hermes/gitster-date-range
m:mai/demeter/gitster-submission
m:mai/knuth/coder-hl-patents-style
m:mai/hermes/gitster-draft-editor
m:mai/atlas/inventor-per-event-card
m:mai/knuth/coder-deadline-rule-tier
m:mai/cronus/coder-procedural-events-slice-a
m:mai/hermes/gitster-deadline-form
m:mai/artemis/gitster-add-missing-i18n
m:mai/demeter/gitster-paliadin-chat
m:mai/brunel/wave0-tier0-deadline-fixes
m:mai/artemis/coder-docker-compose-yml
m:mai/icarus/coder-inbox-overhaul-slice-a
m:mai/atlas/coder-date-range-picker-slice-a
m:mai/brunel/fixer-de-inf-lg-cfi
m:mai/cronus/inventor-procedural
m:mai/hermes/gitster-event-type-modal
m:mai/cronus/coder-backup-mode
m:mai/curie/researcher-bulletproof
m:mai/hermes/gitster-draft-editor-focus-jump
m:mai/cronus/inventor-backup-mode
m:mai/hermes/gitster-submissions
m:mai/artemis/gitster-deadline-form
m:mai/brunel/fixer-submission-preview
m:mai/brunel/fixer-test-data-reset
m:mai/artemis/gitster-approval-withdraw
m:mai/demeter/gitster-events
m:mai/hermes/gitster-sidebar-loses
m:mai/hermes/gitster-browse-a
m:mai/brunel/fixer-submissions-demo
m:mai/icarus/inventor-inbox-overhaul
m:mai/atlas/inventor-symmetric-date
m:mai/artemis/gitster-demote-daten
m:mai/hermes/gitster-team-view-mailto
m:mai/knuth/coder-global-schriftsatze
m:mai/knuth/coder-schriftsatze
m:mai/ritchie/coder-author-demo-docx
m:mai/knuth/coder-add-schriftsatze
m:mai/knuth/coder-add-checklist
m:mai/knuth/coder-anchor-lookup-must
m:mai/tesla/dashboard-resize-clamp
m:mai/knuth/coder-demote-projekt
m:mai/knuth/coder-paliadin-chat
m:mai/knuth/coder-print-views
m:mai/knuth/coder-add-proceeding
m:mai/knuth/coder-submission
m:mai/ritchie/coder-extend-team-email
m:mai/knuth/coder-changelog-catch-up
m:mai/tesla/dashboard-overlap
m:mai/pasteur/fixercoder-dashboard
m:mai/newton/inventor-configurable
m:mai/dirac/inventorcoder-user
m:mai/gauss/inventorcoder-team-admin
m:mai/darwin/roadmap-ccr-en
m:mai/euler/coder-small-ux-polish
m:mai/darwin/fristenrechner-cleanup
m:mai/darwin/fixercoder-priority-bug
m:mai/leibniz/inventor-caldav-multi
m:mai/hertz/inventor-unified-modal
m:mai/archimedes/inventor-excel-data
m:mai/boltzmann/inventor-gap-tolerant
m:mai/copernicus/submission-slice-1
m:mai/fermi/interactive-session
m:mai/hertz/inventor-suggest-changes
m:mai/copernicus/inventor-submission
m:mai/mendel/test-strategy-slice-1
m:mai/mendel/inventor-test-strategy
m:mai/ampere/custom-views-improvements
m:mai/joule/mig-097-apply-huygens-s
m:mai/ohm/workstream-b-rename
m:mai/huygens/workstream-a-backfill
m:mai/kelvin/t-204-phase-2-proceeding
m:mai/bohr/ingest-t-paliad-203-rule
m:mai/curie/fristenrechner-gap
m:mai/maxwell/inbox-grey-out
m:mai/rutherford/slice-9-follow-up-b-re
m:mai/dirac/slice-9-follow-up-a
m:mai/bose/determinator-cascade-slice-3
m:mai/bose/determinator-cascade-slice-2
m:mai/bose/determinator-row-cascade
m:mai/lorenz/fristen-phase-3-slice-9
m:mai/curie/fristen-phase-3-slice-12
m:mai/planck/aichat-phase-b-paliad
m:mai/young/fristen-phase-3-slice-11b
m:mai/lorenz/fristen-phase-3-slice-11a
m:mai/lorenz/fristen-phase-3-slice-10
m:mai/lorenz/fristen-phase-3-slice-8
m:mai/lorenz/fristen-phase-3-slice-7
m:mai/lorenz/fristen-phase-3-slice-6
m:mai/lorenz/fristen-phase-3-slice-5
m:mai/lorenz/fristen-phase-3-slice-4
m:mai/lorenz/fristen-phase-3-slice-3
m:mai/lorenz/fristen-phase-3-slice-2
m:mai/lorenz/fristen-phase-3-slice-1
m:mai/pauli/fristen-phase2-design
m:mai/tesla/project-timeline-chart
m:mai/pauli/fristen-logic-audit
m:mai/pauli/determinator-b1-row-by
m:mai/noether/tools-cleanup-slice-1
m:mai/kelvin/inventor-tools-surface
m:mai/planck/paliadin-per-user-rls
m:mai/maxwell/bug-bundle-filterbar
m:mai/faraday/project-timeline-chart
m:mai/schroedinger/smarttimeline-slice-4
m:mai/bohr/smarttimeline-slice-3
m:mai/gauss/smarttimeline-slice-2
m:mai/riemann/filterbar-phase-2-slice
m:mai/lagrange/smarttimeline-design-the
m:mai/curie/researcher-determinator
m:mai/noether/collapse-regel-typ-on
m:mai/riemann/inventor-universal
m:mai/minkowski/project-level-our-side
m:mai/dirac/inventor-inline-paliadin
m:mai/feynman/fristenrechner
m:mai/minkowski/navbar-dashboard-reorg
m:mai/shannon/approval-rework
m:mai/einstein/consultant-deadline-data
m:mai/curie/researcher-upc-rop-audit
m:mai/noether/paliadin-real-claude
m:mai/noether/inventor-paliadin
m:mai/hilbert/inventor-approval-policy
m:mai/shannon/bug-frist-due-date
m:mai/fritz/bug-fristen-termine
m:mai/godel/inventor-projects-page
m:mai/fritz/bug-paliadin-chat
m:mai/kepler/inventor-profession-vs
m:mai/noether/inventor-paliadin-in-app
m:mai/fritz/bulk-team-email-send-to
m:mai/noether/inventor-local-chat-for
m:mai/noether/inventor-data-display
m:mai/fritz/bug-derived-team-members
m:mai/fritz/bug-sidebar-visibly
m:mai/noether/inventor-project
m:mai/shannon/bug-project-team-add
m:mai/cronus/inventor-dual-control
m:mai/fritz/bug-edit-mode-on
m:mai/cronus/inventor-holidays-per
m:mai/ritchie/phase-h-ai-deadline
8 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| d723df6fd4 |
feat(project-picker): show auto-derived project code in parent typeahead
t-paliad-222 follow-up — wire .code into the parent-project picker so two same-titled projects in different trees can be disambiguated by their auto-derived dotted code. Search includes the code; the badge renders only when distinct from the manual reference. Excel __meta sheet still pending — the JSON code field is populated by PopulateProjectCodes for every list payload, so the export generator only needs to add one row in a follow-up shift. |
|||
| 9de14f0665 |
feat(projects-detail): render auto-derived project code as a second header badge
t-paliad-222 follow-up — wire the .code field populated by PopulateProjectCodes into the project-detail header. Shows next to the manual reference when distinct, hidden when they match (avoid duplication) or when no segments resolved. CSS `.entity-ref-code` adds bracket-styling so the user knows the value is derived rather than typed. Also extends the frontend Project interface with code + opponent_code to make TypeScript surface the new fields cleanly across consumers. |
|||
| d326acb31a |
feat(projects): t-paliad-222 — Client Role + auto-derived project codes
Implements m/paliad#47 (Client Role rework) + m/paliad#50 (auto-derived project codes from the ancestor tree) in one shift. Migrations: - mig 112_client_role_rework: widen paliad.projects.our_side CHECK to seven sub-roles (claimant / defendant / applicant / appellant / respondent / third_party / other); drop legacy 'court' / 'both' and backfill rows to NULL (no-op on prod, defensive on staging). - mig 113_projects_opponent_code: add paliad.projects.opponent_code text on litigation rows (slug pattern [A-Z0-9-]{1,16}); used as the middle segment when assembling auto-derived project codes. Backend: - internal/services/project_code.go — new package-level helpers BuildProjectCode (single row) + PopulateProjectCodes (bulk, one CTE-based round-trip). Walks the existing paliad.projects.path ltree; custom paliad.projects.reference on the target wins. - Wired into ProjectService.List, GetByID, ListAncestors, GetTree, LoadCounterclaimChildrenVisible, BuildTreeWithOptions — every service entry-point that returns []models.Project / *models.Project populates .Code before returning. - Models: Project.OurSide doc widened; new Project.OpponentCode (db:"opponent_code") and Project.Code (db:"-", projection-only). - CreateProjectInput / UpdateProjectInput accept OpponentCode; validateOpponentCode + nullableOpponentCode mirror our_side helpers. - validateOurSide widens to the seven sub-roles; legacy 'court' / 'both' rejected at the service layer with a clear error before the DB CHECK fires. - derivedCounterclaimOurSide CCR flip widened: applicant ↔ respondent, appellant → respondent; third_party / other / NULL pass through. - submission_vars: project.code added to the placeholder bag. ourSideDE / ourSideEN now use the gender-neutral "-Seite" / "-Partei" suffix shape (Klägerseite / Antragstellerseite / ...); better legal-prose default for a B2B patent practice, matches the form labels which already used this shape (cf. head's soft-note on Q4). Frontend: - ProjectFormFields: opponent_code on a new projekt-fields-litigation block (hidden by default, shown when type=litigation); our_side moved into projekt-fields-case and re-labelled "Client Role" / "Mandantenrolle" with three <optgroup>s + seven options. - project-form.ts: showFieldsForType toggles the new litigation block; readPayload / prefillForm wire opponent_code; our_side is now only emitted for type=case. - fristenrechner: ourSideToPerspective widened to the seven sub-roles (Active→claimant, Reactive→defendant, Other→null). ProjectOption type literal updated. - i18n.ts: new projects.field.client_role.* and projects.field.opponent_code.* keys (DE+EN). Legacy projects.field.our_side.* keys stay one release for cached bundles + Verlauf event-history rendering of the new sub-roles. Tests: - TestProjectCodeSegment, TestAssembleProjectCode, TestPatentLast3, TestSanitizeClientShort, TestProceedingTail, TestValidateOpponentCode, TestValidateOurSideSubRoles pin the new pure helpers. - TestOurSideTranslations widened to the seven sub-roles + new prose shape; 'court'/'both' arms now return "" (legacy rejected). - TestDerivedCounterclaimOurSide widened to the new flip map. Migration slot history (this branch was rebumped twice on 2026-05-20): mig 110 was claimed by m/paliad#51 (project_type_other, euler); mig 111 was claimed by m/paliad#48 (project_admin_and_select, gauss). Final slots 112 / 113. go build && go test ./internal/... && cd frontend && bun run build all clean. |
|||
| 0a1a1d45ba | Merge remote-tracking branch 'origin/main' into mai/kepler/inventorcoder-project | |||
| 37cdf23c32 | wip(projects): bump migrations 110→111, 111→112 (euler claimed 110) | |||
| e6353d907c | Merge remote-tracking branch 'origin/main' into mai/kepler/inventorcoder-project | |||
| 2cfd54f0cd |
wip(projects): t-paliad-222 — backend + frontend changes (pre-merge checkpoint)
Backend: mig 110/111 (will be renumbered after merging main), validators + helpers widened, BuildProjectCode helper + projection populator wired into List/GetByID/ListAncestors/GetTree/CCR. All internal Go tests pass. Frontend: ProjectFormFields conditional render — opponent_code on litigation, our_side renamed to Client Role on case with grouped optgroups. i18n keys for both DE and EN. fristenrechner perspective mapping widened. project-form.ts payload reader/writer + showFieldsForType toggle for new litigation block. Migration slots about to be bumped (mig 110 was claimed by euler's project_type_other on main). |
|||
| f99a32490d |
design(projects): t-paliad-222 — Client Role + auto-derived project codes
Design doc for paired m/paliad#47 (Client Role rework) + m/paliad#50 (auto-derived project codes from the ancestor tree). Two migrations (110 widen our_side CHECK + backfill court/both → NULL; 111 add opponent_code on litigations), one new BuildProjectCode helper that walks the existing ltree path, plus form / submission-template / Determinator wiring. 9 open design questions surfaced for the head; recommendations default to the issue-body (R) picks unless a material concern is flagged in §2.2 / §3.2. Verified against live data (2026-05-20): all 12 projects have our_side=NULL, so the backfill is a no-op on production today. No 'opponent' field exists yet. |