Skip to content

Phase 8 / Task E2: Squash onto clean-pr + push + PR #136 refresh + @jahow tag #181

@Sam-Bolling

Description

@Sam-Bolling

Phase 8 Task

Task ID: E2
Title: Squash onto clean-pr + Push + PR #136 Refresh + @jahow Tag
Source: Phase 8 delivery sequence — final upstream handoff
Severity: N/A (delivery only — no source change)
Category: Delivery / Upstream PR / Maintainer Handoff
Ownership: Ours (clean-pr branch on OS4CSAPI/ogc-client; PR #136 on camptocamp/ogc-client)
Phase 8 phase: E — Verification & Delivery


Goal

Apply the phase-8.patch artifact (produced by Task E1) onto clean-pr as one squashed commit, push to refresh PR #136, verify CI green on the PR, update the PR description with a comprehensive Phase 8 section, and tag @jahow for final review with an explicit time-frame ask. After E2:

Acceptance criterion: Phase 8 is complete and PR #136 is ready for @jahow's final review.

Locked Decision

⚠️ This decision is locked. Do not re-litigate in this issue. Surface deviations to the user; do not silently re-decide.

Decision: Delivery is two-repo, single-squash:

  • The planning repo (OS4CSAPI/ogc-client-CSAPI_2) keeps full per-task granular history on phase-8
  • The delivery repo (OS4CSAPI/ogc-client) carries clean-pr with one new squashed commit (the only commit Phase 8 contributes upstream)
  • The squashed commit message uses the canonical template from P8-implementation-guide.md §11

The mechanical-apply path is: git apply phase-8.patch (NOT git cherry-pick, NOT git merge, NOT git rebase). Patch-apply preserves the source-only scope fence E1 established and gives a clean single-commit result with no merge-history pollution.

If git apply fails (whitespace conflict, contextual drift), the recovery path is: return to phase-8 on the planning repo, regenerate the patch fresh from the current phase-7..phase-8 diff, and re-apply. Do not edit clean-pr source files manually to make a poisoned patch apply.

The PR description update is mandatory, not optional. The Phase 8 section gives @jahow a single-pane summary so the review burden is bounded.

The @jahow tag is the explicit handoff signal — without it, the maintainer has no notification that Phase 8 is review-ready.

Locked in:


Problem Statement

Phase 8's planning branch contains 8+ granular commits (A1–D1) plus the full docs/, app/, planning-MD churn. Upstream camptocamp/ogc-client cannot accept that history — PR #136 needs one clean squashed commit covering only src/ and fixtures/ changes. The two-repo workflow established in Phase 7 (P8-implementation-guide §11) handles this: OS4CSAPI/ogc-client is the upstream-shaped delivery branch (clean-pr), and phase-8.patch is the bridge.

Additionally, PR #136's existing description covers Phases 6 and 7 only. Without a Phase 8 section, @jahow has no scoped summary of what changed, what's in scope, what's deliberately deferred, and what's been closed wontfix. The maintainer would have to reverse-engineer all of that from the diff, which is precisely the friction the Phase 8 contribution-goal document was designed to eliminate.

Affected branches/repos:

  • Source: OS4CSAPI/ogc-client-CSAPI_2 phase-8 HEAD + phase-8.patch artifact (produced by E1)
  • Target: OS4CSAPI/ogc-client clean-pr branch
  • PR: camptocamp/ogc-client#136 (refreshed by push to OS4CSAPI/ogc-client:clean-pr)

Files to Modify

File / Resource Action Est. Lines Purpose
OS4CSAPI/ogc-client working tree (on clean-pr) Apply patch ~950 LOC Mechanical git apply phase-8.patch — no manual source edits
OS4CSAPI/ogc-client clean-pr branch Push (commit) One new squashed commit pushed to refresh PR #136
PR #136 description (camptocamp/ogc-client) Update ~80 lines New "## Phase 8" section: acceptance-criteria recap (A1–A8 + B1–B2), resolved-findings list, wontfix list, deferred list
PR #136 review request Tag (comment) @jahow tagged with explicit time-frame ask

Cross-reference P8-implementation-guide §11 steps 4–8 for the canonical command sequence and squashed-commit-message template. If you find yourself editing OS4CSAPI/ogc-client source files manually, stop — that's a regression, not E2's job.

Implementation Approach

Execute the canonical 9-step sequence verbatim from P8-implementation-guide §11 steps 4–8. Repository handoff is from OS4CSAPI/ogc-client-CSAPI_2 to OS4CSAPI/ogc-client; PR target is camptocamp/ogc-client#136.

Step 1 — Switch to the delivery repo (clone if needed):

# If not already cloned locally:
# git clone https://github.com/OS4CSAPI/ogc-client.git c:\Users\sbolling\Documents\ogc-client
cd c:\Users\sbolling\Documents\ogc-client
git fetch origin
git status              # working tree must be clean

Step 2 — Checkout clean-pr and ensure it is up-to-date:

git checkout clean-pr
git pull origin clean-pr
git log -1 --oneline    # confirm Phase 7's last squashed commit is HEAD

Step 3 — Apply the patch from E1:

# Adjust path as needed; phase-8.patch was produced by Task E1 in the planning repo
git apply c:\Users\sbolling\Documents\ogc-client-CSAPI_2\phase-8.patch

If git apply reports any error: do NOT manually edit files to force-fit the patch. Return to E1, regenerate the patch from current phase-7..phase-8 diff, retry. If the patch still fails, surface the question — there is a stale-baseline or context-drift problem to root-cause.

Step 4 — Stage all and inspect:

git add -A
git status              # expected: only src/ogc-api/csapi/**, src/ogc-api/endpoint.ts, src/ogc-api/index.ts, fixtures/csapi/** changes
git diff --cached --shortstat   # sanity-check LOC ~950

Step 5 — Commit with the canonical squashed commit message (template from P8-implementation-guide §11):

Phase 8: API design refinements + CS-Go server-interop fixes

Closes (resolved upstream-review findings 017–024 + repo issues #166, #167):

- 017: URL-builder framing in module-level docs (A1)
- 022: CSAPICollectionRef constructor type decoupling (A2)
- 023: availableResources tightened to ReadonlySet<CSAPIResourceType> (A3)
- #167: Pagination-contract JSDoc on list methods (A4)
- 019: DataStream → Datastream method rename (B1, 13 methods)
- 021: Validators throw EndpointError (B2)
- #166: Part 2 @link fallback in cross-reference fields (C1)
- 018 + 024: endpoint.csapi() convenience method + re-privatization (D1, coordinated)

Deliberately wontfix (out of Phase 8 scope per P8-contribution-goal §6):

- #168: getCollections / cross-collection helpers
- #169: getObservationsByDatastream / consumer-side ergonomics

Deferred to a future phase (per P8-contribution-goal §7):

- 020: SWE Common parser hardening
- 025: result-extraction error path
- 026: ad-hoc paging helpers
- #170: auto-pagination across pages
- #171: SWE Common-aware result extraction

CI: all five upstream gates green (format:check, typecheck, lint, test:browser, test:node).

Step 6 — Push to refresh PR #136:

git push origin clean-pr
# This refreshes the PR at camptocamp/ogc-client#136 (clean-pr is the head branch)

Step 7 — Verify CI on PR #136: open camptocamp#136, wait for GitHub Actions to complete, confirm all upstream-defined gates exit green. If any gate fails on the PR but was green locally in E1, root-cause the divergence (CI environment, Node version, OS) before tagging @jahow.

Step 8 — Update PR #136 description: add a "## Phase 8" section at the bottom (or replace if a Phase 8 stub exists). Use this structure:

## Phase 8

**Acceptance criteria met (8 + 2 = 10):**

- A1: URL-builder framing documented (Finding 017)
- A2: CSAPICollectionRef decoupling (Finding 022)
- A3: ReadonlySet<CSAPIResourceType> tightening (Finding 023)
- A4: Pagination JSDoc (#167)
- A5: No `@deprecated` introductions (locked-decision invariant)
- A6: `endpoint.root` / `getCollectionDocument` private (Finding 024)
- A7: `endpoint.csapi(id)` discoverable entry point (Finding 018)
- A8: No `isCollectionInfo` runtime cast (eliminated by D1)
- B1: `DataStream``Datastream` rename, 13 methods (Finding 019)
- B2: Validators throw `EndpointError`; factory wrapping closed in D1 (Finding 021)

**Resolved findings:** 017, 018, 019, 021, 022, 023, 024, #166, #167.
**Wontfix (out of scope):** #168, #169.
**Deferred to a future phase:** 020, 025, 026, #170, #171.

Net: ~400 source LOC + ~550 test LOC. No `app/`, `docs/`, or `src-node/` changes flow upstream.

Step 9 — Tag @jahow for final review with explicit time-frame ask. Use a PR comment (not just an "@" in the description), so it generates a notification:

@jahow — Phase 8 is ready for your final review. Could you take a look in the next ~2 weeks if your schedule allows? All five CI gates are green, the PR description's Phase 8 section summarizes scope. Happy to address any feedback either as fixup commits on clean-pr or as a Phase 9 follow-up, your call.

(Adjust the time-frame to whatever the user has agreed with @jahow.)

Scope — What NOT to Touch

  • ❌ Do NOT modify any source file inside this task. E2 is mechanical apply + commit + push + description + tag. No manual source edits.
  • ❌ Do NOT use git cherry-pick, git merge, or git rebase to bridge phase-8clean-pr. The locked path is git apply phase-8.patch.
  • ❌ Do NOT amend or rewrite Phase 7's existing squashed commit on clean-pr. Phase 8 adds one new commit on top.
  • ❌ Do NOT amend the Phase 8 squashed commit after the push without first informing the user. Force-pushes to clean-pr invalidate any review @jahow has started.
  • ❌ Do NOT push to phase-8 from this task. E2 operates only on the OS4CSAPI/ogc-client repo (clean-pr branch).
  • ❌ Do NOT add docs/, app/, src-node/, governance files, or planning files to clean-pr. The patch's scope fence (set in E1) already excludes them; verify in Step 4 that none have leaked in.
  • ❌ Do NOT skip the PR description update. The Phase 8 section is a mandatory acceptance criterion.
  • ❌ Do NOT skip the @jahow tag. The handoff signal is mandatory.
  • ❌ Do NOT promise behavior beyond what Phase 8 actually delivers in the PR comment to @jahow. Specifically, do NOT promise the deferred items (020, 025, 026, Future-enhancement (deferred): async-iterator helpers for paginated CSAPI list methods — out-of-scope until upstream broadens scope #170, Deferred enhancement: SWE Common–aware result-vector extraction (out-of-scope until upstream broadens scope) #171) on a timeline.
  • ❌ Do NOT close any of the deferred or wontfix issues from this task. They stay in their current state (deferred remains deferred; wontfix remains closed wontfix).
  • ❌ Do NOT add @deprecated tags anywhere in Phase 8 (locked decision; PR unmerged ⇒ no consumers).
  • ❌ Do NOT absorb consumer-side ergonomic helpers (Phase 8 hard scope fence).

Acceptance Criteria

Acceptance Gate (verification command)

The Phase 8 roadmap defines a specific verification command for this task (P8-ROADMAP §Phase E Task E2). Paste the output of these commands on the issue before closing:

# 1. Confirm clean-pr advanced by exactly one commit
cd c:\Users\sbolling\Documents\ogc-client
git log -2 --oneline origin/clean-pr
# Expected line 1: <new sha> Phase 8: API design refinements + CS-Go server-interop fixes
# Expected line 2: <Phase 7 sha> Phase 7: ... (the prior squashed commit)

# 2. Confirm the new commit's diff is source-only
git show --stat HEAD
# Expected: only src/ogc-api/csapi/**, src/ogc-api/endpoint.ts, src/ogc-api/index.ts, fixtures/csapi/** files

# 3. Confirm the new commit's diff has no docs/app/src-node leaks
git show --name-only HEAD | Select-String -Pattern '^(docs|app|src-node|tools|\.github)/'
# Expected: no output (zero matches)

# 4. PR #136 verification (manual / browser)
#    - Open https://github.com/camptocamp/ogc-client/pull/136
#    - Confirm the new commit appears in the commits tab
#    - Confirm CI is green
#    - Confirm "## Phase 8" section is present in the description
#    - Confirm @jahow is tagged in a comment with time-frame ask

Expected output:

Phase 8 close-out: once E2's acceptance gate is met, Phase 8 is complete. Subsequent maintainer feedback from @jahow becomes either fixup commits on clean-pr (small) or a future Phase 9 (substantial). Either path is decided by the user, not pre-committed in this issue.

Dependencies

Mandatory. Walk the P8-ROADMAP dependency graph and fill in every applicable row.

Blocked by: Task E1phase-8.patch must exist as a verified artifact and CI on phase-8 must be fully green before E2 starts. The single artifact handoff is the patch file.
Blocks: Nothing inside Phase 8 (E2 is the final task). Future maintainer-feedback handling and any Phase 9 plans depend on E2 closing successfully.
Related: Phase 7's delivery pattern (P8-implementation-guide §11); upstream PR #136 (camptocamp/ogc-client#136).

Roadmap dependency row: P8-ROADMAP §Phase E Task E2: "Effort: Small (~1 hour, mostly description writing). Risk: Low (mechanical apply; if patch fails to apply cleanly, return to phase-8 and rebase or regenerate the patch). Dependencies: Task E1. Acceptance gate: PR #136 shows one new commit; CI green; PR description has Phase 8 section; @jahow tagged."

References

# Document What It Provides
1 P8-contribution-goal-and-definition.md Phase 8 goal, scope, acceptance criteria; resolved/wontfix/deferred sets that populate the PR description
2 P8-implementation-guide.md §11 steps 4–8 Canonical 9-step delivery sequence + squashed commit message template
3 P8-ROADMAP.md §Phase E Task E2 Task ordering, dependencies, acceptance gate
4 PR #136 (camptocamp/ogc-client) The upstream PR being refreshed
5 OS4CSAPI/ogc-client clean-pr branch The delivery branch (target of the squash)
6 phase-8.patch (artifact from E1) The single bridge artifact between planning and delivery
7 Phase 7's existing squashed commit on clean-pr The prior baseline; Phase 8 sits exactly one commit on top

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions