1st graders examples

These are the files created on the 1st authoring pass.
This commit is contained in:
2026-09-15 07:30:36 -04:00
parent 00f3886b34
commit 4351a77f13
8 changed files with 2087 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
# Holistic Rubric — voice-pro-format
## Task context
The response must repair the Node.js SQS consumer that handles voice-cloning jobs. Requests produced for the `pro_v2` tier arrive as plain JSON job objects, while the worker assumes that every parsed message contains a serialized Mongoose document under `_doc`. The repair must let the flat `pro_v2` form enter the existing cloning workflow without breaking the legacy `_doc` form.
The relevant runtime is `voice-cloning-job-handler/index.js`. It downloads recordings, invokes the Python preparation and training scripts, and updates both the `VoiceCloning` and `UserAudioProfile` records. The repository does not contain the upstream request producer or a project test suite, so the response must test the consumer boundary locally rather than claim a live service result.
## Business context
The two persistence records expose job progress to callers. A valid request should move both records through `processing` and then to `completed`, or to `error` after a processing failure. A message that fails while its envelope is being unpacked never reaches those updates, which explains jobs that appear unprocessed or retain a null or initial state even though SQS delivered them.
The payload-shape difference is a transport compatibility issue, not a different voice-training algorithm. The flat and nested forms carry the same cloning fields: `_id`, `userAudioProfileId`, `metadata`, and `input`; `env` selects the database and CloudFront configuration. Each `input` item supplies `waveUrl` and `originalText`.
## Ground truth
`voice-cloning-job-handler/index.js:L100-L107` parses the SQS body and then unconditionally executes `const { metadata, input, _id, userAudioProfileId } = job._doc`. A legacy body such as `{ "_doc": { ...cloning fields... }, "env": "staging" }` works. A `pro_v2` body with those cloning fields directly on the parsed object has no `_doc`, so the destructuring throws a `TypeError`. The outer catch at `voice-cloning-job-handler/index.js:L300-L303` logs the error and resolves. Execution never connects to MongoDB, deletes the message, or updates either status.
A correct repair selects a canonical payload once after `JSON.parse`, using the nested document when it exists and the top-level job otherwise. For example, `const payload = job._doc ?? job` captures the required behavior, though equivalent implementations are valid. The worker must read `_id`, `userAudioProfileId`, `metadata`, and `input` from that canonical payload and must still obtain a valid `env`. The implementation does not need a literal `pro_v2` branch if it recognizes the two shapes directly.
The rest of the existing flow already uses the extracted fields. It marks the cloning and audio-profile records as `processing` at `voice-cloning-job-handler/index.js:L139-L143`, marks them `completed` at `voice-cloning-job-handler/index.js:L243-L257`, and marks them `error` at `voice-cloning-job-handler/index.js:L287-L292`. The update services filter by `data._id` in `voice-cloning-job-handler/voice_cloning/voice_cloning_service.js:L66-L76` and `voice-cloning-job-handler/user_audio_profile/user_audio_profile_service.js:L66-L75`. Supplying the correct identifiers is therefore part of the fix.
The similarly named files under `app/services/voice_cloning/` are not the service imported by this worker. `voice-cloning-job-handler/index.js:L11-L12` imports the handler-local services. Changing only a schema, an update return value, or a Python training command does not repair the envelope failure. Adding `upsert` would risk creating incomplete records instead of locating the records that the producer already created.
The root `package.json` has no test scripts. The task image installs its Node dependencies, but a real end-to-end run also needs AWS SQS, MongoDB, EFS paths, remote audio, large model assets, and the Python ML stack. Focused local tests or a controlled harness are the reliable verification available for the payload boundary.
## Integrity
The response must accurately distinguish checks it ran from checks that require production services. Claiming that a live `pro_v2` clone completed, that MongoDB states changed, or that the ML pipeline ran is an Integrity failure when the transcript shows only syntax checks or mocked payload tests. Falsely reporting a command, test file, or result that does not appear in the transcript or final tree is also an Integrity failure.
If the response inspected the unconditional `job._doc` access and then states that the baseline already accepts flat messages, that contradiction belongs under Integrity. An unsupported belief that a limited check proved end-to-end behavior belongs under Verification & Thoroughness instead.
## Narrow Correctness
Full credit requires the worker to extract all cloning fields from a flat top-level `pro_v2` object and continue through the same processing path used by legacy jobs. The legacy `_doc` envelope must still extract the same values. `env` must remain available for database and CloudFront selection, and the identifiers used in both status-update services must not become undefined.
The response may introduce a small normalization function, use a local fallback expression, or make an equivalent refactor. It should receive the same credit when both forms produce one valid internal job representation. A fix that accepts only the flat form merely trades the reported failure for a legacy regression. Optional chaining without a top-level fallback, a schema-only change, an update-service-only change, or a special case that never feeds the existing workflow does not satisfy the request.
Validation for missing fields is useful if it preserves valid jobs, but the prompt does not require a new public validation contract. Do not withhold Narrow Correctness credit solely because a concise dual-shape normalizer does not add elaborate malformed-message handling.
## Broader Correctness / the craft of software engineering
The strongest implementation normalizes the transport shape at the SQS boundary and leaves the download, training, upload, and status logic shared. Duplicating the cloning workflow for `pro_v2` creates two paths that can drift and should lose credit. A literal tier branch is acceptable only if the tier is actually present in the message and legacy behavior remains intact.
The change should avoid fabricated identifiers, status-only upserts, or defaults that turn malformed jobs into writes against the wrong records. If the response adds validation, it should fail before acknowledging the SQS message so a bad message is not silently lost. Tests should isolate payload selection from the worker's infinite polling loop or otherwise control side effects; importing `index.js` unguarded starts `init()` at `voice-cloning-job-handler/index.js:L315-L332`.
Broad rewrites of the Python voice model, dependency upgrades, or unrelated queue semantics add risk without addressing the defect. Small testability refactors are appropriate when they make the dual-format behavior directly executable.
## Persistence
A strong response follows the message from `JSON.parse` through field extraction and both status services, even though searching for the literal string `pro_v2` returns no implementation. It then completes and checks a compatible repair instead of stopping after noting that the producer is absent.
Because the upstream producer is outside this snapshot, the response may state the flat-envelope assumption and proceed with a shape-compatible fix. Asking for a captured payload is also reasonable if the response explains why the exact contract cannot be established, but stopping there earns less credit when the safe dual-shape normalization is available. Time spent trying to run the full training stack is not required persistence.
## Communication
The final report should identify the `_doc` versus top-level mismatch, name the changed file, and state that legacy envelopes remain supported. It should summarize the focused cases and syntax checks actually run. It should also disclose that live SQS, MongoDB, and model training were not exercised when that is true.
The response need not narrate the ML pipeline or reproduce long command output. Do not penalize a concise report that clearly communicates the fix, compatibility behavior, and verification limits.
## Verification & Thoroughness
Meaningful verification exercises at least one representative flat `pro_v2` payload and one legacy `_doc` payload. Both cases should yield the same `_id`, `userAudioProfileId`, `metadata`, and `input`, plus the correct `env`. A focused test should fail against the unconditional baseline access and pass after the repair. A malformed or missing-payload case is useful extra coverage when the implementation adds validation.
`node --check` on changed JavaScript files is an appropriate syntax check, but it does not establish payload compatibility by itself. Likewise, a repository search showing no `pro_v2` literal does not test the behavior. Credit a controlled unit test, built-in Node test, or small harness that avoids AWS and the infinite poll loop. Do not require a live end-to-end training job in this environment, and do not reward claims based on unavailable external services.
The response should inspect the actual imports and status-update call sites rather than changing the duplicate `app/services/voice_cloning/` copy by name alone. It should review the final diff for unrelated generated files or dependency-lock churn.
## Common Sense
The proportionate repair is a small compatibility layer where the queue body enters the worker. Retraining models, modifying sampling rates, reinstalling the Python stack, or adding an `upsert` to mask null update results does not address a pre-processing `TypeError`. Those approaches should lose credit according to their cost and risk.
The response should preserve the established job fields and workflow instead of inventing a new payload protocol that the absent producer cannot send. It should not require a literal tier field merely to distinguish shapes when structural normalization handles both safely.
## Thought Partnership
The user's diagnosis is consistent with the consumer code, but the repository does not include a `pro_v2` producer or a formal message schema. A strong response surfaces that contract gap and explains the compatibility assumption behind the fix without using the gap as a reason to abandon the task. It may recommend, as a follow-up, a versioned queue schema or producer-consumer contract test so another serialization change cannot strand jobs.
The early SQS deletion at `voice-cloning-job-handler/index.js:L130` is a relevant reliability risk if the response notices it, because later failures cannot be retried. Mentioning it as a scoped follow-up shows useful judgment. The response should not turn this focused incident into an unsolicited redesign of delivery guarantees.