docs(integration): Redmine wiring plan — width × depth, parallel-scopable#88
Conversation
…able Reality-check the work to wire Redmine core features on top of the calcified Northstar substrate (codebook + UnifiedBridge + askama kit + schema emission). Sibling of CLASSVIEW-MATERIALIZATION-PLAN.md and REDMINE-QUERY-HARVEST.md. Four-axis framing — width × depth × GUI × templates × wiring — with parallel streams designed so no two own the same file: - Phase 0: foundation (rm-server / rm-store / rm-auth — sequential, ~1 week, 1 stream) - Phase 1: width pass — 8 resource tracks (W1..W8) covering all 26 canonical concepts, parallel after Phase 0, ~4 days/track - Phase 2: depth pass — 6 cross-cutting tracks (D1 forms, D2 filters, D3 RBAC, D4 workflows, D5 custom fields, D6 search), parallel - T1/T2: askama column-kind + input-kind extensions, OGAR-side - G1/G2/G3: layout chrome + CSS port + client-side widgets, redmine-rs-side, parallel anytime Cut-lines: - MVP (Issue browse + create + login): Phase 0 + W1 + D1 + G1 → ~2 weeks with 1 contributor, ~1 week with 2 - Feature parity (minus SCM driver): Phase 0 + W1-W8 + D1-D5 + T1-T2 + G1-G2 → ~5-6 weeks with 4 contributors Per-stream file ownership table makes the parallelism contract explicit (§8). DoD per stream pinned (§3, §4, §5). Three calibration gates per stream (round-trip parse, target-toolchain compile, ClassView drift guard). The one-paragraph ship-it summary: the substrate is done; what's left is mechanical wiring — an axum server, a SurrealDB store, per-resource handlers that compose `(class, query) → render_list / render_detail / render_form`. The 17 years of Redmine UX organic discovery is already inside the askama kit as data (ColumnKind, formatters, sort/group/total flags).
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 03bb82f02e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - Apply the schema emitted by | ||
| `op_codegen_projection::render_classes_schema(&ogar_canonical_classes())` | ||
| at startup. (The schema generator is already a sibling crate; we just |
There was a problem hiding this comment.
Point the store plan at an exported schema emitter
In this checkout, a repo-wide search for render_classes_schema and ogar_canonical_classes only finds this new reference, while the exported SurrealQL path is ogar-adapter-surrealql::emit_surrealql_ddl(&[Class]). Since W0.2 is the sequential foundation gate, following this instruction leaves rm-store blocked on APIs that are not available from OGAR; please either reference an existing exported emitter/list of classes or call out the prerequisite that adds them.
Useful? React with 👍 / 👎.
Codex P2 on PR #88: the original W0.2 referenced `op_codegen_projection::render_classes_schema(&ogar_canonical_classes())`, but neither symbol exists. `op-codegen-projection` lives in openproject-nexgen-rs (the OpenProject port-side bridge from the triples path), not in OGAR — `rm-store` shouldn't pull from a sibling port's crate. Fix: redirect W0.2 to the actual exported OGAR emitter `ogar_adapter_surrealql::emit_surrealql_ddl(&[Class])` (hand-written formatter, already round-trip-pinned). Plus a called-out OGAR prerequisite (~1 day, blocks W0.2): add `ogar_vocab::all_promoted_classes() -> Vec<Class>` so rm-store has a single call site to drive the emitter. Sibling alternative spelled out if the enumerator slips: hand-list the calls in rm-store with a class_ids::ALL-walking drift test.
What this is
A calcified wiring plan for delivering Redmine on top of the
Northstar substrate. Sibling of
CLASSVIEW-MATERIALIZATION-PLAN.md(the +5+5 substrate plan) and
REDMINE-QUERY-HARVEST.md(the 17-yrUX harvest). Where those answer "what does the kit need to look like?",
this answers "how do we ship Redmine in parallel without contributors
stepping on each other?"
The framing
Four orthogonal axes, every workstream positions itself on them:
ColumnKinds,InputKinds)The streams (designed for file-ownership disjoint parallelism)
scaffold, rm-store on SurrealDB, rm-auth session core.
each): one track per resource group — W1 Issue/Journal, W2
Project/Version/EnabledModule, W3 TimeEntry, W4 User/Membership/
Role/Watcher, W5 Tracker/IssueStatus/IssuePriority/CustomField, W6
Comment/News/Message/Forum/Wiki/Attachment, W7 Repository/Changeset,
W8 Query/IssueRelation.
forms, D2 filters/sort/group, D3 RBAC, D4 workflows, D5 custom
fields, D6 full-text search.
anytime).
(redmine-rs-side, parallel anytime).
Cut lines
Why this is feasible
Per-resource handler code is mechanical because:
(canonical Class, Vec<RowSource>) → HTML—one shape, every resource fits.
ColumnKinddefaults, per-kind formatters, sort/group/total flags). New
resource =
for col in default_columns(class)loop, not a newtemplate.
route to the right canonical concept.
The substrate is the hard part. The substrate is done.
🤖 Generated with Claude Code