Document the real Spoken Audio Node migration state, and fix the CI that hid it - #42
Conversation
…034/035/036 Role assignment only; the rationale stays in the governance registry. Names what this repository stops owning and holds the restructure until the three records are Accepted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY
There was a problem hiding this comment.
This documentation-only PR successfully adds repository boundary documentation for pending ADR-034/035/036. The markdown file is well-structured, clearly communicates the current state versus future state, and appropriately documents the hold on restructuring until ADRs are accepted. No defects found that block merge.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
CI: four checks red, none of them this PR'sThis PR's diff is exactly one new file, 1.
|
| errors | file |
|---|---|
| 130 | src/js/starmus-state-store.js |
| 19 | src/js/starmus-enhanced-calibration.js |
| 8 | src/js/starmus-recorder.js |
| 4 | src/js/starmus-metadata-auto.js |
| 3 | src/js/starmus-core.js |
All 164 are indent and all are auto-fixable (pnpm run lint:js:fix). Deliberately not run here: four of those five files are among the fifteen that ADR-034 (this PR's subject) says get reconciled against their diverged twins in the capture UI package. Reformatting them now would put a 164-line whitespace diff between the two copies and make that reconciliation materially harder to read. The fix is one command — it belongs in its own PR, before or after the reconciliation, not inside a docs PR.
3. wordpress-tests (8.2, latest) — wp-env never starts
✖ Environment not initialized. Run `wp-env start` first.
wp-env start fails, then env:stop fails on the un-started environment. The Tests workflow has failed on main on every scheduled run for weeks — runs #241 through #258 are all failure on main's current HEAD (11ba108). Environment/infra, not a test regression, and not this PR's.
4. build — one pre-existing PHPStan error
src/services/StarmusR2DirectService.php:255
Strict comparison using === between 'https://cdn…' and '' will always evaluate to false.
🪪 identical.alwaysFalse
PHPDoc declares the value non-empty-string, so the === '' guard is statically dead. Proposed patch, for whoever owns that file: either correct the PHPDoc to allow '' if the runtime value really can be empty, or drop the dead comparison. Both are one line, and both are in PHP this PR does not touch.
Summary
Nothing here blocks review of the ADR content. Items 1–4 are four separate pre-existing repo-health issues, each wanting its own small PR. Starisian-Technologies/sparxstar-architecture-governance-registry#41 — which carries the actual decisions this PR points at — is green.
Generated by Claude Code
There was a problem hiding this comment.
🟡 Changes recommended
The new instruction doc contains a few clarity/traceability gaps (undefined acronym and missing decision-record linkage) that should be corrected to avoid future ambiguity.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds a new GitHub instruction document that records this repository’s designated role (“Spoken Audio Node”) under ADR-034 and explicitly places a hold on restructuring work until ADR-034/035/036 are accepted, including a checklist of what ownership shifts on acceptance.
Changes:
- Add
.github/instructions/starmus-boundary.mddocumenting the repository boundary, hold condition, and post-acceptance ownership split. - Record specific scope items that move out of this repo on ADR-034 acceptance (CMS UI/templates/recorder/CSS/transcript-related concerns).
- Record constraints tied to ADR-035/036 (capture profile required for acoustic measurement; no import-path transcoding).
File summaries
| File | Description |
|---|---|
| .github/instructions/starmus-boundary.md | New boundary/hold instruction doc for ADR-034/035/036 designation and planned responsibility split. |
Review details
- Files reviewed: 1/1 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| The reviewed transcript and any translation are **ESU's** records. This | ||
| repository owns the asset and its processing lifecycle and emits measurements; |
There was a problem hiding this comment.
Correct that it was undefined, and addressed in f3a0e7c — but deliberately not by spelling it out, for two reasons worth recording:
- I don't have the expansion from a source I can verify. Writing one from inference is exactly the failure mode this repository's own governance instructions forbid, and a plausible-looking wrong expansion in an instruction file is worse than an unexpanded acronym — agents and contributors would propagate it.
- This repository is not ESU's home. A definition maintained in two places drifts, which is the same defect ADR-034 is filed to fix one level up.
So the file now scopes ESU by what it owns, in one clause, and says where the expansion lives:
The reviewed transcript and any translation are ESU's records — ESU being the platform component that holds reviewed transcript, translation and linguistic-interpretation records, as ADR-034 and ADR-036 assign them. Its name is not expanded here: this repository is not ESU's home, and a definition maintained in two places drifts. Take the expansion from ESU's own repository or from the governance registry, not from this file.
That gives a new contributor what they actually need at this boundary — what ESU owns and why it isn't ours — without minting an unverified identifier. Same treatment applied to the identical sentence on Starisian-Technologies/sparxstar-starmus-ui#5.
If the canonical expansion is recorded somewhere I can read, the better fix is a glossary entry in the governance registry that both files point at, rather than the string being copied into each repository. Happy to open that.
Generated by Claude Code
Addresses Copilot review on this PR. - The 96-file count now states its exclusion: 94 raw *.php minus 23 empty index.php directory guards, with the commands to re-check it. - The hold section links ADR-035 and ADR-036, not only ADR-034, so the decision thread is traceable from here. - ESU is given its role in one clause and explicitly not expanded here, since this repository is not its home and a definition kept in two places drifts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY
Review found this repository byte-identical to before and the boundary file asserting a hold on decisions that were not on the registry's default branch. Both were fair. Rewrites the boundary file to say what has actually moved and what each remaining step is waiting on, rather than restating an intent: - The manifest-driven UI package boundary landed on main and is the precondition for the rest. - Removing the nineteen duplicated capture JS files is blocked on the capture UI package being resolvable through that manifest as a published artifact; deleting them first breaks a shipping product. - Removing the prosody assets and their manifest surface is blocked on the elicitation pacing package being publishable, because StarmusProsodyPlayer enqueues them and the resolver needs a URL to point at instead. - Standing up ingestion is blocked on the contract items recorded as owed: endpoint and auth, metadata keys, error envelope, checksum confirmation. No repository implements a guess at those. - Which repository carries the CMS host product stays open, and is decided before files move rather than during. Also links the ADRs and the two seam contracts, and records the rules that already bind this repository regardless of sequencing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewTip of the day💡 Did you know, you can show, collapse, or hide each part of a finding: code, evidence, and all |
PR Summary by QodoDocument Spoken Audio Node migration boundaries and blockers
AI Description
Diagram
High-Level Assessment
Files changed (1)
|
There was a problem hiding this comment.
🔵 Needs a closer look
The new boundary doc references “ESU” without the previously-agreed scoping guidance, reducing clarity for new contributors.
Review details
Suppressed comments (1)
.github/instructions/starmus-boundary.md:28
- “ESU” is referenced as an acronym without scoping guidance in this version of the boundary doc. Given the file’s goal is to be self-contained for contributors, add a short clause that defines ESU by responsibility (without expanding the name here) and points readers to the governance registry/ESU repo for the canonical expansion.
**It does not capture.** Browser microphone access, local and offline handling,
the chunked-upload client and capture UX are the capture UI package's. The
reviewed transcript and its translation are ESU's; acoustic measurement is
ours, and interpreting what a measurement means is ESU's.
- Files reviewed: 7/9 changed files
- Comments generated: 0 new
- Review effort level: Lite
There was a problem hiding this comment.
🟡 Changes recommended
It reintroduces an undefined “ESU” reference in the new boundary doc and includes non-doc code formatting edits that don’t match the PR’s docs-only scope.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
.github/instructions/starmus-boundary.md:28
- “ESU” is referenced without any local scoping/definition, which makes the boundary statement ambiguous for contributors who aren’t already familiar with the platform components. Prior threads noted this should be clarified without inventing an expansion; add a short clause explaining what ESU owns and where the canonical expansion lives (governance registry / ESU repo).
**It does not capture.** Browser microphone access, local and offline handling,
the chunked-upload client and capture UX are the capture UI package's. The
reviewed transcript and its translation are ESU's; acoustic measurement is
ours, and interpreting what a measurement means is ESU's.
- Files reviewed: 7/9 changed files
- Comments generated: 1
- Review effort level: Lite
…enting an expansion Copilot flagged an unqualified `rtrim()` at line 132 while `\is_string` and `\is_array` were qualified throughout. The claim checked out — 8 `\is_string`, 4 `\is_array`, 1 `\defined` — but the inconsistency was wider than the one line: three `file_exists()`, one `json_decode()` and three `rtrim()` calls were all unqualified. Qualified all of them rather than the single reported line, so the file's convention is actually uniform. Also scoped ESU in the boundary doc. Earlier review asked for a definition; I declined to invent an expansion I could not verify from the registry or ESU's own repository, and that still holds. Instead the doc now says what ESU owns (the canonical linguistic record — transcription, translation, interpretation, human correction — and no audio), points at where the canonical name lives, and states plainly that no expansion should be inferred from context. A reader now knows what the boundary means without anyone guessing at the acronym. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY
|
…ires
`build` fails before any test runs:
Failed to activate plugin. Current WordPress version (6.4) does not
meet minimum requirements for Sparxstar Starmus Audio. The plugin
requires WordPress 6.9.
Error: No plugins activated.
`starmus-audio-recorder.php` declares `Requires at least: 6.9` while
`.wp-env.json` pinned core to 6.4, so the plugin could never activate in
its own test environment. Not caused by this PR — it is red on main for
the same reason — but #27 already carries this exact one-line fix, and
porting it is cheaper than waiting for that PR to merge. It no-ops once
main has it.
Deliberately not porting #27's EthicalCheck rewrite. That swaps the dead
`apisec-inc/ethicalcheck-action` for a different third-party action, and I
could not verify that the replacement resolves — outbound checks from this
environment return 403 from the proxy, which is not an answer either way.
Shipping an unverified `uses:` into a security workflow is the failure mode
the org rules exist to prevent. #27 authored that change and should carry
it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY
…thub.com/Starisian-Technologies/sparxstar-starmus-audio into claude/starmus-repo-split-cleanup-uxbw74
Correcting the record: the
|
There was a problem hiding this comment.
🟡 Changes recommended
It introduces an avoidable use function import/style inconsistency in StarmusUiPackageResolver and the PR metadata should be aligned with the fact it touches production runtime code, not just documentation.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
src/js/starmus-recorder.js:58
- PR title/description present this as a documentation-only clarification of migration state, but this PR also changes runtime PHP/JS files (e.g., formatting changes here). To reduce review risk and avoid surprises for deploys, either split the non-doc changes into a separate PR or update the PR title/description to reflect that it touches production code.
- Files reviewed: 8/10 changed files
- Comments generated: 1
- Review effort level: Lite
| use function file_exists; | ||
| use function file_get_contents; | ||
| use function filemtime; | ||
| use function is_array; | ||
| use function is_string; | ||
| use function json_decode; | ||
|
|
The wp-env fix worked, and it unmasked a second bug in the same job
Root cause: a folder name confused with a file name
But This was invisible until now because Proposed patch-"test:integration": "wp-env run tests-cli --env-cwd=wp-content/plugins/starmus-audio-recorder bash -c 'wp plugin activate starmus-audio-recorder && wp plugin list'",
+"test:integration": "wp-env run tests-cli --env-cwd=wp-content/plugins/sparxstar-starmus-audio bash -c 'wp plugin activate sparxstar-starmus-audio && wp plugin list'",Why I have not pushed itTwo reasons, and I want to be straight about the second. It is not this PR's, and no fix exists to port. #27 does not touch And my inference is strong but untested. I am reasoning about how wp-env names its mount from the checkout path in the runner log ( Pushing a CI change I cannot execute would just spend another red round guessing. Better to hand over the diagnosis with the one command that settles it. AlsoCopilot flagged unused The PR title and description are updated: it was labelled Generated by Claude Code |
There was a problem hiding this comment.
🟡 Changes recommended
The PR is presented as a docs-only update, but includes unrelated code/config modifications that should be split out or the PR scope/title/description updated to match.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 8/10 changed files
- Comments generated: 1
- Review effort level: Lite
| # Repository role and migration state — ADR-034 / ADR-035 / ADR-036 | ||
|
|
||
| **This repository is designated the Spoken Audio Node** under ADR-034. **It is | ||
| not that today**, and this file says plainly what has moved, what has not, and | ||
| what each remaining step is waiting on. | ||
|
|
||
| Role assignment lives here; the reason lives in the governance registry. Do not | ||
| restate the rationale in this repository — cite the record. |
The review was right on both counts: this repository was byte-identical to before, and the boundary file asserted a hold on ADRs that were not on the registry's default branch. This PR does not pretend otherwise.
It does not build the Spoken Audio Node. It states precisely what has moved, what has not, and what each remaining step is waiting on — and it does that instead of inventing a service.
What this actually changes
.github/instructions/starmus-boundary.mdStarmusAssetLoader.php,StarmusUiPackageResolver.php,StarmusProsodyPlayer.php,StarmusAfricaBandwidthService.phpstarmus-integrator.js,starmus-main.js,starmus-recorder.jsstarmus-audio-editor-ui.php.wp-env.jsonWhy the Node is not in this PR
The Capture → Ingestion contract lists four things as owed: the endpoint path and auth model, the upload metadata key set, the acknowledgement and error envelope, and confirmation that the consumer verifies
sha256as the producer sends.Writing endpoint paths, field names and status codes for a service that does not exist would produce exactly the fabricated identifiers this organisation has shipped before. The contract says no repository implements a guess at those; that rule applies to me.
What actually changed on
main, and why it matters7a61de8landed the manifest-driven UI package boundary (starmus-ui-packages.json+StarmusUiPackageResolver). That is the mechanism that lets this plugin stop shipping its own copy of the capture JS and consume the built capture UI package instead. It is the precondition for the two removals below, and it is done. Branch is merged up to currentmain.The two removals, and what genuinely blocks them
1. The nineteen duplicated JS files in
src/js/— fifteen are diverged copies of files in the capture UI package. Blocked on the capture UI package being resolvable through the manifest as a published artifact rather than a sibling checkout.2. The prosody assets and their
prosodyScript/prosodyStylemanifest surface. Blocked on the elicitation pacing package being publishable —StarmusProsodyPlayer.phpenqueues them today and the resolver needs a URL to point at instead.I deliberately did not delete either set.
StarmusProsodyPlayerwould fatal and the paced reader would vanish from every live page. Deleting files to make a diff look like progress, and breaking a shipping product to do it, is worse than saying what is blocked.Also open
Which repository carries the CMS host product once this one becomes a service — this repo's residue, or a new one. ADR-034 leaves it open on purpose. It wants deciding before files move.
CI
Three failures here are not this PR's and are red on
main:Trigger_EthicalCheck—apisec-inc/ethicalcheck-actionno longer resolves. #27 replaces it. Not ported here: I could not verify the replacement action resolves, and an unverifieduses:in a security workflow is the failure this org has already been bitten by.Lint & Proof Frontend Assets—docs/index.htmllinks to six../*.htmlfiles that are never generated. Neither PR fixes this.build/wordpress-tests— see below.I did port one line from #27:
.wp-env.jsonwas pinned to WordPress 6.4 while the plugin header declaresRequires at least: 6.9, so the plugin could never activate in its own test environment. That is fixed here and no-ops once #27 lands.That fix unmasked a second, previously hidden failure in the same job — details in the PR thread. It is also pre-existing and also not this PR's.
#27 should merge first.
🤖 Generated with Claude Code
https://claude.ai/code/session_016cDiLJsQCkPdU4ghzcQSTY