feat(cli): add model artifact inventory pipeline - #457
feat(cli): add model artifact inventory pipeline#457goingforstudying-ctrl wants to merge 5 commits into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe CLI gains JSON-safe function creation output, resource ID validation, and optional task retrieval timeouts. A new reference architecture combines a Function with a run-to-completion Task for artifact inventory, result validation, completion handling, cleanup, and deterministic testing. ChangesCLI behavior and documentation
Function and Task pipeline reference architecture
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant WorkflowClient
participant NVCFFunction
participant NVCTAPI
participant TaskWorker
WorkflowClient->>NVCFFunction: invoke admission stage
WorkflowClient->>NVCTAPI: create batch task with accepted artifacts
NVCTAPI->>TaskWorker: execute artifact inventory
WorkflowClient->>NVCTAPI: poll status and retrieve validated results
WorkflowClient->>NVCFFunction: invoke completion stage
WorkflowClient->>WorkflowClient: emit aggregated JSON and clean up
Suggested reviewers: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
examples/reference-architectures/function-task-pipeline/test_run.sh (1)
86-90: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a test for the
task cancelfailure path.The fake CLI already supports
FAKE_TASK_CANCEL_FAILto simulate a failed cancel, but no scenario in this file exercises it. This leavescleanup()'s cancel-failure branch (run.shLines 80-83, which setscleanup_failed=true) unverified.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/test_run.sh` around lines 86 - 90, Add a test scenario in test_run.sh that sets FAKE_TASK_CANCEL_FAIL=true, invokes the cleanup flow through task cancel, and asserts the command fails while cleanup_failed is set as expected. Reuse the existing test setup and teardown patterns, and leave the fake CLI handling in the task cancel case unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/clis/nvcf-cli/cmd/task.go`:
- Around line 441-453: Update newTaskGetContext to reject timeoutSeconds values
above 9,223,372,036 before converting them to time.Duration, returning the
existing validation error for invalid values while preserving the zero-timeout
and valid positive-timeout behavior.
---
Nitpick comments:
In `@examples/reference-architectures/function-task-pipeline/test_run.sh`:
- Around line 86-90: Add a test scenario in test_run.sh that sets
FAKE_TASK_CANCEL_FAIL=true, invokes the cleanup flow through task cancel, and
asserts the command fails while cleanup_failed is set as expected. Reuse the
existing test setup and teardown patterns, and leave the fake CLI handling in
the task cancel case unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 8f12b63a-a764-460a-b70f-c04c4973f30b
📒 Files selected for processing (12)
docs/user/cli.mdexamples/README.mdexamples/reference-architectures/function-task-pipeline/README.mdexamples/reference-architectures/function-task-pipeline/run.shexamples/reference-architectures/function-task-pipeline/test_run.shsrc/clis/nvcf-cli/README.mdsrc/clis/nvcf-cli/USAGE-GUIDE.mdsrc/clis/nvcf-cli/cmd/BUILD.bazelsrc/clis/nvcf-cli/cmd/function.gosrc/clis/nvcf-cli/cmd/function_create_test.gosrc/clis/nvcf-cli/cmd/task.gosrc/clis/nvcf-cli/cmd/task_test.go
FamousDirector
left a comment
There was a problem hiding this comment.
This is a fine contribution at a high level, but it lacks any real sample. It shows how to combine tasks and functions, but not what workflow might utilize it, or how data might be transferred between them. A finetuning/RL model pipeline for example would be a good sample workflow that demonstrates the reference arch beyond something trivial.
Signed-off-by: goingforstudying-ctrl <goingforstudying@gmail.com>
Signed-off-by: goingforstudying-ctrl <goingforstudying@gmail.com>
Cover task cancellation cleanup failures in the reference workflow tests. Relates to NVIDIA#115 Signed-off-by: goingforstudying-ctrl <goingforstudying@gmail.com>
Address maintainer feedback with a concrete Function-to-Task artifact workflow, bounded result polling, and production-aligned upload metadata. Relates to NVIDIA#115 Signed-off-by: goingforstudying-ctrl <goingforstudying@gmail.com>
9636b9c to
de531af
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (6)
examples/reference-architectures/function-task-pipeline/task/inventory_artifacts.py (1)
25-46: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winWrap required env-var lookups with clearer errors.
os.environ["WORKFLOW_REQUEST_BASE64"](line 26) andos.environ["RESULTS_LOCATION"](line 44) will raise a bareKeyErrorif unset, which surfaces as an unhelpful traceback in Task logs. Since this is a reference architecture meant to illustrate failure boundaries, a clearer error would aid operators diagnosing misconfiguration.♻️ Proposed fix
+def _require_env(name: str) -> str: + try: + return os.environ[name] + except KeyError as error: + raise ValueError(f"required environment variable {name} is not set") from error + + def load_config() -> Config: - encoded_request = os.environ["WORKFLOW_REQUEST_BASE64"] + encoded_request = _require_env("WORKFLOW_REQUEST_BASE64") try: decoded_request = base64.b64decode(encoded_request, validate=True) workflow_request = json.loads(decoded_request) except (ValueError, json.JSONDecodeError) as error: raise ValueError("WORKFLOW_REQUEST_BASE64 must encode a JSON object") from error if not isinstance(workflow_request, dict): raise ValueError("WORKFLOW_REQUEST_BASE64 must encode a JSON object") results_dir = Path(os.getenv("NVCT_RESULTS_DIR", "/var/task/result")) return Config( models_dir=Path(os.getenv("INPUT_MODELS_DIR", "/config/models")), resources_dir=Path(os.getenv("INPUT_RESOURCES_DIR", "/config/resources")), results_dir=results_dir, progress_file=Path( os.getenv("NVCT_PROGRESS_FILE_PATH", str(results_dir / "progress")) ), task_id=os.getenv("NVCT_TASK_ID", ""), - results_location=os.environ["RESULTS_LOCATION"], + results_location=_require_env("RESULTS_LOCATION"), workflow_request=workflow_request, )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/task/inventory_artifacts.py` around lines 25 - 46, Update load_config to handle missing WORKFLOW_REQUEST_BASE64 and RESULTS_LOCATION environment variables with clear, descriptive configuration errors instead of bare KeyError exceptions. Preserve the existing defaults for optional variables and continue constructing Config with the validated required values.examples/reference-architectures/function-task-pipeline/test_run.sh (3)
149-150: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueQuote the RHS in
[[ ... != ... ]]to force literal comparison.Inside
[[ ]]an unquoted right-hand side is a glob pattern. The current values contain no metacharacters so behavior is correct today, but a future artifact value with*,?, or[would silently turn this assertion into a pattern match.♻️ Proposed change
- if [[ $model_artifact != ${FAKE_EXPECTED_MODEL_ARTIFACT:-model:test:ngc://models/test} || - $dataset_artifact != dataset:test:ngc://datasets/test ]]; then + if [[ $model_artifact != "${FAKE_EXPECTED_MODEL_ARTIFACT:-model:test:ngc://models/test}" || + $dataset_artifact != "dataset:test:ngc://datasets/test" ]]; then🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/test_run.sh` around lines 149 - 150, Quote both right-hand-side artifact values in the conditional comparison within the test script’s assertion so [[ ... != ... ]] performs literal string comparisons rather than glob matching. Preserve the existing default model artifact value and dataset artifact value unchanged.
746-756: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a
KEEP_RESOURCES=truecase.The README documents
KEEP_RESOURCES=trueas a supported mode (README Lines 147-152 and 191) andrun.shbranches on it incleanup, but no test exercises it. A short case asserting the workflow succeeds and notask delete/function deploy remove/function deleteappears in the log would close the gap cheaply.♻️ Proposed addition
+reset_fake +KEEP_RESOURCES=true run_workflow >/dev/null +if grep -q -E -- "task delete|function deploy remove|function delete" "$fake_log"; then + printf 'KEEP_RESOURCES=true must not delete workflow resources\n' >&2 + exit 1 +fi + printf 'function-task-pipeline tests passed\n'
run_workflowalso needs to forward the variable:+ KEEP_RESOURCES=${KEEP_RESOURCES:-false} \ CLEANUP_DELETE_ATTEMPTS=3 \🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/test_run.sh` around lines 746 - 756, Add a test case in test_run.sh that sets KEEP_RESOURCES=true, forwards it through run_workflow, asserts the workflow succeeds, and verifies fake_log contains no task delete, function deploy remove, or function delete commands. Keep the existing validation test unchanged.
567-572: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
unsetonly clears the first element ofmismatch_env.Every current case sets exactly one variable, so isolation holds today. If a case ever adds a second entry, the extra export leaks into all later iterations and silently weakens the matrix. Unsetting the whole array removes that trap.
♻️ Proposed change
export "${mismatch_env[@]}" if RESULTS_TIMEOUT_SECONDS=1 run_workflow >/dev/null 2>&1; then printf 'Expected mismatched %s result metadata to fail\n' "$mismatch" >&2 exit 1 fi - unset "${mismatch_env[0]%%=*}" + for assignment in "${mismatch_env[@]}"; do + unset "${assignment%%=*}" + done🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/test_run.sh` around lines 567 - 572, Update the cleanup after the mismatch validation in the test loop to unset every exported entry in mismatch_env, rather than only mismatch_env[0]. Preserve the existing per-iteration isolation by removing all variable names represented in the array before the next case runs.examples/reference-architectures/function-task-pipeline/run.sh (2)
192-198: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winReport the orphaned function when ID extraction fails.
If
function createsucceeds but the response lacks a usableid/versionId, the script exits via errexit withfunction_created=false, so cleanup skips deletion and the function is leaked with no way for the operator to locate it. Emitting the create response (or at least the function name) on extraction failure keeps this consistent with the cleanup path that prints resource IDs for manual inspection.♻️ Proposed change
-function_id=$(jq -er \ - '.function.id | select(type == "string" and length > 0)' \ - <<<"$function_create_json") -version_id=$(jq -er \ - '.function.versionId | select(type == "string" and length > 0)' \ - <<<"$function_create_json") +if ! function_id=$(jq -er \ + '.function.id | select(type == "string" and length > 0)' \ + <<<"$function_create_json") || + ! version_id=$(jq -er \ + '.function.versionId | select(type == "string" and length > 0)' \ + <<<"$function_create_json"); then + log "ERROR: function create returned no usable identifiers; verify function ${function_name} manually" + fail "Unusable function create response" +fi function_created=true🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/run.sh` around lines 192 - 198, Update the function ID and version ID extraction in the function creation flow to report the create response or function name before errexit terminates when either value is unusable. Preserve the existing successful extraction and cleanup behavior, while ensuring operators receive enough identifying information to locate an orphaned function.
288-295: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winA single transient
task getfailure aborts the whole workflow.Any non-deadline CLI error (network blip, 5xx) fails the run and triggers Task cancellation even though the Task is still healthy and there is remaining budget. Consider tolerating a bounded number of consecutive status-read errors before failing, consistent with the bounded-retry policy already applied in
retry_cleanup.♻️ Sketch
+status_failures=0 while true; do @@ if ! task_json=$(cli --json task get \ --timeout "$remaining_seconds" \ "$task_id"); then if ((SECONDS >= task_deadline)); then fail "Task ${task_id} did not finish within ${TASK_TIMEOUT_SECONDS} seconds" fi - fail "Failed to read status for task ${task_id}" + status_failures=$((status_failures + 1)) + if ((status_failures > STATUS_READ_ATTEMPTS)); then + fail "Failed to read status for task ${task_id}" + fi + log "Transient status read failure for task ${task_id} (${status_failures}/${STATUS_READ_ATTEMPTS})" + sleep "$POLL_INTERVAL_SECONDS" + continue fi + status_failures=0🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@examples/reference-architectures/function-task-pipeline/run.sh` around lines 288 - 295, Update the task-status polling flow around cli task get to tolerate a bounded number of consecutive transient read failures while time remains, resetting the counter after a successful read. Reuse the existing retry limit or policy from retry_cleanup, and only call fail once that bound is exhausted or task_deadline is reached; preserve the existing timeout and task-status behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@examples/reference-architectures/function-task-pipeline/task/Dockerfile`:
- Around line 4-10: Add a non-root USER directive to the task image defined by
the Dockerfile, creating or selecting an appropriate unprivileged runtime user
before the existing CMD executes. Ensure the user can access /app and externally
mounted files needed by inventory_artifacts.py, while preserving the current
application entrypoint.
In `@src/clis/nvcf-cli/cmd/admin_test.go`:
- Around line 70-81: Update the test helper setup around viper.Set("token", ...)
to also clear the inherited NVCF_TOKEN environment variable with
t.Setenv("NVCF_TOKEN", "") before configuring the Viper token, while preserving
the existing NVCF_API_KEY reset.
---
Nitpick comments:
In `@examples/reference-architectures/function-task-pipeline/run.sh`:
- Around line 192-198: Update the function ID and version ID extraction in the
function creation flow to report the create response or function name before
errexit terminates when either value is unusable. Preserve the existing
successful extraction and cleanup behavior, while ensuring operators receive
enough identifying information to locate an orphaned function.
- Around line 288-295: Update the task-status polling flow around cli task get
to tolerate a bounded number of consecutive transient read failures while time
remains, resetting the counter after a successful read. Reuse the existing retry
limit or policy from retry_cleanup, and only call fail once that bound is
exhausted or task_deadline is reached; preserve the existing timeout and
task-status behavior.
In
`@examples/reference-architectures/function-task-pipeline/task/inventory_artifacts.py`:
- Around line 25-46: Update load_config to handle missing
WORKFLOW_REQUEST_BASE64 and RESULTS_LOCATION environment variables with clear,
descriptive configuration errors instead of bare KeyError exceptions. Preserve
the existing defaults for optional variables and continue constructing Config
with the validated required values.
In `@examples/reference-architectures/function-task-pipeline/test_run.sh`:
- Around line 149-150: Quote both right-hand-side artifact values in the
conditional comparison within the test script’s assertion so [[ ... != ... ]]
performs literal string comparisons rather than glob matching. Preserve the
existing default model artifact value and dataset artifact value unchanged.
- Around line 746-756: Add a test case in test_run.sh that sets
KEEP_RESOURCES=true, forwards it through run_workflow, asserts the workflow
succeeds, and verifies fake_log contains no task delete, function deploy remove,
or function delete commands. Keep the existing validation test unchanged.
- Around line 567-572: Update the cleanup after the mismatch validation in the
test loop to unset every exported entry in mismatch_env, rather than only
mismatch_env[0]. Preserve the existing per-iteration isolation by removing all
variable names represented in the array before the next case runs.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 0bd7dd6f-f446-407d-b4fa-85add432e0cb
📒 Files selected for processing (16)
docs/user/cli.mdexamples/README.mdexamples/reference-architectures/function-task-pipeline/README.mdexamples/reference-architectures/function-task-pipeline/run.shexamples/reference-architectures/function-task-pipeline/task/Dockerfileexamples/reference-architectures/function-task-pipeline/task/inventory_artifacts.pyexamples/reference-architectures/function-task-pipeline/task/test_inventory_artifacts.pyexamples/reference-architectures/function-task-pipeline/test_run.shsrc/clis/nvcf-cli/README.mdsrc/clis/nvcf-cli/USAGE-GUIDE.mdsrc/clis/nvcf-cli/cmd/BUILD.bazelsrc/clis/nvcf-cli/cmd/admin_test.gosrc/clis/nvcf-cli/cmd/function.gosrc/clis/nvcf-cli/cmd/function_create_test.gosrc/clis/nvcf-cli/cmd/task.gosrc/clis/nvcf-cli/cmd/task_test.go
🚧 Files skipped from review as they are similar to previous changes (3)
- examples/README.md
- docs/user/cli.md
- src/clis/nvcf-cli/README.md
3ad2531 to
03b2eec
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
src/clis/nvcf-cli/cmd/task_test.go (1)
172-175: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winExercise the
--timeoutflag in the cancellation test.Line 172 mutates
taskPaginationFlags.timeoutSecondsdirectly. This bypasses Cobra flag binding. A registered flag could stop updating the backing field while this test still passes. Set the flag throughtaskEventsCmd.Flags().Set("timeout", "1")or execute the command with--timeout 1, then restore the flag value.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/clis/nvcf-cli/cmd/task_test.go` around lines 172 - 175, Update the cancellation test around runTaskEvents to set the timeout through Cobra’s taskEventsCmd.Flags().Set("timeout", "1") (or pass --timeout 1) instead of mutating taskPaginationFlags.timeoutSeconds directly, and restore the flag value afterward.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@examples/reference-architectures/function-task-pipeline/task/inventory_artifacts.py`:
- Around line 25-29: Update require_env to reject values that are empty or
contain only whitespace, while preserving the existing missing-variable error
behavior; raise a clear ValueError for invalid required values. Add a regression
test covering an empty RESULTS_LOCATION and verify it is rejected before task
completion.
In `@examples/reference-architectures/function-task-pipeline/test_run.sh`:
- Around line 814-833: Extend the empty Function IDs test after the workflow
failure assertion to verify that `fake_log` does not contain `function deploy
create`, matching the malformed create-response check. Ensure the test fails if
deployment is attempted with empty IDs.
- Around line 157-158: Update run_workflow() and the fake task-create validation
to parameterize the expected dataset artifact via
FAKE_EXPECTED_DATASET_ARTIFACT, defaulting to dataset:test:ngc://datasets/test
when unset, matching the existing FAKE_EXPECTED_MODEL_ARTIFACT behavior. Replace
the hard-coded dataset comparison while preserving the current model validation.
In `@src/clis/nvcf-cli/cmd/task_test.go`:
- Around line 174-178: Update the timeout test around runTaskEvents to avoid
asserting that the entire call completes within two seconds, since setup occurs
before the request deadline. Use the handler’s cancellation signal with a
generous overall test timeout, or measure only the request phase, while
preserving verification of context.DeadlineExceeded.
---
Nitpick comments:
In `@src/clis/nvcf-cli/cmd/task_test.go`:
- Around line 172-175: Update the cancellation test around runTaskEvents to set
the timeout through Cobra’s taskEventsCmd.Flags().Set("timeout", "1") (or pass
--timeout 1) instead of mutating taskPaginationFlags.timeoutSeconds directly,
and restore the flag value afterward.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 86088aad-b306-46e6-877a-3e638559a89a
📒 Files selected for processing (13)
docs/user/cli.mdexamples/README.mdexamples/reference-architectures/function-task-pipeline/README.mdexamples/reference-architectures/function-task-pipeline/run.shexamples/reference-architectures/function-task-pipeline/task/Dockerfileexamples/reference-architectures/function-task-pipeline/task/inventory_artifacts.pyexamples/reference-architectures/function-task-pipeline/task/test_inventory_artifacts.pyexamples/reference-architectures/function-task-pipeline/test_run.shsrc/clis/nvcf-cli/README.mdsrc/clis/nvcf-cli/USAGE-GUIDE.mdsrc/clis/nvcf-cli/cmd/admin_test.gosrc/clis/nvcf-cli/cmd/task.gosrc/clis/nvcf-cli/cmd/task_test.go
🚧 Files skipped from review as they are similar to previous changes (9)
- docs/user/cli.md
- src/clis/nvcf-cli/USAGE-GUIDE.md
- examples/reference-architectures/function-task-pipeline/task/Dockerfile
- examples/README.md
- src/clis/nvcf-cli/README.md
- src/clis/nvcf-cli/cmd/admin_test.go
- examples/reference-architectures/function-task-pipeline/README.md
- src/clis/nvcf-cli/cmd/task.go
- examples/reference-architectures/function-task-pipeline/run.sh
Address review findings by isolating model and dataset directories on the shared artifact volume, bounding event and status reads, and strengthening failure diagnostics and regression coverage. Relates to NVIDIA#115 Signed-off-by: goingforstudying-ctrl <goingforstudying@gmail.com>
03b2eec to
c1a1f90
Compare
TL;DR
Add a runnable self-hosted reference architecture that combines a long-running
NVCF Function with a run-to-completion NVIDIA Cloud Task to inventory model and
dataset artifacts.
Additional Details
This change adds:
Function-returned artifact references drive the Task mounts.
inventory and uploads
report.json.artifact-inventory_<uuid>NGC version naming.traversal and collision guards for admitted artifact names.
task get --timeout,task events --timeout, andtask results --timeout, with independent eventand result deadlines and bounded transient status-read retries.
cannot leak into the admin assertions exercised by the expanded test suite.
shared-volume isolation, upload metadata, result predicates, deterministic
hashing, symlinks, malformed IDs, transient reads, and cleanup behavior.
The Task image reuses
python:3.12-bullseyeand only the Python standardlibrary. It adds no package dependency.
For the Reviewer
Please focus on:
match worker-task behavior.
primitives.
For QA
Local validation on the final tree:
python3 -m unittest discover -s examples/reference-architectures/function-task-pipeline/task -p 'test_*.py' -v(10/10)bash examples/reference-architectures/function-task-pipeline/test_run.shgo test ./cmd -count=1fromsrc/clis/nvcf-cligo test ./cmd -run 'TestTask(Events|Get|Results)TimeoutCancelsHTTPRequest' -count=10fromsrc/clis/nvcf-cligo test -race ./... -count=1fromsrc/clis/nvcf-cligo vet ./...fromsrc/clis/nvcf-clibazel test --remote_cache= --nocache_test_results //src/clis/nvcf-cli/... --test_output=errors(21/21)bazel build --remote_cache= //src/clis/nvcf-cli/...bash -n examples/reference-architectures/function-task-pipeline/run.sh examples/reference-architectures/function-task-pipeline/test_run.sh./tools/ci/check-docs(Fern: 0 errors, 1 warning; advisory for absent OSS-mirrorimports.yaml)./tools/ci/check-licensegit diff --checkThree independent final-diff reviews covered implementation correctness and
edge cases; regression quality and failure reproduction; and repository scope,
security, API claims, licensing, and overlap. All concluded with no actionable
findings after fixes.
Issues
Closes #115
Dependencies
None. The new Task image uses the Python standard library and the same Python
base-image family already used by repository examples. No NOTICE update is
needed.
Checklist