name: gjames-quote-manifest description: Use when creating, updating, validating, or explaining G.James V6 JSON quote manifests for QUOTE_MANIFEST_RUNNER_V2.bas from ATTRIBUTE_DETAILS.csv / ATTRIBUTE_SUMMARY.csv exports. Covers frame classification, stile selector cases, equal/unequal glass cases, Main_Glass quote option setup for QUOTE_IGU versus FIL resources, query_sets, and runner-compatible JSON schema. AI-model agnostic: use the bundled script and references regardless of assistant platform.
G.James V6 Quote Manifest Builder
Use this skill to build JSON manifests consumed by QUOTE_MANIFEST_RUNNER_V2.bas.
Core Rule: only act on attributes that are in the export
Only set or vary attributes that actually exist in ATTRIBUTE_DETAILS.csv for the frames being built. Do not inject attributes from the skill's own defaults without confirming they are present.
Equal_GlassandRail_Length_Slider(the unequal-glass case) andMain_Glass(the IGU/FIL baseline step) are glass/dimension-workflow defaults of this script, not universal. If the export does not expose them, do not add them silently.- The builder now guards the unequal-glass case: by default (
--unequal-glass-case auto) it is emitted only for frames whose export actually contains the equal-glass attribute. Frames missing it are reported inframes_without_equal_glass_attrand get no glass case. Main_Glasssetup is still added unless you pass--no-glass-setup. For non-glass tasks, pass--no-glass-setup.
- The builder now guards the unequal-glass case: by default (
- Never describe coverage as "all frames" / "every frame" without counting the distinct
frame_codes that carry the attribute. Check the frame count, not just the set of distinct values — an attribute present on 1 of 10 frames is not universal. - When in doubt about whether a glass/default belongs, tell the user it is a skill default and confirm before including it.
Core Workflow
- Locate the current attribute export folder.
- Prefer
ATTRIBUTE_DETAILS.csvas the source of frame-level attributes and declared selections. - Use
ATTRIBUTE_SUMMARY.csvonly for cross-checking family counts or odd missing attributes.
- Prefer
- Read
references/quote_manifest_runner_v2_contract.mdbefore changing manifest structure. - Run
scripts/build_quote_manifest.pyfrom the target project folder or pass absolute paths. - Review the script output:
- source frame count
- manifest frame count
- classification counts
- case count
- IGU/single-glazed glass setup counts
- frames without stile selectors
- Validate the generated JSON by loading it with Python and checking representative frames.
- Do not edit
QUOTE_MANIFEST_RUNNER_V2.basunless the user explicitly asks to change runner behavior.
Default Classification Rules
- Corner stile frames: frame codes ending
_90,_090, or_270; useCorner_Stile. - Meeting stile frames: base frame code contains
OXXO,O4XO, orOXXXXO; useMeeting_Stiles, falling back toOXXO_Adaptorsfor 246 residential/IGU where that is the exposed equivalent. - One-direction frames: all remaining frames; use
Lock_Stilewhen present. - Frames without the expected stile selector are still included. They get baseline equal-glass capture and an unequal-glass rail-length capture, but no stile-value cases.
Glass Setup Rules
Glass setup is a workflow default, not a universal requirement — see the Core Rule above. Apply it only when the task is about glass/dimensions and the export supports it.
When glass setup applies, every generated frame should include a frame-level baseline_steps quote option for Main_Glass.
- IGU / double-glazed frames use
[QUOTE_IGU:GJAMES:IGU_00_F1]. - Single-glazed frames use
[FIL:GJAMES:CLL064-FACT]. - The distinction matters: IGU resources are quote IGUs; non-IGU glass is generally a FIL resource.
- The default script treats
Sash_Type = GorGlazing_TypecontainingDoubleas IGU. Everything else falls back to single glazed unless overridden.
Save-Risk / Preflight Attributes
Before generating a manifest, check for attributes that can cause save/pricing failures if left at a prompt/default value. Do not assume these rules are universal; confirm with the user or project evidence.
Known example:
Subframe_Drainage_Requiredsometimes needs to be set toYto avoid quote save issues.- Some series do not have this attribute.
- Some 247 frames expose a formula-only subframe row whose formula/current value is already like
"Yes, Subframe Drainage Required"; leave those unchanged.
Workflow:
- Inspect the export for prompt/default list attributes that may block save.
- Report candidate setup attributes and formula-only rows separately.
- Ask the user whether to force any candidate values before adding setup steps.
- Prefer a runner/macro path that refreshes BOM without requiring quote save if one is proven; until then, treat save-risk setup as project-specific.
Script
Use the bundled builder:
python .\scripts\build_quote_manifest.py `
--attribute-export "C:\path\to\ATTRIBUTE_SELECTION_EXPORT_YYYYMMDD_HHMMSS" `
--output "C:\path\to\quote-manifest.json" `
--series-code "246_247_QUOTE_MANIFEST" `
--output-prefix "246_247_QUOTE_MANIFEST_SIZE_TEST"
Important options:
--rail-length-slider 35.4: stored in manifest as the rail-900 unequal setup value.--query-set bom_ext --query-set glass: default capture set for extrusion BOM and glass sizes.--lock-attr,--meeting-attr,--corner-attr: add or replace selector attribute aliases when a product family exposes different names.--meeting-pattern: add frame-code patterns that should use meeting-stile logic.--no-glass-setup: do not add theMain_Glassbaseline step. Use for non-glass tasks, or when the quote's existing main glass must not be touched.--unequal-glass-case auto|always|never: controls theEqual_Glass=False/ rail-length case.auto(default) emits it only for frames whose export contains the equal-glass attribute;alwaysis the legacy force-on-every-frame behaviour;neversuppresses it.--equal-glass-attr/--rail-attr: rename the attributes the unequal-glass case toggles (defaultsEqual_Glass/Rail_Length_Slider).--vary-attr NAME: emit one frame_attribute case per declared real value (List, placeholder "Please Select" values skipped) or perTrue/False(Flag). Repeatable. Only frames that actually expose the attribute get cases.--set-attr NAME=VALUE: force a value intobaseline_stepsas a frame_attribute setup (e.g. fix a placeholder list value such asFrame_Drainage_Type=A). Repeatable.--force-subframe-required: project-specific opt-in; emitsSubframe_Drainage_Required = Y/Truebaseline setup for settable list rows. Without this flag, the script only reports candidates.
When to Patch the Script
Prefer command-line options first. Patch the script only when the project introduces a new recurring rule that should be preserved for later runs, for example:
- A new product family exposes a different equivalent of
Meeting_Stiles. - IGU detection needs a family-specific override beyond
Sash_Type/Glazing_Type. - The runner macro adds new supported
query_setsortargettypes.
Keep project-specific constants out of the skill when they are only one-off values. Put them in the command invocation or a project-local wrapper instead.
Validation Checklist
- The JSON root has
series_code,output_prefix,requires_empty_quote,run_mode,batch_size,query_sets, andframes. - Every frame has
frame_code,classification_code,classification,baseline_case_id,baseline_steps, andcases. - Every
baseline_stepsglass entry usestarget: quote_option,attr_name: Main_Glass, and a full V6 resource ref. - Save-risk attributes such as settable subframe-required prompts are reported; only force them when the user has confirmed that setup for the current series.
- Query keys are supported by
QUOTE_MANIFEST_RUNNER_V2.bas:labour,item_costs,glass,bom_ext_cost,bom_ext. - Frames without stile selectors are not omitted.
Equal_Glass=FalseandRail_Length_Slider=<value>appear together in the unequal setup case.- The manifest is valid JSON and can be loaded by Python before running it in V6.