PAS DEFT Workflow
Standalone install? If this session was not initialized by the TAO skill
bank plugin, run the tao-setup skill first for host preflight, credential
checks, and cross-skill discovery.
Run the canonical PAS flow as one resumable, disk-backed workflow. All PAS
workflow logic, templates, and host adapters ship with this skill; customers do
not need a separate source checkout. The bundled scripts make stage calls
deterministic without adding another orchestration layer.
This skill supports every packaged TAO execution platform: Docker, SLURM,
Kubernetes, Brev, and virtualenv. The workflow produces a platform-neutral,
schema-validated action bundle; the selected platform skill owns native
submit/status/logs/cancel and the job-record.
Virtualenv execution uses separate immutable pyt and ds runtime profiles;
the workspace control .venv is not an execution runtime.
Entry Contract
tao-deft-pas and tao-run-deft-pas select this same workflow. If the user
did not choose a platform, ask once among Docker, SLURM, Kubernetes, Brev, and
virtualenv; never default to Docker. On resume, the immutable platform in
deft_state.json is already the selection and must not be changed.
Use two intake phases:
Perform only bounded, lightweight path discovery. Two explicit archive file
paths win and suppress all archive searching. An explicit archive directory
is treated as one approved search root. Otherwise, resolve the conventional
~/workspace and use only these deduplicated search roots: ~/pas, the
workspace root, and its pas/, input/, and inputs/ children. Check the
workspace root itself only; beneath each other search root, inspect the root
and directories at most two levels below it. This AOI-style bounded-subtree
lookup supports nested export/drop directories without turning into a home
or repository scan. Never follow symlinks or add the current checkout,
source repositories, tutorial/notebook trees, or workspace dataset-output
trees as implicit search roots.
An archive candidate contains direct regular-file children
images_raw.tar and meta.tar.gz; the workflow needs one such pair, not
multiple dataset directories. Follow the classification and provenance
format in references/preflight.md so the user sees every search root, its
reason and depth bound, the directory in which a pair was found, and whether
it is archive-only or mixed with extracted data.
Enumerate run-state files only at
<workspace>/results/run_*/deft_state.json. Read the minimal identity fields
and present a resume candidate only when workflow is exactly
tao-run-deft-pas; never offer AOI or unidentified DEFT state as PAS.
Do not validate large archives to EOF or inspect platforms, images, GPUs, or
credentials yet.
If max_iterations or a time budget is absent, ask one consolidated
question for that required value and any genuinely ambiguous path/run
choice. State the documented defaults and that a complete read-only
preflight plus approval summary follows. Do not ask whether the user wants
optional KPI, authentication, or parameter overrides; apply their defaults
unless the prompt already supplies an override.
After required intake is resolved, discover and validate:
- workspace and either a new
${RESULTS_DIR} or one existing run to resume;
images_raw.tar and meta.tar.gz; SHA256SUMS is optional;
max_iterations, or a user-supplied time budget from which an iteration
limit can be estimated;
- metric name, query type, operator, and optional target;
- whether the deployment requires authenticated Hugging Face model access;
- selected TAO execution platform and its platform-specific prerequisites;
- any explicit epoch, GPU, mining, continual-learning, or visualization
overrides.
For a new run, RESULTS_DIR must be a child of WORKSPACE. DATASET_ROOT
must be below a workspace data directory (for example
$WORKSPACE/data/pas_v31_tao_ft), not directly below the workspace; neither
path may contain the other. All approved paths are absolute and non-symlink.
Never replace an explicit value with a heuristic. Defaults apply only to
unspecified values and must be identified as defaults in the pre-flight
summary. max_iterations has no default. An absent metric target means an
ungated run that stops after max_iterations. Hugging Face token forwarding
defaults to disabled because the bundled model is public.
The authoritative parameter contract is the nested dataclass schema in
scripts/pas_deft/config.py, adapted from the PAS reference notebook. Read
that schema when a request needs the meaning, default, numeric bounds, or valid
options of a DEFT parameter. Do not infer an undocumented field or bypass its
metadata constraint. Config preparation, initialization, audit, and every
host-side stage validate the materialized bundle through that same schema;
the pas YAML section is validated through the typed PAS configuration model.
If required information remains missing after full discovery, ask one
consolidated follow-up. A normal invocation should need no knowledge of stage
modules, container mounts, state files, or bundled-runtime function
signatures.
Safety Gate
Perform only read-only discovery before approval: resolve paths, inspect file
metadata and archives, check process-environment variable presence, inspect
local images, inspect GPUs, and audit an existing run. Credentials come only
from the launching process environment; never open or source a credential file,
and never print, grep, copy, or echo a credential value. If a required variable
is absent, tell the user which name
to export in the shell that launches the agent; never ask for its value in
chat. Do not inspect credential-file metadata when no credential is needed. If
the user explicitly asks for a file-permission check, stat only that named
file and warn about group/other readability.
Show the summary defined in references/preflight.md, including every
parameter and source, planned file creation/extraction, image pulls, estimated
runtime, and resume status. Wait for explicit approval before registry login or
pulls, platform submit, package installation, archive extraction, config/state
creation, or any write under the workspace.
If an approved parameter later changes, show the changed summary rows and get
approval again before continuing. No confirmation is needed between unchanged,
already-approved stages.
Execution Contract
After approval, follow references/preflight.md to prepare the runtime,
materialize the immutable run config, and initialize state once. Never
reinitialize an existing run.
Before every stage, after context compaction, and before any completion
claim, run:
"$SKILL_ROOT/scripts/deft_python.sh" --workspace "$WORKSPACE" --runtime \
"$SKILL_ROOT/scripts/audit_deft_run.py" --results-dir "$RESULTS_DIR"
Continue only when the audit reports IN_PROGRESS and its next_action
matches the intended stage. For INVALID, stop launching work and report
the listed inconsistency. For nonterminal FAILED whose next_action is
loop_stop, follow the pipeline reference and commit hard_stop; for
terminal FAILED, report the failure and launch no more work. For
COMPLETE, do not rerun a stage.
Read only the current stage reference named by read_before_action. Use
run_pas_stage.py for bundled PAS host stages. For every TAO action, use
run_deft_action.py prepare, reconcile any interrupted launch, bind the
exact request-owned job-record before native submit, dispatch the emitted
bundle through the selected platform's four verbs, synchronize remote
outputs, capture native logs, then use run_deft_action.py finalize. Follow
references/platform-execution.md; never assemble an untracked launch.
A command succeeds only when its exit status is zero and its documented
output checks pass. Capture verbose output at the action-owned log path;
inspect the final error block or at most the last 40 lines.
Commit each successful or terminally failed stage exactly once with
commit_stage.py. It validates artifact structure, freshness, iteration
scope, command evidence, leakage, and transition order before applying a
recoverable, journaled update to deft_state.json and loop_log.jsonl.
Never call
log_stage.py or record_metric_result.py directly, and never hand-edit
canonical state, log, metric, or history files.
Render the HTML report with render_deft_report.py. Reporting is a
deterministic read of audited state; it does not require another agent.
Keep the driving turn attached through the complete bounded loop. After a
stage reaches terminal status, finalize/commit it, re-audit, and immediately
continue with the audit-selected next action. An in-progress update is
commentary, not a final response and not a detach point.
All recorded artifact paths are absolute host paths under ${RESULTS_DIR}.
Baseline artifacts live under zs/, iteration N under iter_N/, and run-wide
splits, source embeddings, and history files at the run root.
Workflow
The normal path is linear, with only two meaningful decisions:
pre-flight approval
-> dataset_setup -> pool_embed -> baseline evaluate
-> KPI met? yes: loop_stop
no: baseline gap_analysis
-> for N = 1..max_iterations:
data_mining -> history_select -> visualize -> train -> evaluate
-> KPI met? yes: loop_stop
no and N < max: gap_analysis -> next iteration
no and N = max: loop_stop
-> final audit -> HTML report
Stage ownership and exact commands are in
references/scripts-and-agents.md. Read the detailed reference only when its
stage is next:
| Stage |
Reference |
Required result |
| dataset setup |
references/data-layout.md |
verified rebuilt dataset, transparent layout report, five split files, non-empty source-pool parquet |
| pool embedding and mining |
references/mining.md |
fresh command evidence plus non-empty, schema-checked parquet outputs |
| evaluate and train |
references/clip-train-eval.md, references/metric-contract.md |
successful TAO status, bound metric evidence; for train, a fresh best and normalized checkpoint |
| gap analysis |
references/gap-analysis.md |
non-empty iteration-scoped gaps parquet |
| history selection |
references/mining.md |
budgeted mined set, cumulative/history entry, zero eval leakage |
| visualization |
references/visualization.md |
enabled artifacts and command evidence, or a config-authorized skip |
visualize is the only optional stage. Commit it with --skip only when both
visualization settings are false in the approved config. Do not turn off a
failing visualization mid-run without revising and reapproving the config.
Loop and Recovery Rules
- The loop is bounded by
max_iterations; never create an iteration outside
that range. Once the KPI passes, the only legal next transition is
loop_stop. Do not mine or train again.
- Monitoring defaults to attached (
long_running_enabled=true, five-minute
updates). Use terminal-condition polling: retain the selected platform's job
id and poll its native status no more often than every 30 seconds, continuing
through finalize, commit, audit, and the next stage.
The bounded workflow's terminal audit status is the end condition, so this is
not open-ended polling.
- Never send a final response while an approved run is nonterminal. A final
response ends chat-side execution and nothing can wake it automatically.
Finalize the turn only after the audit reports
COMPLETE, terminal FAILED,
or INVALID, or when the user explicitly asks to stop or detach. If the
runtime genuinely cannot keep a turn alive, say so before launch and provide
the exact durable resume audit command; do not claim unattended monitoring.
- Never repeat an unchanged failed command speculatively. Classify the failure,
inspect its final log block, make one evidence-based correction permitted by
the stage reference, then retry once. Stable command status records persist
attempt 1/2, and the wrappers refuse a third attempt after context loss. The
audit must pass before advancing.
- A transient registry/network interruption or GPU contention may be retried
once after evidence shows the condition changed. A second equivalent failure
is terminal for the run.
- Never retry checksum or rebuild verification failure, zero-row mining,
schema/cardinality failure, missing eval-split evidence, eval leakage,
history conflict that fails documented resume, metric-contract mismatch,
stale/cross-iteration output, or an unsupported GPU architecture. Commit an
error when state permits and stop with the exact recovery action.
- If a command wrote outputs but crashed before stage commit, run the audit.
Reuse outputs only when their command status is successful, fresh, correctly
scoped, and all stage validators pass. History selection has one supported
recovery: rerun the deterministic adapter with
--resume; never delete or
edit a history entry by hand.
- Manual modification or truncation of
deft_state.json or loop_log.jsonl
invalidates the run. Preserve it for diagnosis and start a new results
directory.
Metric and Stop Semantics
The approved metric contract is immutable for the run. Evaluation must parse
the exact iteration's nvidia_pas_metrics_aggregate.csv; the result records
its source path and is re-derived during commit and audit. Checkpoint ranking
and best-run reporting follow the approved operator (>=/> chooses the
higher value, <=/< the lower), not a hard-coded metric convention.
Successful completion is exactly one of:
loop_stop(reason=kpi_met) after a bound evaluation satisfies its target;
loop_stop(reason=max_iterations) after the final allowed evaluation when
the target is unmet or absent.
hard_stop is a failed terminal outcome, not successful completion.
Completion
At a normal loop boundary:
commit loop_stop with the audit-selected reason;
render ${RESULTS_DIR}/DEFT_Loop_Report.html with trigger loop-end;
require this command to exit zero:
"$SKILL_ROOT/scripts/deft_python.sh" --workspace "$WORKSPACE" --runtime \
"$SKILL_ROOT/scripts/audit_deft_run.py" \
--results-dir "$RESULTS_DIR" --require-complete
Report the stop reason, baseline and best metric, best iteration/checkpoint,
completed iteration count, report path, and any warnings. A checkpoint, CSV,
HTML file, or assistant statement alone is not completion evidence.
Progressive References
| Need |
Read |
| read-only checks, approval summary, initialization |
references/preflight.md |
| stage commands and script interfaces |
references/scripts-and-agents.md |
| platform staging, four verbs, job records, finalization |
references/platform-execution.md |
| state transitions and resume behavior |
references/pipeline-and-state.md |
| dataset/archive contract |
references/data-layout.md |
| KPI parsing and evidence |
references/metric-contract.md |
| gap generation |
references/gap-analysis.md |
| embeddings, k-NN, selection |
references/mining.md |
| contact sheets and t-SNE |
references/visualization.md |
| train/evaluate/checkpoints |
references/clip-train-eval.md |
1---2name: tao-run-deft-pas3description: Run iterative improvement for NVIDIA TAO CLIP / SigLIP image-text retrieval on attribute-labelled data. Use when a request combines retrieval evaluation, weak-attribute or caption-pair mining, repeated retraining, and a stopping condition based on a retrieval KPI, validation plateau, or iteration budget; the customer need not know the DEFT or People Attribute Search (PAS) names. The self-contained workflow performs dataset preparation, zero-shot evaluation, attribute gap analysis, caption-space k-NN mining, history-aware selection, retraining, and re-evaluation. Treat `tao-deft-pas` as shorthand for this canonical `tao-run-deft-pas` workflow. Do not use for standalone CLIP training, one-off evaluation or embedding, generic k-NN mining, or AOI/ChangeNet DEFT workflows.4license: Apache-2.0 AND CC-BY-4.05---67# PAS DEFT Workflow89> **Standalone install?** If this session was not initialized by the TAO skill10> bank plugin, run the `tao-setup` skill first for host preflight, credential11> checks, and cross-skill discovery.1213Run the canonical PAS flow as one resumable, disk-backed workflow. All PAS14workflow logic, templates, and host adapters ship with this skill; customers do15not need a separate source checkout. The bundled scripts make stage calls16deterministic without adding another orchestration layer.1718This skill supports every packaged TAO execution platform: Docker, SLURM,19Kubernetes, Brev, and virtualenv. The workflow produces a platform-neutral,20schema-validated action bundle; the selected platform skill owns native21`submit`/`status`/`logs`/`cancel` and the job-record.22Virtualenv execution uses separate immutable `pyt` and `ds` runtime profiles;23the workspace control `.venv` is not an execution runtime.2425## Entry Contract2627`tao-deft-pas` and `tao-run-deft-pas` select this same workflow. If the user28did not choose a platform, ask once among Docker, SLURM, Kubernetes, Brev, and29virtualenv; never default to Docker. On resume, the immutable platform in30`deft_state.json` is already the selection and must not be changed.3132Use two intake phases:33341. Perform only bounded, lightweight path discovery. Two explicit archive file35 paths win and suppress all archive searching. An explicit archive directory36 is treated as one approved search root. Otherwise, resolve the conventional37 `~/workspace` and use only these deduplicated search roots: `~/pas`, the38 workspace root, and its `pas/`, `input/`, and `inputs/` children. Check the39 workspace root itself only; beneath each other search root, inspect the root40 and directories at most two levels below it. This AOI-style bounded-subtree41 lookup supports nested export/drop directories without turning into a home42 or repository scan. Never follow symlinks or add the current checkout,43 source repositories, tutorial/notebook trees, or workspace dataset-output44 trees as implicit search roots.4546 An archive candidate contains direct regular-file children47 `images_raw.tar` and `meta.tar.gz`; the workflow needs one such pair, not48 multiple dataset directories. Follow the classification and provenance49 format in `references/preflight.md` so the user sees every search root, its50 reason and depth bound, the directory in which a pair was found, and whether51 it is archive-only or mixed with extracted data.5253 Enumerate run-state files only at54 `<workspace>/results/run_*/deft_state.json`. Read the minimal identity fields55 and present a resume candidate only when `workflow` is exactly56 `tao-run-deft-pas`; never offer AOI or unidentified DEFT state as PAS.57 Do not validate large archives to EOF or inspect platforms, images, GPUs, or58 credentials yet.592. If `max_iterations` or a time budget is absent, ask one consolidated60 question for that required value and any genuinely ambiguous path/run61 choice. State the documented defaults and that a complete read-only62 preflight plus approval summary follows. Do not ask whether the user wants63 optional KPI, authentication, or parameter overrides; apply their defaults64 unless the prompt already supplies an override.6566After required intake is resolved, discover and validate:6768- workspace and either a new `${RESULTS_DIR}` or one existing run to resume;69- `images_raw.tar` and `meta.tar.gz`; `SHA256SUMS` is optional;70- `max_iterations`, or a user-supplied time budget from which an iteration71 limit can be estimated;72- metric name, query type, operator, and optional target;73- whether the deployment requires authenticated Hugging Face model access;74- selected TAO execution platform and its platform-specific prerequisites;75- any explicit epoch, GPU, mining, continual-learning, or visualization76 overrides.7778For a new run, `RESULTS_DIR` must be a child of `WORKSPACE`. `DATASET_ROOT`79must be below a workspace data directory (for example80`$WORKSPACE/data/pas_v31_tao_ft`), not directly below the workspace; neither81path may contain the other. All approved paths are absolute and non-symlink.8283Never replace an explicit value with a heuristic. Defaults apply only to84unspecified values and must be identified as defaults in the pre-flight85summary. `max_iterations` has no default. An absent metric target means an86ungated run that stops after `max_iterations`. Hugging Face token forwarding87defaults to disabled because the bundled model is public.8889The authoritative parameter contract is the nested dataclass schema in90`scripts/pas_deft/config.py`, adapted from the PAS reference notebook. Read91that schema when a request needs the meaning, default, numeric bounds, or valid92options of a DEFT parameter. Do not infer an undocumented field or bypass its93metadata constraint. Config preparation, initialization, audit, and every94host-side stage validate the materialized bundle through that same schema;95the `pas` YAML section is validated through the typed PAS configuration model.9697If required information remains missing after full discovery, ask one98consolidated follow-up. A normal invocation should need no knowledge of stage99modules, container mounts, state files, or bundled-runtime function100signatures.101102## Safety Gate103104Perform only read-only discovery before approval: resolve paths, inspect file105metadata and archives, check process-environment variable presence, inspect106local images, inspect GPUs, and audit an existing run. Credentials come only107from the launching process environment; never open or source a credential file,108and never print, grep, copy, or echo a credential value. If a required variable109is absent, tell the user which name110to export in the shell that launches the agent; never ask for its value in111chat. Do not inspect credential-file metadata when no credential is needed. If112the user explicitly asks for a file-permission check, `stat` only that named113file and warn about group/other readability.114115Show the summary defined in `references/preflight.md`, including every116parameter and source, planned file creation/extraction, image pulls, estimated117runtime, and resume status. Wait for explicit approval before registry login or118pulls, platform submit, package installation, archive extraction, config/state119creation, or any write under the workspace.120121If an approved parameter later changes, show the changed summary rows and get122approval again before continuing. No confirmation is needed between unchanged,123already-approved stages.124125## Execution Contract1261271. After approval, follow `references/preflight.md` to prepare the runtime,128 materialize the immutable run config, and initialize state once. Never129 reinitialize an existing run.1302. Before every stage, after context compaction, and before any completion131 claim, run:132133 ```bash134 "$SKILL_ROOT/scripts/deft_python.sh" --workspace "$WORKSPACE" --runtime \135 "$SKILL_ROOT/scripts/audit_deft_run.py" --results-dir "$RESULTS_DIR"136 ```137138 Continue only when the audit reports `IN_PROGRESS` and its `next_action`139 matches the intended stage. For `INVALID`, stop launching work and report140 the listed inconsistency. For nonterminal `FAILED` whose `next_action` is141 `loop_stop`, follow the pipeline reference and commit `hard_stop`; for142 terminal `FAILED`, report the failure and launch no more work. For143 `COMPLETE`, do not rerun a stage.1443. Read only the current stage reference named by `read_before_action`. Use145 `run_pas_stage.py` for bundled PAS host stages. For every TAO action, use146 `run_deft_action.py prepare`, reconcile any interrupted launch, bind the147 exact request-owned job-record before native submit, dispatch the emitted148 bundle through the selected platform's four verbs, synchronize remote149 outputs, capture native logs, then use `run_deft_action.py finalize`. Follow150 `references/platform-execution.md`; never assemble an untracked launch.1514. A command succeeds only when its exit status is zero and its documented152 output checks pass. Capture verbose output at the action-owned log path;153 inspect the final error block or at most the last 40 lines.1545. Commit each successful or terminally failed stage exactly once with155 `commit_stage.py`. It validates artifact structure, freshness, iteration156 scope, command evidence, leakage, and transition order before applying a157 recoverable, journaled update to `deft_state.json` and `loop_log.jsonl`.158 Never call159 `log_stage.py` or `record_metric_result.py` directly, and never hand-edit160 canonical state, log, metric, or history files.1616. Render the HTML report with `render_deft_report.py`. Reporting is a162 deterministic read of audited state; it does not require another agent.1637. Keep the driving turn attached through the complete bounded loop. After a164 stage reaches terminal status, finalize/commit it, re-audit, and immediately165 continue with the audit-selected next action. An in-progress update is166 commentary, not a final response and not a detach point.167168All recorded artifact paths are absolute host paths under `${RESULTS_DIR}`.169Baseline artifacts live under `zs/`, iteration N under `iter_N/`, and run-wide170splits, source embeddings, and history files at the run root.171172## Workflow173174The normal path is linear, with only two meaningful decisions:175176```text177pre-flight approval178 -> dataset_setup -> pool_embed -> baseline evaluate179 -> KPI met? yes: loop_stop180 no: baseline gap_analysis181 -> for N = 1..max_iterations:182 data_mining -> history_select -> visualize -> train -> evaluate183 -> KPI met? yes: loop_stop184 no and N < max: gap_analysis -> next iteration185 no and N = max: loop_stop186 -> final audit -> HTML report187```188189Stage ownership and exact commands are in190`references/scripts-and-agents.md`. Read the detailed reference only when its191stage is next:192193| Stage | Reference | Required result |194|---|---|---|195| dataset setup | `references/data-layout.md` | verified rebuilt dataset, transparent layout report, five split files, non-empty source-pool parquet |196| pool embedding and mining | `references/mining.md` | fresh command evidence plus non-empty, schema-checked parquet outputs |197| evaluate and train | `references/clip-train-eval.md`, `references/metric-contract.md` | successful TAO status, bound metric evidence; for train, a fresh best and normalized checkpoint |198| gap analysis | `references/gap-analysis.md` | non-empty iteration-scoped gaps parquet |199| history selection | `references/mining.md` | budgeted mined set, cumulative/history entry, zero eval leakage |200| visualization | `references/visualization.md` | enabled artifacts and command evidence, or a config-authorized skip |201202`visualize` is the only optional stage. Commit it with `--skip` only when both203visualization settings are false in the approved config. Do not turn off a204failing visualization mid-run without revising and reapproving the config.205206## Loop and Recovery Rules207208- The loop is bounded by `max_iterations`; never create an iteration outside209 that range. Once the KPI passes, the only legal next transition is210 `loop_stop`. Do not mine or train again.211- Monitoring defaults to attached (`long_running_enabled=true`, five-minute212 updates). Use terminal-condition polling: retain the selected platform's job213 id and poll its native status no more often than every 30 seconds, continuing214 through finalize, commit, audit, and the next stage.215 The bounded workflow's terminal audit status is the end condition, so this is216 not open-ended polling.217- Never send a final response while an approved run is nonterminal. A final218 response ends chat-side execution and nothing can wake it automatically.219 Finalize the turn only after the audit reports `COMPLETE`, terminal `FAILED`,220 or `INVALID`, or when the user explicitly asks to stop or detach. If the221 runtime genuinely cannot keep a turn alive, say so before launch and provide222 the exact durable resume audit command; do not claim unattended monitoring.223- Never repeat an unchanged failed command speculatively. Classify the failure,224 inspect its final log block, make one evidence-based correction permitted by225 the stage reference, then retry once. Stable command status records persist226 attempt 1/2, and the wrappers refuse a third attempt after context loss. The227 audit must pass before advancing.228- A transient registry/network interruption or GPU contention may be retried229 once after evidence shows the condition changed. A second equivalent failure230 is terminal for the run.231- Never retry checksum or rebuild verification failure, zero-row mining,232 schema/cardinality failure, missing eval-split evidence, eval leakage,233 history conflict that fails documented resume, metric-contract mismatch,234 stale/cross-iteration output, or an unsupported GPU architecture. Commit an235 error when state permits and stop with the exact recovery action.236- If a command wrote outputs but crashed before stage commit, run the audit.237 Reuse outputs only when their command status is successful, fresh, correctly238 scoped, and all stage validators pass. History selection has one supported239 recovery: rerun the deterministic adapter with `--resume`; never delete or240 edit a history entry by hand.241- Manual modification or truncation of `deft_state.json` or `loop_log.jsonl`242 invalidates the run. Preserve it for diagnosis and start a new results243 directory.244245## Metric and Stop Semantics246247The approved metric contract is immutable for the run. Evaluation must parse248the exact iteration's `nvidia_pas_metrics_aggregate.csv`; the result records249its source path and is re-derived during commit and audit. Checkpoint ranking250and best-run reporting follow the approved operator (`>=`/`>` chooses the251higher value, `<=`/`<` the lower), not a hard-coded metric convention.252253Successful completion is exactly one of:254255- `loop_stop(reason=kpi_met)` after a bound evaluation satisfies its target;256- `loop_stop(reason=max_iterations)` after the final allowed evaluation when257 the target is unmet or absent.258259`hard_stop` is a failed terminal outcome, not successful completion.260261## Completion262263At a normal loop boundary:2642651. commit `loop_stop` with the audit-selected reason;2662. render `${RESULTS_DIR}/DEFT_Loop_Report.html` with trigger `loop-end`;2673. require this command to exit zero:268269 ```bash270 "$SKILL_ROOT/scripts/deft_python.sh" --workspace "$WORKSPACE" --runtime \271 "$SKILL_ROOT/scripts/audit_deft_run.py" \272 --results-dir "$RESULTS_DIR" --require-complete273 ```274275Report the stop reason, baseline and best metric, best iteration/checkpoint,276completed iteration count, report path, and any warnings. A checkpoint, CSV,277HTML file, or assistant statement alone is not completion evidence.278279## Progressive References280281| Need | Read |282|---|---|283| read-only checks, approval summary, initialization | `references/preflight.md` |284| stage commands and script interfaces | `references/scripts-and-agents.md` |285| platform staging, four verbs, job records, finalization | `references/platform-execution.md` |286| state transitions and resume behavior | `references/pipeline-and-state.md` |287| dataset/archive contract | `references/data-layout.md` |288| KPI parsing and evidence | `references/metric-contract.md` |289| gap generation | `references/gap-analysis.md` |290| embeddings, k-NN, selection | `references/mining.md` |291| contact sheets and t-SNE | `references/visualization.md` |292| train/evaluate/checkpoints | `references/clip-train-eval.md` |