Skip to content

docs(integration): Redmine wiring plan — width × depth, parallel-scopable#88

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/redmine-integration-plan
Jun 21, 2026
Merged

docs(integration): Redmine wiring plan — width × depth, parallel-scopable#88
AdaWorldAPI merged 1 commit into
mainfrom
claude/redmine-integration-plan

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

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-yr
UX 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:

Axis What it varies
Width how many canonical concepts have functional pages (URL count)
Depth how complete one concept is (list → +filter → +bulk-edit → …)
GUI the visual layer (CSS, JS, theming)
Templates the askama kit (new ColumnKinds, InputKinds)
Wiring routes, store, middleware (one-time scaffolding)

The streams (designed for file-ownership disjoint parallelism)

  • Phase 0 — Foundation (sequential, ~1 week, 1 stream): rm-server
    scaffold, rm-store on SurrealDB, rm-auth session core.
  • Phase 1 — Width pass (parallel after Phase 0, 8 tracks ~4 days
    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.
  • Phase 2 — Depth pass (parallel cross-cutting, 6 tracks): D1
    forms, D2 filters/sort/group, D3 RBAC, D4 workflows, D5 custom
    fields, D6 full-text search.
  • T1/T2 — askama column/input kind extensions (OGAR-side, parallel
    anytime).
  • G1/G2/G3 — layout chrome, CSS port, client-side widgets
    (redmine-rs-side, parallel anytime).

Cut lines

Milestone Streams 1 contributor 4 contributors
MVP (Issue browse+create+login) Phase 0 + W1 + D1 + G1 ~2 weeks ~1 week
Feature parity (no SCM driver) Phase 0 + W1-W8 + D1-D5 + T1-T2 + G1-G2 ~15 weeks ~5-6 weeks

Why this is feasible

Per-resource handler code is mechanical because:

  1. The render kit takes (canonical Class, Vec<RowSource>) → HTML
    one shape, every resource fits.
  2. The 17-yr Redmine UX is already inside the kit as data (ColumnKind
    defaults, per-kind formatters, sort/group/total flags). New
    resource = for col in default_columns(class) loop, not a new
    template.
  3. The PortSpec / UnifiedBridge / OGAR codebook layers all already
    route to the right canonical concept.

The substrate is the hard part. The substrate is done.

🤖 Generated with Claude Code

…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).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +80 to +82
- 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@AdaWorldAPI AdaWorldAPI merged commit 4d3a365 into main Jun 21, 2026
1 check passed
AdaWorldAPI added a commit that referenced this pull request Jun 21, 2026
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant