Skip to content

App Space: parallel paths within a track (fork lanes + free-order clusters) (#2887) - #2888

Merged
jung-thomas merged 12 commits into
DEVfrom
worktree-appspace-parallel-design
Oct 23, 2026
Merged

jung-thomas merged 12 commits into
DEVfrom
worktree-appspace-parallel-design

Conversation

@jung-thomas

Copy link
Copy Markdown
Contributor

Closes #2887.

What

A single App Space track can now express parallelism, modeled entirely on the existing schema (no db/schema.cds change — segments derived at read time):

  • Shared itemOrder = parallel. Items at the same Order form a parallel segment.
  • 2+ GROUP path-items at one Order → side-by-side branch lanes (the TechEd "Explore Agentic AI with CAP" fork). Each lane expands its Group's tutorials in place.
  • N TUTORIAL path-items at one Order → any-order cluster (6–7 tutorials, complete in any order).

Completion rule = where the Prize lives (no new config)

  • GROUP row + prize on the same CompletionPathItems row → resolver appends a synthetic CHECKPOINT at that lane's end → that branch alone earns it.
  • CHECKPOINT (with prize) at a higher Order → unlocks only when all lanes complete (join).
  • The synthetic lane prize is a real CHECKPOINT, so its barcode claims identically to any normal one.

How it's built (9 commits, TDD, per-task reviewed)

  • Server: classifyPathSegments → buildPathSegments (fork lanes + synthetic prize + Group-title labels) → annotateUnlocked (server-side gating, composes with App Space completion time window #2866 out-of-window + Field at the mission path level that temporarily disables a path #2864 temporarily-unavailable). getEventProgress + buildPathItems untouched — linear tracks unchanged.
  • Client: app-space-gating.ts prefers the server unlocked flag; AppSpace.vue renders fork lanes side-by-side (fork/join connectors) + any-order clusters, and recomputes track aggregates by the authored rule (not flat all-complete).
  • e2e spec (self-skips without SMOKE_BASE_URL). Admin editor verified: duplicate Order + GROUP+Prize already authorable, no change needed.

Docs

  • Design: docs/superpowers/specs/2026-10-22-app-space-parallel-paths-design.md
  • Plan: docs/superpowers/plans/2026-10-22-app-space-parallel-paths.md

Testing status

⚠️ Local unit suite NOT run on this branch (author boarding a flight; extensive testing scheduled tomorrow at TechEd Berlin). Per-task unit + Vue-dir tests were green as each task landed, and the e2e spec self-skips locally. Full suite verification is still pending before merge.

Known follow-ups (non-blocking, from final review)

  • M1: isTrackComplete keys off any unlocked checkpoint — correct for terminal checkpoints (today's only shape); a non-terminal checkpoint would mark complete early. Restrict to highest-order checkpoint.
  • M2 / limitation: a GROUP-sourced lane can't surface temporarilyUnavailable (children hardcoded false upstream; fail-safe — items stay navigable). Needs a server-side lane-level flag or child propagation.
  • Minor test-strength + a cosmetic cluster-branch gap (both unreachable under current authoring).

release v1.40.4 DEV to main promotion
…usters)

Models parallelism within a track entirely on the existing schema:
shared itemOrder = parallel; 2+ GROUP rows at one Order = side-by-side
branch lanes; N TUTORIAL rows at one Order = free-order cluster.
Per-lane reward via GROUP+prize on the same CompletionPathItems row
(resolver appends a synthetic CHECKPOINT at read time); join reward via
a downstream CHECKPOINT. No schema change.
Add test/e2e/app-space-parallel.spec.ts: post-deploy smoke spec that
loads /app-space/ and, when a fork track is seeded on the env, asserts
two .lane columns in the fork segment, a .lane__name label on each, and
at least one .step--locked downstream item (the join checkpoint locked
for anonymous visitors).  Self-skips without SMOKE_BASE_URL (repo e2e
convention, #1338).

Admin editor verification (Part A, read-only):
- itemOrder has no @assert.unique constraint on CompletionPathItems
  (db/schema.cds) and is an editable integer column with no uniqueness
  validator in the Fiori Elements table — duplicate Order values for
  parallel rows are freely settable.
- prize_ID has no conditional @UI.Hidden tied to taskType; the Prize
  column is visible for every row type including GROUP items — group +
  prize authoring on one row is fully supported.
No admin code change required.
…llel-design

# Conflicts:
#	hugo-apps/src/app-space/AppSpace.vue
@jung-thomas
jung-thomas merged commit 77771b3 into DEV Oct 23, 2026
6 checks passed
@jung-thomas
jung-thomas deleted the worktree-appspace-parallel-design branch October 23, 2026 10:39
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