Generate an immutable, provenance-first estimate snapshot for a bounded scope of deliverables and/or packages, writing quarantined artifacts under the estimating tool root. Use for automated estimate runs driven by a validated BASIS_OF_ESTIMATE enum and local pricing sources.
Produce an immutable estimate snapshot under the estimating tool root for a bounded scope of deliverables and/or packages. Each run writes a NEW, timestamped snapshot folder with provenance-first line items, a WBS×CBS rollup matrix, QA reporting, and run context logs.
The skill does not author a narrative Basis of Estimate. Instead, it requires a validated BASIS_OF_ESTIMATE enum as an explicit input and uses that value to drive default behaviors, method tagging, and QA consistency checks.
TASK in generic shell mode (no profile)ScopePath — {EXECUTION_ROOT}TaskSkill — estimate-snapshotAllowedWriteTargets — ["{EXECUTION_ROOT}/_Estimates/"] (tool-root-only)RuntimeOverrides.SCOPE — deliverable IDs and/or package IDs to estimate (or path glob)RuntimeOverrides.BASIS_OF_ESTIMATE — one of: QUOTE | RATE_TABLE | HISTORICAL | PARAMETRIC | ALLOWANCERuntimeOverrides.CURRENCY — ISO-like code (e.g., USD, CAD) or project-defined currency tokenRuntimeOverrides.ESTIMATES_ROOT — {EXECUTION_ROOT}/_Estimates/ (must already exist)RuntimeOverrides.DECOMPOSITION_PATH — absolute path to the latest decomposition markdown. If absent, attempt to locate most recent under {EXECUTION_ROOT}/_Decomposition/. If still missing, log [WARNING] MISSING_DECOMPOSITION and proceed with degraded ID/path validation.RuntimeOverrides.DEPENDENCY_SOURCES — AUTO (default) or explicit paths to dependency registers/snapshotsRuntimeOverrides.PRICE_SOURCES — list of local files/folders containing basis evidence (quotes, rate tables, historical datasets, parametric models, allowance tables)RuntimeOverrides.OUTPUT_LABEL — short label for snapshot naming (default: AUTO)RuntimeOverrides.UPDATE_LATEST_POINTER — FALSE (default) | TRUERuntimeOverrides.FALLBACK_POLICY — STRICT (default) | ALLOW_ALLOWANCE | ALLOW_PARAMETRICRuntimeOverrides.ALLOW_MIXED_METHODS — FALSE (default) | TRUERuntimeOverrides.ROUNDING — NONE (default) | CENT | DOLLAR | project-definedRuntimeOverrides.RUN_TIMESTAMP — optional ISO timestamp; else generated at runtime| Key | Meaning | Default | Allowed values |
|---|---|---|---|
SCOPE | Deliverable IDs, package IDs, or path glob | Required | Non-empty |
BASIS_OF_ESTIMATE | Validated estimate basis enum | Required | QUOTE, RATE_TABLE, HISTORICAL, PARAMETRIC, ALLOWANCE |
CURRENCY | Currency code | Required | ISO code or project-defined token |
ESTIMATES_ROOT | Tool root path | Required | Must already exist |
DECOMPOSITION_PATH | Decomposition markdown path | auto-locate | Valid file path |
DEPENDENCY_SOURCES | Dependency evidence sources | AUTO | AUTO or explicit paths |
PRICE_SOURCES | Basis evidence sources | None | List of local paths |
OUTPUT_LABEL | Snapshot naming label | AUTO | Short identifier |
UPDATE_LATEST_POINTER | Update _LATEST.md pointer | FALSE | TRUE or FALSE |
FALLBACK_POLICY | Method fallback policy | STRICT | STRICT, ALLOW_ALLOWANCE, ALLOW_PARAMETRIC |
ALLOW_MIXED_METHODS | Permit mixed Method values in Detail.csv | FALSE | TRUE or FALSE |
ROUNDING | Amount rounding | NONE | NONE, CENT, DOLLAR, project-defined |
Reads are limited to:
DECOMPOSITION_PATH (when provided or auto-located){deliverable}/Dependencies.csv for each in-scope deliverable (when DEPENDENCY_SOURCES=AUTO)DEPENDENCY_SOURCESPRICE_SOURCES (quotes, rate tables, historical datasets, parametric models, allowance tables)The skill must NOT fetch from the internet. Only local inputs.
Writes are limited to the snapshot folder under {ESTIMATES_ROOT}:
{ESTIMATES_ROOT}/EST_{OUTPUT_LABEL}_{YYYY-MM-DD}_{HHMM}/ (new folder each run){ESTIMATES_ROOT}/_LATEST.md pointer (only when UPDATE_LATEST_POINTER=TRUE)No writes outside ESTIMATES_ROOT. No modification of project truth (deliverable content, lifecycle files, decomposition outputs, dependency registers).
tools/validation/validate_enum.py — validate BASIS_OF_ESTIMATE at Step 0 (halt with FAILED_INPUTS if invalid)tools/scaffolding/create_snapshot_folder.sh — create the immutable snapshot folder with canonical namingtools/scaffolding/update_latest_pointer.sh — update _LATEST.md pointer only when UPDATE_LATEST_POINTER=TRUE{ESTIMATES_ROOT}PRICE_SOURCES)_Estimates/ as pricing sources unless explicitly included in PRICE_SOURCES{ESTIMATES_ROOT} (or {EXECUTION_ROOT}/_Estimates/).python3 tools/validation/validate_enum.py BASIS_OF_ESTIMATE {BASIS_OF_ESTIMATE}. If invalid or missing, halt with RUN_STATUS=FAILED_INPUTS.bash tools/scaffolding/create_snapshot_folder.sh {ESTIMATES_ROOT} EST {OUTPUT_LABEL}.UPDATE_LATEST_POINTER=TRUE, run bash tools/scaffolding/update_latest_pointer.sh {ESTIMATES_ROOT} {snapshot_folder_name}. If FALSE, do not modify pointer files.DECOMPOSITION_PATH if provided or auto-locate under {EXECUTION_ROOT}/_Decomposition/.CBSHint, EstimateMethodHint, StageHint, ContextEnvelope) if present. Do not invent hints.[WARNING] MISSING_DECOMPOSITION in QA and Run_Context.md and proceed best-effort.SCOPESCOPE into a concrete deliverable list.Scope_Resolved.csv (or a Run_Context.md section) listing DeliverableID, PackageID (if known), Path (if known), InScope=TRUE|FALSE, and notes.DEPENDENCY_SOURCES=AUTO, read each in-scope deliverable's Dependencies.csv if present.EstimateImpactClass is present, use it as a hint only.Blockers.md (or blocker_report.csv) listing unresolved inputs by deliverable with evidence references.PRICE_SOURCES into Source_Index.md with source path, source type (quote, rate table, historical, parametric, allowance), parsing notes, and what it can/cannot support.PRICE_SOURCES is empty or unusable, do not guess prices — produce TBD amounts with FAILED_INPUTS or WARNINGS per SPEC._Estimates/ snapshots as pricing sources unless explicitly listed in PRICE_SOURCES.For each in-scope deliverable:
Detail.csv unless blocked).WBS_PackageID and WBS_DeliverableID from decomposition when available; otherwise best-effort from scope resolution. Assign CBS from explicit CBSHint, else a deterministic rule documented in Run_Context.md, else TBD.BASIS_OF_ESTIMATE using only PRICE_SOURCES evidence:
QUOTE → Method=QUOTERATE_TABLE → Method=RATE_TABLEHISTORICAL → Method=HISTORICALPARAMETRIC → Method=PARAMETRICALLOWANCE → Method=ALLOWANCEALLOW_MIXED_METHODS and FALLBACK_POLICY. If fallback is not allowed and basis evidence is missing, set Amount=TBD and log a QA warning.SourceRef points to a file + section/row ID, OR to an entry in Decision_Log.md / Assumptions_Log.md.location TBD and flag in QA.Qty=1, Unit=LS, UnitRate=Amount.WBS_CBS_Matrix.csv with totals by WBS_PackageID, WBS_DeliverableID, CBS, Currency.Summary.md with: basis + run config (BasisOfEstimate_Used block), totals by package/deliverable/CBS, and key warnings + blockers.QA_Report.md including:
SourceRef)BASIS_OF_ESTIMATE)RUN_STATUS: OK | WARNINGS | FAILED_INPUTSDecision_Log.md — defaults applied, fallback uses, scope-resolution decisionsAssumptions_Log.md — explicit assumptions with IDsRisk_Register.md — optional, only if risks are explicit or implied by missing inputsChange_Log.md — what changed vs a referenced prior snapshotRun_Context.md (brief inputs + resolved defaults + chosen paths)Summary.mdQA_Report.mdSource_Index.mdDecision_Log.mdAssumptions_Log.mdWBS_CBS_Matrix.csvDetail.csv (recommended; required for full runs where pricing sources support meaningful totals)Scope_Resolved.csv (when scope expansion is non-trivial)blocker_report.csv or Blockers.md (when dependencies are used)Risk_Register.mdChange_Log.mdRun_Brief.md (verbatim brief text if provided by invoker; recommended for audit)BOE.md is NOT required by default. If the invoker explicitly requests a narrative BOE, the skill MAY emit BOE.md, but it must be derived from run inputs and sources only (no invention).
Detail.csv schema (when emitted)Mandatory columns: LineID, CBS, WBS_PackageID, WBS_DeliverableID, Description, Qty, Unit, UnitRate, Amount, Currency, Method, SourceRef, Confidence, Notes.
Method ∈ {QUOTE, RATE_TABLE, HISTORICAL, ALLOWANCE, PARAMETRIC}Confidence ∈ {LOW, MEDIUM, HIGH} (see QA_CHECKS for confidence rules)Qty=1, Unit=LS, UnitRate=AmountWBS_CBS_Matrix.csv (minimum columns)WBS_PackageID, WBS_DeliverableID, CBS, Currency, Amount_Total, LineCount, ProvenanceCompletenessPct (optional), Notes (optional)
Run_Context.md (minimum fields)RunID, AsOf, Scope, ScopeResolvedSummary, BASIS_OF_ESTIMATE, CURRENCY, PRICE_SOURCES, DECOMPOSITION_PATH, DEPENDENCY_SOURCES, FALLBACK_POLICY, ALLOW_MIXED_METHODS, UPDATE_LATEST_POINTER, Rounding, Warnings
QUOTE, RATE_TABLE, HISTORICAL, PARAMETRIC, ALLOWANCE. Any other value is FAILED_INPUTS (fail-fast at Step 0).{ESTIMATES_ROOT}. Never overwrite an existing snapshot folder.{ESTIMATES_ROOT}. Never modify deliverable content, _STATUS.md or other lifecycle files, decomposition outputs, or dependency registers.Detail.csv MUST carry a SourceRef (file + section/row ID, or an entry in Decision_Log.md/Assumptions_Log.md) OR explicitly location TBD with a QA warning. Every row also carries Method and Confidence.TBD and surface it in QA. Do not guess.HIGH. Parametric values are MEDIUM or LOW. Never assign HIGH to values derived from a parametric model or allowance table.PRICE_SOURCES._Estimates/ snapshots as pricing sources unless explicitly listed in PRICE_SOURCES.BASIS_OF_ESTIMATE was validated by validate_enum.py before any writes occurred.Run_Context.md, Summary.md, QA_Report.md, Source_Index.md.Detail.csv exists: schema is intact, Method values valid, allowance/parametric convention respected.SourceRef or location TBD. Provenance completeness percentage is reported in QA.BASIS_OF_ESTIMATE unless ALLOW_MIXED_METHODS=TRUE or a FALLBACK_POLICY deviation is explicitly logged.QA_Report.md declares a RUN_STATUS: OK | WARNINGS | FAILED_INPUTS.{ESTIMATES_ROOT} were modified.