# RMC and Crusher ERP — Phase 1
# Figma AI Execution Prompt Pack v1.1

Companion to `RMC_Crusher_ERP_Phase1_Figma_Production_Blueprint_v1.1.docx`.
Date: 7 September 2026.

33 deterministic prompts, P00 to P32. Run them in order. Verify each completion checklist before continuing. Prompt IDs match the **Prompt ID** column of `RMC_Crusher_ERP_Phase1_Figma_Frame_Component_Manifest_v1.1.csv`, so you can filter the CSV by prompt to verify a module.

---

## Execution plan

| Stage | Prompts | Checkpoint |
|---|---|---|
| 1 Foundations | P00 | 24 pages exist. All variable collections resolve. 19 text styles, 3 grid styles, 4 effect styles. |
| 2 Verify variables | — | Contrast Proof Sheet matches Blueprint Section 5.4. No hard-coded hex anywhere. |
| 3 Icons and assets | P01 | One icon library. Every semantic icon exists at 16, 20 and 24. |
| 4 Components | P02–P06 | 78 components with the exact names in Blueprint Section 10. Every interactive component has a focus state. |
| 5 Verify components | — | Names and variants match Section 10.1. Permission-hidden is a Boolean, not a variant. Library published. |
| 6 Templates | P07 | 8 templates with all states. T07 has no edit action. T08 has no edit or delete. |
| 7 Lock foundations | — | Lock pages 01 to 04 so module prompts cannot modify them. |
| 8 Modules | P08–P25 | After each: frames match the CSV rows for that Prompt ID. |
| 9 Verify frames | — | Filter CSV by Prompt ID. Every row has a frame, every frame a row. Update QA Status. |
| 10 Responsive | P26, P27 | Every screen has a mobile frame. Exactly 3 tablet frames. No shrunken tables. |
| 11 Prototypes | P28 | 24 flows wired. Every destination exists. Every flow has a back path. |
| 12 Content audit | P29 | Every string matches Blueprint Section 19. Placeholders in placeholder form. |
| 13 Accessibility audit | P30 | The 15 frames in Section 20.3 pass Section 20.2. |
| 14 Visual consistency | P31 | No detached instances, no hard-coded values, no orphan styles. |
| 15 Final coverage | P32 | 62 screens, 606 frames, zero duplicates, zero broken links. |

---

## Rules that apply to every prompt

```
RULES THAT ARE NEVER BROKEN (business rules, not preferences):
- Approve Challan and Approve Invoice are two separate controls. Never merged. The string "Save and Approve Both" must not appear.
- IRN recording is manual. No live integration, no connection status, no queue, no automatic retry.
- No Delete action anywhere. Records are deactivated, cancelled or reversed.
- No edit or delete control on any audit row, under any permission.
- Expired material is a wastage reason only, never available stock.
- No inventory valuation column on any report.
- Every Status Badge carries a text label. Never colour alone.
- Mobile lists become record cards. Never a shrunken table.
- A control the role cannot use is ABSENT. A control the status blocks is PRESENT, DISABLED, with a reason.
- Round-off is always its own line in the Calculation Summary, including when zero.
```

---

## P00 — Foundations

*Blueprint reference: Blueprint Sections 4, 5, 6, 7*
*Figma page: `01 — Variables & Foundations`*

```
OBJECTIVE
Create the file structure, all design variables, text styles, grids and effects. Nothing else until this is complete and verified.

EXISTING WORK TO REUSE
Nothing exists yet. Import RMC_Crusher_ERP_Phase1_Figma_Design_Tokens_v1.1.json using a variables import plugin if available; otherwise create the variables manually from the values below.

FIGMA PAGE
01 — Variables & Foundations

FRAMES TO CREATE
Create these 24 pages in this exact order:
00 — Cover & Read Me
01 — Variables & Foundations
02 — Icons & Assets
03 — Components
04 — Page Templates
05 — Dashboard
06 — Company & Plant
07 — Clients & Vendors
08 — Products, Units & Recipes
09 — Vehicles
10 — Rates & Charges
11 — Material Inward
12 — Rejection & Disposition
13 — Wastage
14 — Challans
15 — Invoices
16 — Credit Notes & IRN
17 — Reports
18 — Users, Roles & Audit
19 — Responsive Reference
20 — Prototype Flows
21 — Content & Error Catalogue
22 — QA Coverage
99 — Archive

On page "00 — Cover & Read Me", create 6 frames in order:
Cover · Version and Approval · Annotation Legend · Page Index · Execution Order · Glossary

On page "01 — Variables & Foundations", create 10 frames in order:
Primitive Colour · Semantic Colour · Status Tokens · Typography Scale · Spacing Scale ·
Sizing Scale · Grid Definitions · Elevation and Radius · Motion and Z-index · Contrast Proof Sheet

COMPONENTS TO INSTANTIATE
COLOUR COLLECTION "Colour", single mode "Light".

Primitive ramps:
  slate  25 #FAFBFC  50 #F5F6F8  100 #EDEFF2  200 #D8DCE2  300 #AAB2BD
         400 #9AA3AF 500 #7A8494 600 #5A6472  700 #3D4552  800 #252B34  900 #12161C
  blue   50 #E8EFF9  100 #C7D8EF 400 #2E67B8  500 #1B4F9C  600 #16407F  700 #102F60
  teal   50 #E4F1F1  100 #BFDEDF 500 #0F6F72  600 #0B5A5C
  green  50 #E6F2EA  100 #C2DFCD 500 #1C6B3C  600 #155430
  amber  50 #FBF0DC  100 #F4DDB0 500 #8A5A00  600 #6E4800
  red    50 #FAE8E8  100 #F0C4C4 500 #A32020  600 #851A1A
  white #FFFFFF   black #000000

Semantic aliases (bind to the primitive, never duplicate the hex):
  background -> slate.50          surface -> white
  surface-raised -> white         surface-sunken -> slate.100
  border -> slate.200             border-strong -> slate.300
  text-primary -> slate.900       text-secondary -> slate.600
  text-disabled -> slate.400      text-inverse -> white
  primary -> blue.500             primary-hover -> blue.600
  primary-pressed -> blue.700     primary-subtle -> blue.50
  accent -> teal.500              accent-subtle -> teal.50
  success -> green.500            success-subtle -> green.50
  warning -> amber.500            warning-subtle -> amber.50
  error -> red.500                error-subtle -> red.50
  information -> blue.500         information-subtle -> blue.50
  focus-ring -> blue.500          overlay -> rgba(18,22,28,0.45)

Status tokens (26) - each has fill, text and icon:
  draft, pending-approval, returned-correction, approved, pending-irn, irn-failed,
  irn-generated, cancelled, active, inactive, available, allocated, partially-allocated,
  reassigned, returned, wastage, expired, reversed, unbilled, billed, reserved, consumed,
  released, pending-disposition, partially-disposed, fully-disposed

SPACING COLLECTION "Spacing":
  space/50 4 · space/100 8 · space/150 12 · space/200 16 · space/250 20
  space/300 24 · space/400 32 · space/500 40 · space/600 48 · space/800 64

SIZE COLLECTION "Size":
  input/desktop 40 · input/touch 48 · row/compact 44 · row/standard 52
  button/desktop 40 · button/touch 44 · touchtarget/min 44
  header/desktop 64 · header/touch 56 · sidebar/expanded 248 · sidebar/collapsed 72
  dialog/small 400 · dialog/medium 560 · dialog/large 760 · drawer/desktop 480
  radius/sm 6 · radius/md 8 · formcolumn/max 560 · section/gap 24

TEXT STYLES - font Inter, absolute line heights. Code/Reference uses IBM Plex Mono.
  Display              28/36 600 -0.2 sentence
  Page Title           20/28 600 -0.2 sentence
  Section Title        16/24 600  0   sentence
  Subsection           14/20 600  0   sentence
  Card Title           14/20 600  0   sentence
  Body                 14/20 400  0   sentence
  Body Emphasis        14/20 500  0   sentence
  Body Small           13/18 400  0   sentence
  Label                13/16 500  0   sentence
  Helper               12/16 400  0   sentence
  Error                12/16 500  0   sentence
  Button               14/20 500  0   sentence
  Table Header         12/16 600  0.4 sentence
  Table Cell           13/18 400  0   sentence
  Numeric Table Cell   13/18 400  0   TABULAR FIGURES ON
  KPI Value            24/32 600 -0.2 TABULAR FIGURES ON
  Status               12/16 500  0   sentence
  Caption              11/14 400  0   sentence
  Code/Reference       13/18 400  0   IBM Plex Mono, TABULAR FIGURES ON

GRID STYLES:
  Grid/Desktop/12col  12 columns, 24 gutter, 24 margin
  Grid/Tablet/8col     8 columns, 20 gutter, 20 margin
  Grid/Mobile/4col     4 columns, 16 gutter, 16 margin

EFFECT STYLES:
  elevation/0 none
  elevation/1 0 1 2 rgba(18,22,28,0.08)
  elevation/2 0 4 12 rgba(18,22,28,0.12)
  elevation/3 0 12 32 rgba(18,22,28,0.18)


AUTO LAYOUT
Frame naming convention for the whole file, applied from now on:
  {Device}-{ScreenID}-{Mode}-{State}
  Device: D desktop 1440x1024 | T tablet 1024x768 | M mobile 390x844
  Mode:   List | Create | Edit | View | Review | Approve | Report | Configure
  State:  Default | Loading | Empty | Error | Draft | PendingApproval | Approved |
          ReturnedForCorrection | PendingIRN | IRNFailed | IRNGenerated | Cancelled |
          Reversed | PermissionRestricted | ConcurrentUpdate | Filtered | NoResults
  Example: D-CHL-SCR-002-Create-Draft

Use Auto Layout on every frame. Bind every gap and padding to a Spacing variable.

STATES
The Contrast Proof Sheet frame must show each pairing with its measured ratio, matching Blueprint Section 5.4.

INTERACTIONS
None in this prompt.

RESPONSIVE
Define the three grid styles. Do not build breakpoint frames yet.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Nothing exists yet, so nothing is frozen. After this prompt, page 01 is frozen.

COMPLETION CHECKLIST
1. All 24 pages exist, correctly named, in order.
2. 43 primitive colour values plus 23 semantic aliases plus 26 status tokens resolve.
3. 10 spacing and 19 size variables exist.
4. 19 text styles exist. Numeric Table Cell, KPI Value and Code/Reference have tabular figures ON.
5. 3 grid styles and 4 effect styles exist.
6. 16 frames exist across pages 00 and 01.
7. The Contrast Proof Sheet reports every ratio in Blueprint Section 5.4.
8. No hard-coded hex or spacing value anywhere in the file.

STOP CONDITION
Stop after the Contrast Proof Sheet frame. Do not create icons, components or templates.
```

## P01 — Icons and assets

*Blueprint reference: Blueprint Section 5, iconography*
*Figma page: `02 — Icons & Assets`*

```
OBJECTIVE
Create one icon set and the semantic icon map. Every icon used anywhere in the product comes from here.

EXISTING WORK TO REUSE
Variables and text styles from P00.

FIGMA PAGE
02 — Icons & Assets

FRAMES TO CREATE
5 frames in order:
Icon Grid 16 · Icon Grid 20 · Icon Grid 24 · Semantic Icon Map · Logo and Mark Placeholders

COMPONENTS TO INSTANTIATE
ICON LIBRARY: Lucide. One set only. Stroke 1.5 at 16 and 20, stroke 2 at 24.
Icons inherit their parent text colour. Never independently coloured except inside a Status Badge.

SEMANTIC ICON MAP - status icons:
  draft pencil · pending-approval clock · returned-correction arrow-u-left
  approved check · pending-irn clock-alert · irn-failed alert-triangle
  irn-generated shield-check · cancelled slash · active check-circle
  inactive minus-circle · available box · allocated link
  partially-allocated link-2 · reassigned shuffle · returned arrow-left
  wastage trash · expired calendar-x · reversed undo · unbilled receipt
  billed receipt-check · reserved bookmark · consumed check
  released unlock · pending-disposition clock · partially-disposed pie-chart
  fully-disposed check-circle

SEMANTIC ICON MAP - action and navigation icons:
  add plus · edit pencil · deactivate ban · reverse undo · export download
  filter sliders · columns columns · search search · close x · more ellipsis
  chevron-down · chevron-right · calendar · clock · info · alert-circle
  alert-triangle · check-circle · x-circle · lock · unlock · upload · eye · trash
  dashboard layout-grid · masters database · material package · challan truck
  invoice file-text · report bar-chart · admin settings · audit history


AUTO LAYOUT
Icon grids: horizontal wrap, gap 24, padding 24. Each icon labelled beneath with its name in Caption style.

STATES
Icons have no states. They inherit colour from their parent.

INTERACTIONS
None.

RESPONSIVE
Icons do not scale responsively. 16 inside inputs, badges and cells; 20 in buttons and nav; 24 in KPI cards and empty states.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Page 01 and all its variables and styles.

COMPLETION CHECKLIST
1. One icon library only. No mixed sets.
2. Every icon in the semantic map exists at 16, 20 and 24.
3. Stroke widths are 1.5 at 16 and 20, and 2 at 24.
4. No icon carries a hard-coded colour.
5. Every status in the 26-token list has a mapped icon.

STOP CONDITION
Stop after the Logo and Mark Placeholders frame. Do not build components.
```

## P02 — Navigation components

*Blueprint reference: Blueprint Section 10, components C-NAV-01 to C-NAV-11*
*Figma page: `03 — Components`*

```
OBJECTIVE
Create 11 components as published component sets on page "03 — Components". Every interactive component needs Default, Hover, Focus, Active, Disabled variants at minimum, plus the variants listed per component.

EXISTING WORK TO REUSE
All variables, text styles and icons from P00 and P01. Components created in earlier component prompts.

FIGMA PAGE
03 — Components

FRAMES TO CREATE
No screen frames. Create 11 COMPONENT SETS, arranged in a vertical stack with 200px between them, in the order listed below.

COMPONENTS TO INSTANTIATE
C-NAV-01 App Shell
    Figma name: Navigation/App-Shell/{Desktop|Tablet|Mobile}
    Purpose: The outer frame every product screen sits inside.
    Anatomy: Sidebar · Top Header · Context Strip (touch only) · Breadcrumb slot · Content slot · Sticky Action Bar slot.
    Properties: Boolean: Show breadcrumb, Show sticky bar, Show context strip. Instance swap: Content.
    Variants: Breakpoint = Desktop | Tablet | Mobile. Nav = Expanded | Collapsed (desktop only).
    States: Scrolled — header and sticky bar gain elevation/1 once content moves beneath them.
    Dimensions: 1440×1024 · 1024×768 · 390×844
    Auto Layout: Horizontal at desktop (sidebar beside main). Vertical at touch (drawer overlays).
    Keyboard: Skip to main content is the first focusable element.
    Accessible name: Landmarks: banner, navigation, main, contentinfo. Sticky bar is complementary, placed after main.
    PROHIBITED: Never nest one App Shell inside another. Never place content outside the content slot.

C-NAV-02 Sidebar
    Figma name: Navigation/Sidebar/{Expanded|Collapsed|Drawer}
    Purpose: Primary module navigation, filtered to what the active role may see.
    Anatomy: Product mark · Sidebar Group (repeated) · Sidebar Item (repeated) · collapse toggle at the foot.
    Properties: Boolean: Show collapse toggle. Text: Active item key.
    Variants: State = Expanded | Collapsed | Drawer
    States: A group with no visible children is not rendered at all.
    Dimensions: 248 · 72 · 280 drawer
    Auto Layout: Vertical, top-stretch, padding 0 0 16 0, gap 4. Scrolls internally if the menu overflows.
    Keyboard: Tab through items. Groups are disclosure buttons responding to Enter and Space.
    Accessible name: nav landmark with an accessible name. Active item marked as current page.
    PROHIBITED: Never show a disabled menu item for a denied module. The item is absent.

C-NAV-03 Sidebar Item
    Figma name: Navigation/Sidebar-Item/{Default|Hover|Active|Focus|Collapsed}
    Purpose: One navigable destination.
    Anatomy: Icon 20 · Label (Body) · optional count badge · 3px active bar.
    Properties: Text: Label. Boolean: Show badge. Instance swap: Icon.
    Variants: State = Default | Hover | Active | Focus. Mode = Expanded | Collapsed.
    States: Active uses primary-subtle fill with a 3px primary left bar and primary text — never fill alone.
    Dimensions: 40 expanded, 48 square collapsed, 48 on touch
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 8.
    Keyboard: Enter navigates. Collapsed mode shows the label as a tooltip after 400ms.
    Accessible name: The label. Collapsed mode still requires an explicit name because the label is visually hidden.
    PROHIBITED: Never disabled. A denied item is absent.

C-NAV-04 Sidebar Group
    Figma name: Navigation/Sidebar-Group/{Expanded|Collapsed}
    Purpose: Groups related items: Masters, Material, Transactions, Reports, Administration.
    Anatomy: Group label (Table Header style) · chevron · child items.
    Properties: Text: Group label. Boolean: Expanded.
    Variants: State = Expanded | Collapsed
    States: An empty group is not rendered.
    Dimensions: 32 header, gap 4 to children
    Auto Layout: Vertical, hug height.
    Keyboard: Enter and Space toggle.
    Accessible name: Disclosure button reporting expanded state and controlling the child list.
    PROHIBITED: Never render a group header with no children beneath it.

C-NAV-05 Top Header
    Figma name: Navigation/Top-Header/{Desktop|Touch}
    Purpose: Holds global context: Company, Plant, Active Role, user menu.
    Anatomy: Hamburger (touch) · page title slot · spacer · Company Selector · Plant Selector · Active Role Selector · User Menu.
    Properties: Boolean: Show hamburger, Show search. Text: Page title.
    Variants: Breakpoint = Desktop | Touch
    States: Elevated once content scrolls beneath it.
    Dimensions: 64 desktop, 56 touch
    Auto Layout: Horizontal, centre-space-between, padding 0 24, gap 16.
    Keyboard: Tab order: hamburger, title, selectors, user menu.
    Accessible name: banner landmark. Selectors are comboboxes naming their dimension.
    PROHIBITED: Never place a screen-specific action here. Actions belong to the title block or sticky bar.

C-NAV-06 Breadcrumb
    Figma name: Navigation/Breadcrumb/Default
    Purpose: Shows position and gives one-click return to the parent.
    Anatomy: Link · chevron · link · … · current page as plain text.
    Properties: Text: each level label.
    Variants: Length = 2 | 3 | 4. Collapsed beyond 4.
    States: The current level is never a link.
    Dimensions: 20 tall, Body Small, gap 8
    Auto Layout: Horizontal, hug, 16 below the header.
    Keyboard: Tab through links.
    Accessible name: nav landmark named Breadcrumb. Ordered list. Current level marked as current page.
    PROHIBITED: Never make the current level a link. Never exceed four visible levels.

C-NAV-07 Company Selector
    Figma name: Navigation/Context/Company-Selector
    Purpose: Selects the active Company. Scopes every subsequent query.
    Anatomy: Label "Company" (Helper) · value (Body Emphasis) · chevron.
    Properties: Text: Value. Boolean: Interactive.
    Variants: State = Default | Open | Single-company
    States: With access to exactly one Company it renders as static text with no chevron.
    Dimensions: 40 tall, 180 min, 280 max
    Auto Layout: Horizontal, centre-left, gap 8.
    Keyboard: Arrow keys, Enter, Escape.
    Accessible name: "Company, currently Apex RMC Pvt Ltd" — the dimension is spoken, not just the value.
    PROHIBITED: Never omit the dimension from the accessible name. Never allow selection outside the user’s access.

C-NAV-08 Plant Selector
    Figma name: Navigation/Context/Plant-Selector
    Purpose: Selects the active Plant within the active Company.
    Anatomy: As Company Selector.
    Properties: Text: Value. Boolean: Allow all-plants.
    Variants: State = Default | Open | Single-plant | All-plants
    States: An All Plants option appears only where the FRIS permits cross-plant reporting. It is absent on every transaction screen.
    Dimensions: 40 tall, 180 min
    Auto Layout: Horizontal, centre-left, gap 8.
    Keyboard: As Company Selector.
    Accessible name: "Plant, currently Chakan Plant".
    PROHIBITED: Never offer All Plants on a transaction screen.

C-NAV-09 Active Role Selector
    Figma name: Navigation/Context/Active-Role-Selector
    Purpose: Shows and changes the single active role. Every permission check uses this one role.
    Anatomy: Label "Role" · value · chevron · info icon opening the active-role explanation.
    Properties: Text: Value. Boolean: Multi-role.
    Variants: State = Default | Open | Single-role
    States: Users holding one role see static text.
    Dimensions: 40 tall, 160 min
    Auto Layout: Horizontal, centre-left, gap 8.
    Keyboard: Selecting a role opens OV-05 before the shell re-renders.
    Accessible name: "Active role, currently Plant Manager". The change confirmation moves focus to the dialog.
    PROHIBITED: Never show a union of the user’s roles. Exactly one is active.

C-NAV-10 User Menu
    Figma name: Navigation/User-Menu/{Closed|Open}
    Purpose: Account actions and sign out.
    Anatomy: Avatar or initials 32 · name (desktop) · chevron · dropdown with name, email, active role, My Profile, Sign out.
    Properties: Text: Name, Email, Role.
    Variants: State = Closed | Open
    States: —
    Dimensions: 40 trigger, 240 dropdown at elevation/2
    Auto Layout: Horizontal trigger, vertical menu, padding 8.
    Keyboard: Arrow keys move between items. Escape closes and returns focus to the trigger.
    Accessible name: Menu button with a menu. Focus trapped while open.
    PROHIBITED: Never place product actions in this menu.

C-NAV-11 Context Strip
    Figma name: Navigation/Context-Strip/{Tablet|Mobile}
    Purpose: Carries Company, Plant and Active Role where the header has no room.
    Anatomy: Tablet: three inline selectors. Mobile: one summary line with a chevron.
    Properties: Text: Company, Plant, Role.
    Variants: Breakpoint = Tablet | Mobile
    States: Truncates from the left, preserving the Role, which is the value that changes what the user can do.
    Dimensions: 40 tablet, 36 mobile, full width, surface-sunken, bottom border
    Auto Layout: Horizontal, centre-left, padding 0 20, gap 12.
    Keyboard: Mobile: one focusable button opening a full-screen sheet.
    Accessible name: On mobile a single button whose name lists all three values.
    PROHIBITED: Never truncate the Role. Never hide the strip on scroll.


AUTO LAYOUT
Every component uses Auto Layout as specified per component. Nesting depth must not exceed six levels — deeper nesting makes variant swapping unreliable.

STATES
Focus state is 2px focus-ring outline at 2px offset on EVERY focusable element, without exception, including disabled controls.
Disabled state uses text-disabled, surface-sunken fill, and ALWAYS pairs with a Disabled Reason.
Read-only on inputs is DISTINCT from disabled: no border, surface-sunken fill, text-primary, text selectable.
Permission-hidden is a BOOLEAN PROPERTY that removes the element from Auto Layout, not a visual variant.

INTERACTIONS
None. Components are built, not wired.

RESPONSIVE
Where a component has Desktop and Touch sizes, build both as a Size variant.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 and 02. Components from earlier component prompts.

COMPLETION CHECKLIST
1. All 11 components exist with the exact Figma names listed.
2. Every interactive component has a Focus variant with a 2px ring at 2px offset.
3. Every input distinguishes Read-only from Disabled visually.
4. Permission-hidden is modelled as a Boolean, not a variant.
5. Every component uses only variables — no hard-coded values.
6. Nesting depth does not exceed six levels in any component.
7. Components are published to the library.

STOP CONDITION
Stop after C-NAV-11. Do not build templates or screen frames.
```

## P03 — Input and action components

*Blueprint reference: Blueprint Section 10, components C-INP-01 to C-ACT-08*
*Figma page: `03 — Components`*

```
OBJECTIVE
Create 23 components as published component sets on page "03 — Components". Every interactive component needs Default, Hover, Focus, Active, Disabled variants at minimum, plus the variants listed per component.

EXISTING WORK TO REUSE
All variables, text styles and icons from P00 and P01. Components created in earlier component prompts.

FIGMA PAGE
03 — Components

FRAMES TO CREATE
No screen frames. Create 23 COMPONENT SETS, arranged in a vertical stack with 200px between them, in the order listed below.

COMPONENTS TO INSTANTIATE
C-INP-01 Text Input
    Figma name: Input/Text/{Default|Hover|Focus|Error|Disabled|Read-only}
    Purpose: Single-line free text.
    Anatomy: Label · required marker · control · optional leading and trailing icon · helper or error text.
    Properties: Text: Label, Value, Helper, Error. Boolean: Required, Show leading icon, Show trailing icon, Show helper. Instance swap: icons.
    Variants: State = Default | Hover | Focus | Error | Disabled | Read-only. Size = Desktop | Touch.
    States: Read-only differs from Disabled: no border, surface-sunken fill, text-primary, text stays selectable.
    Dimensions: 40 desktop, 48 touch, max 560, padding 0 12, radius 6
    Auto Layout: Vertical, gap 4, fill width to 560.
    Keyboard: Standard text entry. Validates on blur.
    Accessible name: Label programmatically associated. Required conveyed beyond the asterisk. Error text linked and announced.
    PROHIBITED: Never use a placeholder as a label. Never use a floating label.

C-INP-02 Number Input
    Figma name: Input/Number/{Default|Focus|Error|Disabled|Read-only}
    Purpose: Plain numeric entry with no unit or symbol.
    Anatomy: As Text Input, value right-aligned in Numeric Table Cell.
    Properties: Text: Label, Value, Helper, Error. Boolean: Required, Show stepper.
    Variants: As Text Input
    States: Steppers only for small bounded values, never for quantities.
    Dimensions: 40 / 48, typically 160 wide
    Auto Layout: Vertical, gap 4.
    Keyboard: Rejects non-numeric characters. Range validated on blur.
    Accessible name: spinbutton with min, max and step exposed where they apply.
    PROHIBITED: Never use a stepper for a quantity — the increments are meaningless.

C-INP-03 Currency Input
    Figma name: Input/Currency/{Default|Focus|Error|Disabled|Read-only}
    Purpose: Monetary values.
    Anatomy: Leading ₹ prefix inside the control · right-aligned tabular value.
    Properties: Text: Label, Value, Helper, Error. Boolean: Required, Read-only.
    Variants: As Text Input
    States: Read-only is used for every derived amount: line totals, taxable value, GST, round-off, invoice total.
    Dimensions: 40 / 48, min 160
    Auto Layout: Vertical, gap 4.
    Keyboard: Formats on blur to Indian grouping with two decimals. Editing shows the raw number.
    Accessible name: The ₹ symbol is part of the accessible name, not a decorative prefix.
    PROHIBITED: Never leave a derived amount editable.

C-INP-04 Quantity Input
    Figma name: Input/Quantity/{Default|Focus|Error|Disabled|Read-only}
    Purpose: A quantity with its unit. The most-used input in the product.
    Anatomy: Right-aligned tabular value · unit suffix in text-secondary inside the control · available-balance helper.
    Properties: Text: Label, Value, Unit, Helper, Error. Boolean: Required, Show available balance.
    Variants: As Text Input
    States: Error when the value exceeds available or remaining quantity. The helper shows the governing figure, e.g. "Available 24.500 MT".
    Dimensions: 40 / 48, min 140
    Auto Layout: Vertical, gap 4.
    Keyboard: Validates against the available balance on blur and again on submit.
    Accessible name: The unit is part of the accessible name, so "24.5 metric tonnes" is announced.
    PROHIBITED: Never make the unit editable here — it comes from the selected material.

C-INP-05 Percentage Input
    Figma name: Input/Percentage/{Default|Focus|Error|Disabled|Read-only}
    Purpose: Percentage values.
    Anatomy: Right-aligned value · % suffix inside the control.
    Properties: Text: Label, Value, Helper, Error. Boolean: Required.
    Variants: As Text Input
    States: Error above 100 or below 0.
    Dimensions: 40 / 48, typically 120
    Auto Layout: Vertical, gap 4.
    Keyboard: Blur formats to two decimals.
    Accessible name: Percent is part of the accessible name.
    PROHIBITED: Never used for an Ordinary Positive Charge, which may not be a percentage.

C-INP-06 Text Area
    Figma name: Input/Text-Area/{Default|Focus|Error|Disabled|Read-only}
    Purpose: Multi-line text: remarks, reasons, addresses.
    Anatomy: Label · multi-line control · character counter where a limit applies · helper or error.
    Properties: Text: Label, Value, Helper, Error, Max length. Boolean: Required, Show counter.
    Variants: As Text Input
    States: Counter turns warning at 90% of the limit and error at the limit.
    Dimensions: 88 default, 3 rows, max 200 then scrolls
    Auto Layout: Vertical, gap 4, fill width to 560.
    Keyboard: Standard. Never auto-grows past 200.
    Accessible name: The counter is announced politely, not on every keystroke.
    PROHIBITED: Never resizable horizontally.

C-INP-07 Date Picker
    Figma name: Input/Date/{Default|Focus|Open|Error|Disabled|Read-only}
    Purpose: Single date entry in DD/MM/YYYY.
    Anatomy: Label · control with a calendar trailing icon · calendar popover.
    Properties: Text: Label, Value, Helper, Error. Boolean: Required, Restrict range.
    Variants: State = Default | Focus | Open | Error | Disabled | Read-only
    States: Out-of-range dates are disabled in the calendar and rejected on typed entry with a stated reason.
    Dimensions: 40 control, 320 popover at elevation/2
    Auto Layout: Vertical, gap 4.
    Keyboard: Typed entry and calendar both work. Arrow keys navigate the grid. Escape closes.
    Accessible name: Calendar is a grid. The format is stated in the accessible description, not only as placeholder text.
    PROHIBITED: Never rely on placeholder text alone to convey the format.

C-INP-08 Date-Time Picker
    Figma name: Input/Date-Time/{Default|Focus|Open|Error|Disabled|Read-only}
    Purpose: Date plus time where a statutory timestamp matters.
    Anatomy: As Date Picker plus a time segment and a mandatory timezone label.
    Properties: Text: Label, Value, Timezone, Helper, Error. Boolean: Required.
    Variants: As Date Picker
    States: The timezone label is always rendered and never truncated.
    Dimensions: 40 control, 200 min
    Auto Layout: Vertical, gap 4.
    Keyboard: As Date Picker.
    Accessible name: Timezone forms part of the accessible value and is spoken in full.
    PROHIBITED: Never omit the timezone label. UX-DEC-005 requires it.

C-INP-09 Searchable Select
    Figma name: Input/Searchable-Select/{Default|Focus|Open|Error|Disabled|Loading|Empty}
    Purpose: Selecting one record from a master. The workhorse of every transaction screen.
    Anatomy: Label · control with chevron · dropdown with a search field, scrollable options and a result count.
    Properties: Text: Label, Value, Placeholder, Helper, Error. Boolean: Required, Show secondary line, Allow clear.
    Variants: State = Default | Focus | Open | Error | Disabled | Loading | Empty
    States: Loading shows three skeleton rows. Empty shows "No matches for {term}" and never an illustration.
    Dimensions: 40 control, 320 max dropdown
    Auto Layout: Vertical, gap 4.
    Keyboard: Type to filter server-side. Arrows move, Enter selects, Escape closes. Paginates at 50 with Load more.
    Accessible name: combobox with listbox. The active option is announced. The search field is labelled.
    PROHIBITED: Never show inactive master records as selectable on a new transaction.

C-INP-10 Multi-Select
    Figma name: Input/Multi-Select/{Default|Focus|Open|Error|Disabled}
    Purpose: Selecting several records, principally in IAM.
    Anatomy: Label · control showing selected values as removable chips · dropdown with checkboxes · a selected count.
    Properties: Text: Label, Helper, Error. Boolean: Required, Show select-all, Show count.
    Variants: State = Default | Focus | Open | Error | Disabled
    States: An option the current user may not grant is rendered visible-and-disabled with the anti-escalation explanation, not hidden.
    Dimensions: Grows to fit chips, 40 min, 120 max then scrolls
    Auto Layout: Horizontal wrap inside, vertical outside, gap 8.
    Keyboard: Chips remove on click or Backspace. Select-all applies to the filtered set only and says so.
    Accessible name: Each chip removal names its item. The count is announced on change.
    PROHIBITED: Never hide an option the user cannot grant — show it disabled so the boundary is understood.

C-INP-11 Radio Group
    Figma name: Input/Radio-Group/{Default|Focus|Error|Disabled}
    Purpose: One choice from a small mutually exclusive set, used where the choice changes what happens next.
    Anatomy: Group label · legend · options each with a label and optional description.
    Properties: Text: Group label, each option label and description. Boolean: Required, Show descriptions.
    Variants: Layout = Vertical | Horizontal. State = Default | Focus | Error | Disabled.
    States: An individual option may be disabled with its own reason while others stay enabled. An option the role lacks permission for is absent.
    Dimensions: 20 control, 44 row, gap 12
    Auto Layout: Vertical, gap 12.
    Keyboard: Arrows move within the group; Tab enters and leaves it.
    Accessible name: radiogroup with a legend. Descriptions associate with their option.
    PROHIBITED: Never use for more than five options — use a Searchable Select instead.

C-INP-12 Checkbox
    Figma name: Input/Checkbox/{Default|Checked|Indeterminate|Focus|Error|Disabled}
    Purpose: Independent boolean, and row selection in tables.
    Anatomy: 20 control · optional label · optional description.
    Properties: Text: Label, Description. Boolean: Show label.
    Variants: State = Default | Checked | Indeterminate | Focus | Error | Disabled
    States: Indeterminate is used only by a table header checkbox over a partial selection.
    Dimensions: 20 control in a 44 hit area
    Auto Layout: Horizontal, centre-left, gap 8.
    Keyboard: Space toggles. Shift-click selects a range in tables.
    Accessible name: Indeterminate is exposed as mixed, never as unchecked.
    PROHIBITED: Never shrink the hit area below 44 on touch.

C-INP-13 Toggle
    Figma name: Input/Toggle/{Off|On|Focus|Disabled}
    Purpose: An immediate binary state change where no save step follows.
    Anatomy: 36×20 track with knob · label · optional description.
    Properties: Text: Label, Description.
    Variants: State = Off | On | Focus | Disabled
    States: Never used where a Save is required afterwards — use a Checkbox there.
    Dimensions: 36×20 in a 44 hit area
    Auto Layout: Horizontal, centre-left, gap 8.
    Keyboard: Space toggles. Change is immediate and confirmed by a Toast.
    Accessible name: switch role with on and off exposed. State never conveyed by position alone.
    PROHIBITED: Never use inside a form that has a Save button.

C-INP-14 File Upload Region
    Figma name: Input/File-Upload/{Empty|Populated|Error|Disabled}
    Purpose: The drop region hosting Attachment Upload Rows.
    Anatomy: Dashed drop region · icon · label · accepted formats and size line.
    Properties: Text: Label, Accepted formats, Error. Boolean: Multiple.
    Variants: State = Empty | Populated | Error | Disabled
    States: Error for unsupported type or oversize file, stated on the specific file.
    Dimensions: 96 tall empty
    Auto Layout: Vertical, gap 8, fill width.
    Keyboard: The drop region is also a labelled button reachable by Tab.
    Accessible name: Named as optional where it is optional. Never drag-and-drop only.
    PROHIBITED: Never mandatory in Phase 1 — UX-DEC-008 confirms it is optional.

C-INP-15 Attachment Upload Row
    Figma name: Input/Attachment-Row/{Empty|Uploading|Complete|Error|ReadOnly}
    Purpose: One evidence file with progress, preview and removal. Added for UX-DEC-008.
    Anatomy: Type icon · file name · size · progress bar · preview trigger · remove control.
    Properties: Text: File name, Size, Error. Boolean: Allow remove. Instance swap: File type icon.
    Variants: State = Empty | Uploading | Complete | Error | ReadOnly
    States: Uploading shows a determinate progress bar and disables remove. ReadOnly appears after approval: preview stays, remove is absent.
    Dimensions: 56 row, 4 progress bar
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 12.
    Keyboard: Preview and remove are separately focusable.
    Accessible name: "Evidence file {filename}, {size}, uploaded."
    PROHIBITED: Never blocks the Approve action. Removal is unavailable after approval.

C-ACT-01 Primary Button
    Figma name: Button/Primary/{Default|Hover|Active|Focus|Disabled|Loading}
    Purpose: The single most important action on a frame.
    Anatomy: Optional leading icon 20 · label · optional trailing icon.
    Properties: Text: Label. Boolean: Icon leading, Icon trailing, Full width. Variant: Size. Instance swap: icons.
    Variants: State = Default | Hover | Active | Focus | Disabled | Loading. Size = Small | Medium | Large.
    States: Disabled always pairs with a Disabled Reason. Loading holds the button width to prevent layout shift.
    Dimensions: 40 desktop, 44 touch, padding 0 16, gap 8, radius 6
    Auto Layout: Horizontal, centre, hug or fill.
    Keyboard: Enter and Space activate. Disabled buttons remain focusable so the tooltip is reachable.
    Accessible name: White on primary is 7.8:1. Loading announced politely.
    PROHIBITED: At most one per frame. Never two primaries competing.

C-ACT-02 Secondary Button
    Figma name: Button/Secondary/{Default|Hover|Active|Focus|Disabled|Loading}
    Purpose: Important but not primary. Approve Invoice sits here on CHL-SCR-002.
    Anatomy: As Primary.
    Properties: As Primary.
    Variants: As Primary.
    States: Surface fill, border-strong border, text-primary label.
    Dimensions: As Primary.
    Auto Layout: As Primary.
    Keyboard: As Primary.
    Accessible name: Border contrast 2.4:1, acceptable because the text label carries the meaning.
    PROHIBITED: Never used for a destructive action.

C-ACT-03 Tertiary Button
    Figma name: Button/Tertiary/{Default|Hover|Active|Focus|Disabled}
    Purpose: Low-emphasis actions and inline links.
    Anatomy: Label only, or icon plus label. No border, no fill.
    Properties: Text: Label. Boolean: Show icon.
    Variants: As Primary minus Loading.
    States: Hover shows a surface-sunken fill.
    Dimensions: 40, padding 0 8
    Auto Layout: Horizontal, centre, hug.
    Keyboard: As Primary.
    Accessible name: Underline on hover and focus so it is not distinguished by colour alone.
    PROHIBITED: Never used for the main action of a frame.

C-ACT-04 Destructive Button
    Figma name: Button/Destructive/{Default|Hover|Active|Focus|Disabled|Loading}
    Purpose: Irreversible or damaging actions.
    Anatomy: As Primary, error fill.
    Properties: As Primary.
    Variants: As Primary.
    States: Never the default focus target in a dialog. Focus lands on Cancel.
    Dimensions: As Primary.
    Auto Layout: As Primary.
    Keyboard: Always opens a confirmation or mandatory-reason dialog. Never acts directly.
    Accessible name: The label names the consequence — "Cancel invoice", not "Confirm".
    PROHIBITED: Never acts without a confirmation. Never the default focus.

C-ACT-05 Icon Button
    Figma name: Button/Icon/{Default|Hover|Active|Focus|Disabled}
    Purpose: Compact action where space genuinely does not allow a label.
    Anatomy: Icon 20 centred, no label, tooltip mandatory.
    Properties: Instance swap: Icon. Text: Tooltip, Accessible name.
    Variants: As Tertiary.
    States: —
    Dimensions: 40 square desktop, 44 touch
    Auto Layout: Horizontal, centre.
    Keyboard: Tooltip after 400ms hover, immediately on focus.
    Accessible name: An accessible name is mandatory.
    PROHIBITED: Never used for a destructive action.

C-ACT-06 Split Button
    Figma name: Button/Split/{Default|Open|Disabled}
    Purpose: A default action plus related alternatives.
    Anatomy: Primary segment with the label · 1px divider · chevron segment · dropdown.
    Properties: Text: Primary label. Boolean: Disabled.
    Variants: State = Default | Open | Disabled
    States: Segments disable independently — the default action may be unavailable while alternatives remain.
    Dimensions: 40 tall, chevron 36 wide
    Auto Layout: Horizontal, gap 0.
    Keyboard: Both segments separately focusable.
    Accessible name: Two separately named controls, not one.
    PROHIBITED: Never used for approval actions.

C-ACT-07 Row Action Menu
    Figma name: Table/Row-Action-Menu/{Closed|Open}
    Purpose: Per-row actions in a data table.
    Anatomy: Icon Button trigger · dropdown of labelled items · a divider above any destructive item, rendered in error text.
    Properties: Boolean per action: Show. Text per action: Label.
    Variants: State = Closed | Open
    States: Permission-denied actions are absent. Status-ineligible actions are present, disabled, with a reason in the item.
    Dimensions: 40 trigger, 200 min menu at elevation/2
    Auto Layout: Vertical menu, padding 4.
    Keyboard: Arrows navigate. Escape closes and restores focus to the trigger.
    Accessible name: Trigger name includes the row identifier: "Actions for challan CH-2026-000481".
    PROHIBITED: Never a row of icon buttons instead. Never contains the primary page action.

C-ACT-08 Sticky Action Bar
    Figma name: Navigation/Sticky-Action-Bar/{Desktop|Mobile}
    Purpose: Keeps form actions reachable without scrolling.
    Anatomy: Dirty indicator · optional compact totals · spacer · secondary actions · primary action.
    Properties: Boolean: Show totals, Show dirty indicator.
    Variants: Breakpoint = Desktop | Mobile
    States: Dirty state shows "Unsaved changes" in warning on the left.
    Dimensions: 72 desktop, 64 mobile, surface fill, top border
    Auto Layout: Horizontal, centre-space-between, padding 16 24, gap 12.
    Keyboard: Placed after main content in DOM order so keyboard users reach the form first.
    Accessible name: Complementary region named for its screen.
    PROHIBITED: Never contains navigation. Never scrolls with content.


AUTO LAYOUT
Every component uses Auto Layout as specified per component. Nesting depth must not exceed six levels — deeper nesting makes variant swapping unreliable.

STATES
Focus state is 2px focus-ring outline at 2px offset on EVERY focusable element, without exception, including disabled controls.
Disabled state uses text-disabled, surface-sunken fill, and ALWAYS pairs with a Disabled Reason.
Read-only on inputs is DISTINCT from disabled: no border, surface-sunken fill, text-primary, text selectable.
Permission-hidden is a BOOLEAN PROPERTY that removes the element from Auto Layout, not a visual variant.

INTERACTIONS
None. Components are built, not wired.

RESPONSIVE
Where a component has Desktop and Touch sizes, build both as a Size variant.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 and 02. Components from earlier component prompts.

COMPLETION CHECKLIST
1. All 23 components exist with the exact Figma names listed.
2. Every interactive component has a Focus variant with a 2px ring at 2px offset.
3. Every input distinguishes Read-only from Disabled visually.
4. Permission-hidden is modelled as a Boolean, not a variant.
5. Every component uses only variables — no hard-coded values.
6. Nesting depth does not exceed six levels in any component.
7. Components are published to the library.

STOP CONDITION
Stop after C-ACT-08. Do not build templates or screen frames.
```

## P04 — Table and data display components

*Blueprint reference: Blueprint Section 10, components C-DAT-01 to C-DAT-15*
*Figma page: `03 — Components`*

```
OBJECTIVE
Create 15 components as published component sets on page "03 — Components". Every interactive component needs Default, Hover, Focus, Active, Disabled variants at minimum, plus the variants listed per component.

EXISTING WORK TO REUSE
All variables, text styles and icons from P00 and P01. Components created in earlier component prompts.

FIGMA PAGE
03 — Components

FRAMES TO CREATE
No screen frames. Create 15 COMPONENT SETS, arranged in a vertical stack with 200px between them, in the order listed below.

COMPONENTS TO INSTANTIATE
C-DAT-01 Status Badge
    Figma name: Status/{Domain}/{Status}
    Purpose: Communicates a record state. The most repeated component in the product.
    Anatomy: Optional 12 icon · text label · pill container. The label is never omitted.
    Properties: Text: Label. Boolean: Show icon. Instance swap: Icon.
    Variants: Domain = Invoice | Challan | CreditNote | Wastage | Master | Lot | Disposition | Reservation. Status = the values valid for that domain.
    States: Not interactive, so no hover or focus.
    Dimensions: 22 tall, padding 0 8, radius 11
    Auto Layout: Horizontal, centre, gap 4, hug.
    Keyboard: Not focusable.
    Accessible name: The text label is the accessible name. Colour is decorative.
    PROHIBITED: A badge rendering as a coloured dot alone is a defect. The label is mandatory.

C-DAT-02 Data Table
    Figma name: Table/Container/{Default|Loading|Empty|Error}
    Purpose: Displays a scoped, filtered, paginated record set.
    Anatomy: Toolbar · header row · body rows · optional totals row · pagination footer.
    Properties: Boolean: Show selection, Show totals, Show pagination, Show column chooser, Sticky header.
    Variants: State = Default | Loading | Empty | Error. Density = Compact | Standard.
    States: Empty distinguishes "nothing exists" from "nothing matches". Error offers Retry.
    Dimensions: Header 40, rows 44 or 52, cell padding 0 12
    Auto Layout: Vertical, fill both. Horizontal scroll contained inside this container.
    Keyboard: Sort by clicking a header. Arrow navigation within editable grids.
    Accessible name: Real table semantics with scoped column headers. Sort state and row count announced.
    PROHIBITED: Never allow horizontal scroll at the page level. Never colour a row to convey status.

C-DAT-03 Table Row
    Figma name: Table/Row/{Default|Hover|Selected|Focus|Disabled}
    Purpose: One record.
    Anatomy: Optional checkbox · cells · row action menu pinned right.
    Properties: Boolean: Selected, Show actions, Permission-hidden actions.
    Variants: State = Default | Hover | Selected | Focus | Disabled
    States: Selected uses primary-subtle fill plus a 3px primary left bar — never fill alone. Disabled carries an inline reason, not only a tooltip.
    Dimensions: 44 compact, 52 standard
    Auto Layout: Horizontal, centre-left, padding 0 12.
    Keyboard: Focus outlines the whole row. Enter opens the detail.
    Accessible name: Selection state exposed on the row.
    PROHIBITED: Never reveal hidden controls on hover — the action trigger is always present.

C-DAT-04 Responsive Record Card
    Figma name: Table/Record-Card/{Collapsed|Expanded|Selected}
    Purpose: The mobile replacement for a table row. Not a shrunken table.
    Anatomy: Title line with primary identifier and Status Badge · two to four supporting label-value lines · expand chevron · overflow trigger.
    Properties: Text: Title, each supporting label and value. Boolean: Show selection, Show expand.
    Variants: State = Collapsed | Expanded | Selected
    States: Collapsed shows the essential values fixed in Section 14.3. Expanded reveals the rest.
    Dimensions: Padding 16, gap 8, radius 8, 12 between cards
    Auto Layout: Vertical, fill width, hug height.
    Keyboard: Tapping the body opens the detail. Tapping the chevron expands in place.
    Accessible name: Each card is an article named by its title line.
    PROHIBITED: Never truncate the primary identifier — wrap instead. Never navigate on an expand tap.

C-DAT-05 KPI Card
    Figma name: Data/KPI-Card/{Default|Loading|Error|Zero}
    Purpose: One dashboard metric.
    Anatomy: Label · value (KPI Value style) · optional secondary line · optional drill-through link.
    Properties: Text: Label, Value, Secondary, Link label. Boolean: Show link, Show secondary.
    Variants: State = Default | Loading | Error | Zero
    States: Error shows "Unable to load" plus Retry while the other cards keep rendering. Zero shows 0 with a neutral line, never error styling.
    Dimensions: 120 tall, padding 20, radius 8
    Auto Layout: Vertical, gap 8, fill column.
    Keyboard: The whole card is a link where a drill-through exists.
    Accessible name: Accessible name combines label and value. A failed card is announced without stealing focus.
    PROHIBITED: Never render zero as an error. Never add a seventh widget.

C-DAT-06 Pending Action Card
    Figma name: Data/Pending-Action-Card/{Default|Empty}
    Purpose: A dashboard list of items awaiting the user.
    Anatomy: Title · count badge · up to five compact rows · View all link.
    Properties: Text: Title, each row. Boolean: Show view-all.
    Variants: State = Default | Empty
    States: Empty shows "Nothing awaiting your action" in text-secondary.
    Dimensions: Hugs to 320 max then scrolls internally
    Auto Layout: Vertical, gap 8, padding 16.
    Keyboard: Rows are links.
    Accessible name: A list named by its title.
    PROHIBITED: Never exceeds five rows before View all.

C-DAT-07 Definition List
    Figma name: Data/Definition-List/{TwoColumn|Stacked}
    Purpose: Read-only label and value pairs on review screens.
    Anatomy: Repeating label above or beside value.
    Properties: Text: each label and value. Boolean: Show changed marker.
    Variants: Layout = TwoColumn | Stacked
    States: A changed marker — a 3px warning left bar plus the word "Changed" — is used after a return for correction.
    Dimensions: Label 160 fixed, value fills, 12 between pairs
    Auto Layout: Vertical, gap 12.
    Keyboard: Not interactive. Values are selectable text.
    Accessible name: Real definition-list semantics so each value associates with its label.
    PROHIBITED: Never used for editable content.

C-DAT-08 Audit Timeline
    Figma name: Data/Audit-Timeline/{Default|Loading|Empty}
    Purpose: Chronological immutable event history.
    Anatomy: Vertical rule · event nodes with timestamp, actor, active role at the time, action, optional before-and-after block, optional UTC line.
    Properties: Text: each event. Boolean: Show before-after, Newest first, Show UTC.
    Variants: State = Default | Loading | Empty
    States: No edit or delete control appears anywhere in this component under any permission.
    Dimensions: 12 node, 16 between events, 24 rule offset
    Auto Layout: Vertical, gap 16.
    Keyboard: Events expand to reveal the comparison.
    Accessible name: Ordered list. Each timestamp is a full readable date-time, never "2 days ago" alone.
    PROHIBITED: Never add an edit or delete control, for any role.

C-DAT-09 Status Timeline
    Figma name: Data/Status-Timeline/{Horizontal|Vertical}
    Purpose: Shows where a record sits in its lifecycle and what remains.
    Anatomy: Ordered steps: completed, current, future, plus any terminal failure branch.
    Properties: Text: each step label and timestamp. Boolean: Show timestamps, Show branch.
    Variants: Layout = Horizontal | Vertical
    States: A branch such as IRN Failed renders as a labelled fork, not a replacement for the main line.
    Dimensions: 48 horizontal, 32 per step vertical
    Auto Layout: Horizontal or vertical, gap 0.
    Keyboard: Not interactive.
    Accessible name: Ordered list with the current step marked. Step state stated in text, never colour alone.
    PROHIBITED: Never replace the main line with a failure branch.

C-DAT-10 Transaction Chain
    Figma name: Data/Transaction-Chain/Default
    Purpose: Shows linked documents so a user can trace material and money across records.
    Anatomy: Horizontal sequence of document chips with type icon, number and status badge, joined by arrows.
    Properties: Text: each chip. Boolean: Show status on chips.
    Variants: —
    States: The current document is emphasised with a primary border and is not a link.
    Dimensions: 32 chips, gap 8, arrow 16
    Auto Layout: Horizontal wrap, gap 8.
    Keyboard: Every chip except the current one navigates.
    Accessible name: Ordered list describing the relationship in text.
    PROHIBITED: Never omit the status from a chip — the reader needs to see state, not just linkage.

C-DAT-11 Quantity Summary
    Figma name: Data/Quantity-Summary/{Default|Warning|Error}
    Purpose: Shows the required, allocated and remaining triple governing every allocation and disposition screen.
    Anatomy: Three labelled figures in tabular numerals with units, and a state line beneath.
    Properties: Text: Required, Allocated, Remaining, Unit, State message.
    Variants: State = Default | Warning | Error
    States: Warning while remaining is non-zero and the record is a draft. Error when allocation exceeds availability or a submit is attempted with a remainder.
    Dimensions: 64 tall, surface-sunken, padding 16, radius 8
    Auto Layout: Horizontal at desktop, vertical at mobile, gap 16.
    Keyboard: Not interactive. A live derived readout.
    Accessible name: A group with an accessible name. Changes announced politely.
    PROHIBITED: Never hidden at any breakpoint — it is the figure the user is working against.

C-DAT-12 Calculation Summary
    Figma name: Data/Calculation-Summary/{Default|Loading}
    Purpose: The invoice totals block. The line order is fixed and must not be rearranged.
    Anatomy: Right-aligned label and value rows in this exact order: product subtotal, discount, additional charges, taxable value, CGST, SGST or IGST, pre-round-off total, round-off adjustment, INVOICE TOTAL.
    Properties: Text: each value. Boolean: Show IGST instead of CGST and SGST.
    Variants: State = Default | Loading
    States: Round-off is always its own line and is shown even when zero.
    Dimensions: Row 24, total row 32 with top border, block 320 wide
    Auto Layout: Vertical, gap 4, hug, right-aligned.
    Keyboard: Not interactive. Every value is derived and read-only.
    Accessible name: Definition list. The total carries a name identifying it as the invoice total.
    PROHIBITED: Never reorder the lines. Never hide the round-off row.

C-DAT-13 Empty State
    Figma name: Feedback/Empty-State/{NoRecords|NoMatches|NoPermission|NoData}
    Purpose: Explains why a region is empty and what to do next.
    Anatomy: One 24 icon · headline · one supporting line · at most one action.
    Properties: Text: Headline, Supporting, Action label. Boolean: Show action.
    Variants: Type = NoRecords | NoMatches | NoPermission | NoData
    States: NoRecords invites creation. NoMatches offers Clear all filters. NoData is the uniform report wording.
    Dimensions: 48 vertical padding, centred, 400 max width
    Auto Layout: Vertical, centre, gap 8.
    Keyboard: The single action is focusable.
    Accessible name: Announced politely when a region becomes empty after a filter change.
    PROHIBITED: Never an illustration or a mascot. Never more than one action.

C-DAT-14 Dependency Summary Block
    Figma name: Data/Dependency-Summary/{Blocking|Advisory}
    Purpose: Lists what depends on a record being deactivated. Added for UX-DEC-001, 002 and 003.
    Anatomy: Heading stating the count · dependency rows with a type label, a count or quantity, and an optional link · a closing consequence line.
    Properties: Text: Heading, each row, Consequence line. Boolean: Show links.
    Variants: Type = Blocking | Advisory
    States: Blocking uses error-subtle and states deactivation cannot proceed. Advisory uses warning-subtle and states historical records remain visible.
    Dimensions: Hug to 240 max then scrolls, row 32
    Auto Layout: Vertical, padding 16, gap 8, fill dialog width.
    Keyboard: Links are reachable in order.
    Accessible name: A labelled region whose name states the count.
    PROHIBITED: Never shows a bare count with no type breakdown. Stock dependencies state a quantity with its unit.

C-DAT-15 Plant Lock Indicator
    Figma name: Data/Plant-Lock/{Unlocked|Locked}
    Purpose: Shows that the Plant filter has locked to the first selected challan. Added for UX-DEC-009.
    Anatomy: Lock icon 16 · label "Plant locked to" · value in Body Emphasis · Clear selection action.
    Properties: Text: Plant name. Boolean: Locked.
    Variants: State = Unlocked | Locked
    States: Unlocked is not rendered at all. Locked appears the moment the first challan is selected.
    Dimensions: 32 tall, hugs, sits in the filter chip row
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 8.
    Keyboard: Clear selection is focusable; the indicator is not.
    Accessible name: "Plant locked to Chakan Plant. Clear the selection to change Plant."
    PROHIBITED: Never rendered as a disabled dropdown — the Plant filter is removed and replaced by this.


AUTO LAYOUT
Every component uses Auto Layout as specified per component. Nesting depth must not exceed six levels — deeper nesting makes variant swapping unreliable.

STATES
Focus state is 2px focus-ring outline at 2px offset on EVERY focusable element, without exception, including disabled controls.
Disabled state uses text-disabled, surface-sunken fill, and ALWAYS pairs with a Disabled Reason.
Read-only on inputs is DISTINCT from disabled: no border, surface-sunken fill, text-primary, text selectable.
Permission-hidden is a BOOLEAN PROPERTY that removes the element from Auto Layout, not a visual variant.

INTERACTIONS
None. Components are built, not wired.

RESPONSIVE
Where a component has Desktop and Touch sizes, build both as a Size variant.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 and 02. Components from earlier component prompts.

COMPLETION CHECKLIST
1. All 15 components exist with the exact Figma names listed.
2. Every interactive component has a Focus variant with a 2px ring at 2px offset.
3. Every input distinguishes Read-only from Disabled visually.
4. Permission-hidden is modelled as a Boolean, not a variant.
5. Every component uses only variables — no hard-coded values.
6. Nesting depth does not exceed six levels in any component.
7. Components are published to the library.

STOP CONDITION
Stop after C-DAT-15. Do not build templates or screen frames.
```

## P05 — Feedback and overlay components

*Blueprint reference: Blueprint Section 10, components C-FBK-01 to C-OVL-07*
*Figma page: `03 — Components`*

```
OBJECTIVE
Create 15 components as published component sets on page "03 — Components". Every interactive component needs Default, Hover, Focus, Active, Disabled variants at minimum, plus the variants listed per component.

EXISTING WORK TO REUSE
All variables, text styles and icons from P00 and P01. Components created in earlier component prompts.

FIGMA PAGE
03 — Components

FRAMES TO CREATE
No screen frames. Create 15 COMPONENT SETS, arranged in a vertical stack with 200px between them, in the order listed below.

COMPONENTS TO INSTANTIATE
C-FBK-01 Inline Error
    Figma name: Feedback/Inline-Error/Default
    Purpose: Field-level validation message.
    Anatomy: 16 alert icon · message in Error style.
    Properties: Text: Message.
    Variants: —
    States: Replaces the helper text; never stacks below it.
    Dimensions: 4 beneath the input, 16 line height, gap 4
    Auto Layout: Horizontal, top-left, gap 4.
    Keyboard: Not focusable, but linked to its field.
    Accessible name: Associated with its field and announced. Icon plus text, never colour alone.
    PROHIBITED: Never uses invented wording where an approved code exists.

C-FBK-02 Validation Summary
    Figma name: Feedback/Validation-Summary/Default
    Purpose: Collects every error on a long form so the user is not hunting.
    Anatomy: Error-subtle panel · headline giving the count · a bulleted list of linked field names.
    Properties: Text: Headline, each item.
    Variants: —
    States: Appears only after a failed submit, never while typing.
    Dimensions: Full content width, padding 16, beneath the page title
    Auto Layout: Vertical, gap 8.
    Keyboard: Each item moves focus to its field, not merely scrolling to it.
    Accessible name: Receives focus on appearance and is announced assertively. Items are real links.
    PROHIBITED: Never appears on keystroke. Never replaces field-level errors.

C-FBK-03 Toast
    Figma name: Feedback/Toast/{Success|Error|Information}
    Purpose: Transient confirmation of a completed action.
    Anatomy: Icon · message · optional action link · close control.
    Properties: Text: Message, Action label. Boolean: Show action.
    Variants: Type = Success | Error | Information
    States: Success auto-dismisses after 5s. Error persists until dismissed.
    Dimensions: 400 wide, 56 min tall, elevation/3
    Auto Layout: Horizontal, centre-left, padding 12 16, gap 12.
    Keyboard: Never steals focus. Close is focusable.
    Accessible name: status for success, alert for error.
    PROHIBITED: Never used for anything the user must act on — that is an Alert or a Dialog.

C-FBK-04 Alert
    Figma name: Feedback/Alert/{Information|Success|Warning|Error}
    Purpose: Persistent in-page message tied to a region.
    Anatomy: Icon · optional bold title · message · optional action · optional dismiss.
    Properties: Text: Title, Message, Action label. Boolean: Show title, Show action, Dismissible.
    Variants: Type = Information | Success | Warning | Error
    States: Warning advises but never blocks. Error blocks and always names the blocked action.
    Dimensions: Full region width, padding 12, radius 6, 3px left bar
    Auto Layout: Horizontal, top-left, gap 12.
    Keyboard: Actions are focusable.
    Accessible name: Error and Warning use an alert role. Information does not.
    PROHIBITED: Never floats at the page top unless it concerns the whole page.

C-FBK-05 Warning Banner
    Figma name: Feedback/Warning-Banner/{Page|Section}
    Purpose: A page-level condition affecting everything on the frame.
    Anatomy: Warning-subtle fill, full bleed, icon, message, optional action.
    Properties: Text: Message, Action label.
    Variants: Scope = Page | Section
    States: Not dismissible when it describes a condition still in force.
    Dimensions: 48 tall, directly beneath the breadcrumb
    Auto Layout: Horizontal, centre-left, padding 12 24, gap 12.
    Keyboard: Actions focusable.
    Accessible name: Announced on load.
    PROHIBITED: Never overlays content — it pushes content down.

C-FBK-06 Permission Message
    Figma name: Feedback/Permission-Message/{Region|Page}
    Purpose: Explains that a region or screen is unavailable to the active role.
    Anatomy: Icon · headline · one line naming the active role and suggesting who to contact.
    Properties: Text: Headline, Message, Active role.
    Variants: Scope = Region | Page
    States: Never names the specific missing permission key — it names the role and points at the administrator.
    Dimensions: Fills the region it replaces, 120 min
    Auto Layout: Vertical, centre, gap 8.
    Keyboard: Receives focus at page scope.
    Accessible name: Announced on load.
    PROHIBITED: Never leaks the permission key. Never offers a retry — the condition is not transient.

C-FBK-07 Disabled Reason Tooltip
    Figma name: Feedback/Disabled-Reason/Default
    Purpose: States why a visible control cannot be used. Mandatory on every disabled action.
    Anatomy: Dark surface, white text, 8 padding, 240 max, arrow pointing at the control.
    Properties: Text: Reason.
    Variants: —
    States: The reason always names the blocking condition, never "not allowed".
    Dimensions: 32 min height, elevation/2
    Auto Layout: Horizontal, padding 8.
    Keyboard: Appears on hover after 400ms and immediately on keyboard focus. Disabled controls stay focusable so this is reachable.
    Accessible name: Associated with the control as its description so the reason is announced with it.
    PROHIBITED: Never omitted from a disabled control. Never says "not allowed" or "permission denied".

C-FBK-08 Loading Skeleton
    Figma name: Feedback/Skeleton/{TableRow|Card|Form|KPI}
    Purpose: Placeholder while data loads, sized to the real content so nothing shifts.
    Anatomy: Neutral blocks at surface-sunken with a slow shimmer.
    Properties: Number: Row count.
    Variants: Type = TableRow | Card | Form | KPI
    States: Shown only after 300ms so quick responses do not flash.
    Dimensions: Matches the height of what it replaces exactly
    Auto Layout: Follows the layout it stands in for.
    Keyboard: Not focusable.
    Accessible name: Marked busy. Screen readers are told content is loading rather than reading placeholder shapes.
    PROHIBITED: Never a spinner where a skeleton would preserve layout.

C-OVL-01 Confirmation Dialog
    Figma name: Dialog/Confirmation/{Default|Destructive}
    Purpose: Confirms a consequential action where no reason is required.
    Anatomy: Title stating the action · body stating the specific consequence · Cancel · confirm labelled with the action.
    Properties: Text: Title, Body, Confirm label. Boolean: Show dependency block. Variant: Size.
    Variants: Type = Default | Destructive. Size = Small | Medium.
    States: The body names the actual consequence — which numbers are issued, which records are affected — never a generic "Are you sure?".
    Dimensions: 400 small, 560 medium, elevation/3 over a scrim
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: Focus opens on Cancel. Escape cancels. The confirm button is never the default focus.
    Accessible name: Modal dialog with focus trapped and restored to the trigger on close.
    PROHIBITED: Never uses "Confirm" or "OK" as the button label.

C-OVL-02 Mandatory Reason Dialog
    Figma name: Dialog/Reason/Required
    Purpose: Captures a required reason before an action proceeds.
    Anatomy: Title · context summary of the affected record · optional reason category · mandatory text area · Cancel · confirm.
    Properties: Text: Title, Context, Reason label. Boolean: Show category select.
    Variants: —
    States: The confirm button is disabled until the reason meets the minimum length, and the disabled reason says so.
    Dimensions: 560 medium
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: The text area is focused on open. Closes only through Cancel — not scrim click, not Escape.
    Accessible name: The required constraint is announced.
    PROHIBITED: Never dismisses on scrim click — a half-typed reason must not be lost.

C-OVL-03 Unsaved Changes Dialog
    Figma name: Dialog/Unsaved-Changes/Default
    Purpose: Prevents accidental loss of work on navigation.
    Anatomy: Title · body naming the record · Discard changes (destructive tertiary) · Cancel · Save and continue.
    Properties: Text: Title, Body.
    Variants: —
    States: Save and continue is absent where the form cannot be saved in its current state; the body then says so.
    Dimensions: 400 small
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: Focus opens on Cancel.
    Accessible name: Modal dialog.
    PROHIBITED: Never appears when nothing has changed.

C-OVL-04 Concurrency Dialog
    Figma name: Dialog/Concurrency/Default
    Purpose: Handles the case where another user changed the record since it was loaded.
    Anatomy: Title "This record has changed" · body carrying CHL-ERR-019 wording naming who changed it and when · Reload record · Cancel.
    Properties: Text: Actor, Timestamp.
    Variants: —
    States: Never offers a merge or a force-save. Reloading discards local edits and says so plainly.
    Dimensions: 560 medium
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: Focus opens on Reload record.
    Accessible name: Announced assertively.
    PROHIBITED: Never offers force-save or merge.

C-OVL-05 Report Filter Drawer
    Figma name: Data/Report-Filter-Drawer/{Closed|Open|Applied}
    Purpose: Holds filters without consuming vertical space above the data.
    Anatomy: Trigger with an applied-count badge · drawer with grouped filter controls · Clear all · Apply.
    Properties: Number: Applied count. Boolean: Show clear all.
    Variants: State = Closed | Open | Applied
    States: Filters apply only on Apply, never on change. Applied filters also render as removable chips above the table.
    Dimensions: 480 desktop drawer, 40 trigger
    Auto Layout: Vertical, padding 16, gap 16.
    Keyboard: Focus trapped. Escape closes. The applied count is part of the trigger name.
    Accessible name: Modal drawer.
    PROHIBITED: Never applies a filter on change — the user must press Apply.

C-OVL-06 Deactivation Blocked Dialog
    Figma name: Dialog/Deactivation-Blocked/Default
    Purpose: Terminal dialog explaining that deactivation cannot proceed. Added for UX-DEC-001, 002 and 003.
    Anatomy: Title "Cannot deactivate {record_name}" · Dependency Summary in Blocking variant · a remedy line · a single Close action.
    Properties: Text: Record name, Remedy line.
    Variants: —
    States: One state only. There is no override, no "deactivate anyway", and no destructive action anywhere in this dialog.
    Dimensions: 560 medium, body scrolls if the list is long
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: Focus opens on Close. Escape closes. Focus returns to the row action trigger.
    Accessible name: Modal dialog announced assertively because it reports a blocked action.
    PROHIBITED: Never contains a confirm or an override. If one appears, the UX decision has been misread.

C-OVL-07 Export Limit Dialog
    Figma name: Dialog/Export-Limit/Default
    Purpose: Handles an export whose result set exceeds the permitted row count.
    Anatomy: Title · body stating the matched row count and the limit · guidance to narrow filters · Cancel · Narrow filters.
    Properties: Text: Row count, Limit.
    Variants: —
    States: Never offers a truncated export — exporting part of a filtered set silently would misrepresent the data.
    Dimensions: 400 small
    Auto Layout: Vertical, padding 20, gap 16.
    Keyboard: Focus opens on Narrow filters.
    Accessible name: Modal dialog.
    PROHIBITED: Never offers a partial or truncated export.


AUTO LAYOUT
Every component uses Auto Layout as specified per component. Nesting depth must not exceed six levels — deeper nesting makes variant swapping unreliable.

STATES
Focus state is 2px focus-ring outline at 2px offset on EVERY focusable element, without exception, including disabled controls.
Disabled state uses text-disabled, surface-sunken fill, and ALWAYS pairs with a Disabled Reason.
Read-only on inputs is DISTINCT from disabled: no border, surface-sunken fill, text-primary, text selectable.
Permission-hidden is a BOOLEAN PROPERTY that removes the element from Auto Layout, not a visual variant.

INTERACTIONS
None. Components are built, not wired.

RESPONSIVE
Where a component has Desktop and Touch sizes, build both as a Size variant.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 and 02. Components from earlier component prompts.

COMPLETION CHECKLIST
1. All 15 components exist with the exact Figma names listed.
2. Every interactive component has a Focus variant with a 2px ring at 2px offset.
3. Every input distinguishes Read-only from Disabled visually.
4. Permission-hidden is modelled as a Boolean, not a variant.
5. Every component uses only variables — no hard-coded values.
6. Nesting depth does not exceed six levels in any component.
7. Components are published to the library.

STOP CONDITION
Stop after C-OVL-07. Do not build templates or screen frames.
```

## P06 — Operational components

*Blueprint reference: Blueprint Section 10, components C-OPS-01 to C-OPS-14*
*Figma page: `03 — Components`*

```
OBJECTIVE
Create 14 components as published component sets on page "03 — Components". Every interactive component needs Default, Hover, Focus, Active, Disabled variants at minimum, plus the variants listed per component.

EXISTING WORK TO REUSE
All variables, text styles and icons from P00 and P01. Components created in earlier component prompts.

FIGMA PAGE
03 — Components

FRAMES TO CREATE
No screen frames. Create 14 COMPONENT SETS, arranged in a vertical stack with 200px between them, in the order listed below.

COMPONENTS TO INSTANTIATE
C-OPS-01 Editable Line-Item Grid
    Figma name: Transaction/Line-Grid/{Desktop|Mobile}
    Purpose: The repeating row editor at the centre of every transaction screen.
    Anatomy: Header row · editable rows with a row number, inputs, derived read-only cells and a remove control · Add line row · totals region.
    Properties: Boolean: Show remove, Show add, Show totals, Allow reorder.
    Variants: Breakpoint = Desktop | Mobile. State = Default | Error | ReadOnly.
    States: A row-level error highlights the offending cell and shows an Inline Error beneath that row, not at the grid top. A row may be locked while others stay editable.
    Dimensions: Rows 52, add row 44, totals separated by 16 and a top border
    Auto Layout: Vertical, fill width, hug height.
    Keyboard: Tab moves across then down. Enter on the last cell adds a row. Escape cancels the cell edit.
    Accessible name: A real table. Every cell input names its column and row number.
    PROHIBITED: Never shows a grid-level error for a row-level problem.

C-OPS-02 Inward Allocation Panel
    Figma name: Transaction/Allocation/Panel
    Purpose: Allocates a challan line against inward lots using a FIFO suggestion the user may adjust.
    Anatomy: Panel header naming the parent line · Quantity Summary · FIFO lot rows · Reset to suggestion · Confirm allocation.
    Properties: Text: Parent line label. Boolean: Show reset.
    Variants: —
    States: Suggested, Modified and Confirmed are visually distinct and labelled in words. Insufficient availability raises CHL-ERR-004.
    Dimensions: Expands inline beneath its parent line, accent-subtle fill, padding 16
    Auto Layout: Vertical, gap 12, fill width.
    Keyboard: Focus moves into the panel on expand and returns to the line on collapse.
    Accessible name: A labelled region. Expanding announces the parent line.
    PROHIBITED: Never offers an expired lot as available. Never omits the re-validation at approval.

C-OPS-03 FIFO Suggested Lot Row
    Figma name: Transaction/Allocation/Lot-Row/{Suggested|Modified|Locked|Ineligible}
    Purpose: One lot within an allocation.
    Anatomy: Lot reference in accent · inward date · available quantity · quantity editor · state marker in words.
    Properties: Text: Lot reference, Date, Available, State marker.
    Variants: State = Suggested | Modified | Locked | Ineligible
    States: Locked means already committed to another challan; it is shown, disabled, and names the consuming document. Ineligible covers expired material.
    Dimensions: 52 tall
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 12.
    Keyboard: The quantity editor is focusable; the row is not.
    Accessible name: The state marker is real text inside the row, not a tooltip.
    PROHIBITED: Never conveys state by colour alone. Never shows expired stock as available.

C-OPS-04 Allocation Quantity Editor
    Figma name: Transaction/Allocation/Quantity-Editor/{Default|Modified|Error}
    Purpose: The quantity control inside a lot row.
    Anatomy: Quantity Input · available-balance helper · a reset-this-row control once modified.
    Properties: Text: Value, Available, Error.
    Variants: State = Default | Modified | Error
    States: Error when the entry exceeds the lot available quantity, stated with the actual figure.
    Dimensions: 140 wide, 40 tall
    Auto Layout: Horizontal, gap 8.
    Keyboard: Live-updates the parent Quantity Summary on every change.
    Accessible name: Accessible name includes the lot reference so context is not lost.
    PROHIBITED: Never allows an entry above the lot balance without an error.

C-OPS-05 Disposition Quantity Panel
    Figma name: Transaction/Disposition/Panel
    Purpose: Splits a rejected quantity across the three mutually exclusive disposition paths.
    Anatomy: Read-only rejected quantity · three path rows each a radio option with its own quantity input · a running reconciliation line · Quantity Summary.
    Properties: Boolean per path: Show. Text: each path label.
    Variants: —
    States: The reconciliation line raises DSP-ERR-017 whenever the sum exceeds the rejected quantity. A path the role lacks permission for is absent, not disabled.
    Dimensions: Padding 16, 52 per path row
    Auto Layout: Vertical, gap 12, fill width.
    Keyboard: Fieldset with a legend. The reconciliation state is announced on change.
    Accessible name: A labelled group. Changes announced politely.
    PROHIBITED: Never allows the same quantity down two paths — the exclusive-disposition rule.

C-OPS-06 Credit Note Line Selector
    Figma name: Transaction/Credit-Note/Line-Selector
    Purpose: Chooses which invoice lines and charges to credit and by how much.
    Anatomy: A table of original lines showing original value, already credited, remaining creditable and a credit input · a separate charge-level block with the same columns · a value summary.
    Properties: Boolean: Show charges block.
    Variants: —
    States: A line whose remaining creditable is zero is shown, disabled, and says "Fully credited". Exceeding the remaining creditable raises an error on that line.
    Dimensions: 52 rows
    Auto Layout: Vertical, fill width.
    Keyboard: Each input names its line.
    Accessible name: Remaining creditable is exposed as part of the accessible description.
    PROHIBITED: Never deletes a zeroed line — it is retained with its remaining creditable intact.

C-OPS-07 Rate Resolution Indicator
    Figma name: Transaction/Rate-Resolution/{CompanyRate|UniversalRate|ManualRate|Missing}
    Purpose: States in words where a line rate came from. Never leaves the source implicit.
    Anatomy: A short source label beside the rate value, and a Set manual rate control where permitted.
    Properties: Text: Source label. Boolean: Allow manual override.
    Variants: Source = CompanyRate | UniversalRate | ManualRate | Missing
    States: Missing raises CHL-ERR-008 at approval. Manual override is available only to a role holding Set Manual Rate; otherwise the rate is read-only and the control is absent.
    Dimensions: Inline, 20 tall, Body Small in text-secondary
    Auto Layout: Horizontal, gap 4.
    Keyboard: The manual rate control is focusable.
    Accessible name: The source is real text, not a coloured dot or icon-only cue.
    PROHIBITED: Never conveys the source by colour or icon alone.

C-OPS-08 Additional Charge Row
    Figma name: Transaction/Charge/Row/{Default|Error|Locked}
    Purpose: One additional charge on an invoice.
    Anatomy: Charge type select · calculation type · value input · computed amount read-only · remove control.
    Properties: Text: Type, Calculation, Value, Amount.
    Variants: State = Default | Error | Locked
    States: The same charge type cannot appear twice; a duplicate raises an Inline Error on the second row.
    Dimensions: 52 tall
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 12.
    Keyboard: Tab across the row.
    Accessible name: Each control names its charge type.
    PROHIBITED: An Ordinary Positive Charge may never be entered as a percentage.

C-OPS-09 Discount Row
    Figma name: Transaction/Discount/Row/{Percentage|Fixed|Error}
    Purpose: A discount, sharing the charge grid.
    Anatomy: As Additional Charge Row, classified as a discount.
    Properties: Text: Type, Value, Amount.
    Variants: Type = Percentage | Fixed. Plus Error.
    States: A discount exceeding the product subtotal raises CHL-ERR-013.
    Dimensions: 52 tall
    Auto Layout: Horizontal, centre-left, padding 0 12, gap 12.
    Keyboard: Tab across the row.
    Accessible name: Values announced as negative where they reduce the total.
    PROHIBITED: Never distinguished from a charge by position alone — the classification column carries it.

C-OPS-10 GST Summary
    Figma name: Data/GST-Summary/{Intra|Inter}
    Purpose: Shows the tax breakdown.
    Anatomy: Intra-state: CGST and SGST rows. Inter-state: a single IGST row. Rate and amount on each.
    Properties: Text: each rate and amount.
    Variants: Type = Intra | Inter
    States: Never shows all three simultaneously. The variant is determined by the transaction, not chosen by the user.
    Dimensions: Part of the Calculation Summary, 24 rows
    Auto Layout: Vertical, gap 4.
    Keyboard: Not interactive.
    Accessible name: Rates are part of each row accessible name.
    PROHIBITED: Never lets the user choose the variant.

C-OPS-11 Round-Off Summary
    Figma name: Data/Round-Off/Default
    Purpose: Makes the rounding adjustment explicit and auditable.
    Anatomy: Pre-round-off total row · signed adjustment row · final total row.
    Properties: Text: Pre-round-off, Adjustment, Total.
    Variants: —
    States: The adjustment row is always rendered, including when it is zero. It is never folded into the total.
    Dimensions: Part of the Calculation Summary
    Auto Layout: Vertical, gap 4.
    Keyboard: Not interactive.
    Accessible name: The sign is spoken as "plus" or "minus", not left to a glyph.
    PROHIBITED: Never hidden when zero. Never folded into the total.

C-OPS-12 IRN Outcome Form
    Figma name: Transaction/IRN/Outcome-Form/{Success|Failure|Blocked}
    Purpose: Records the manual outcome of an external IRN submission.
    Anatomy: Radio group choosing Success or Failure · a Success field set · a Failure field set · Cancel and Record outcome.
    Properties: Text: each field label and value.
    Variants: State = Success | Failure | Blocked
    States: Success fields are mandatory only under Success and absent under Failure, and vice versa. Blocked replaces the entire form with a Statutory Deadline Block.
    Dimensions: 560 form column
    Auto Layout: Vertical, gap 16, fill width to 560.
    Keyboard: The field-set swap moves focus to the first field of the newly revealed set and announces the change.
    Accessible name: The swap is announced, not silent.
    PROHIBITED: No live integration, no connection status, no queue, no automatic retry. Never disables one field set to show the other — it swaps.

C-OPS-13 Return Approval Bar
    Figma name: Transaction/Return-Approval-Bar/{Draft|Pending|Approved|Returned}
    Purpose: Puts Approve Return on the same page as the return entry form. Added for UX-DEC-007.
    Anatomy: Status badge · state description · spacer · Return for Correction · Approve Return · Save (Draft only).
    Properties: Text: State description. Boolean: Show approve, Show return-for-correction, Show save.
    Variants: State = Draft | Pending | Approved | Returned
    States: Approve Return and Return for Correction are absent where the role lacks Return — Approve. In Draft, Approve Return is disabled with "Save the return before approving it."
    Dimensions: Inside the sticky footer, 72 desktop, 64 mobile
    Auto Layout: Horizontal, centre-space-between, padding 16 24, gap 12.
    Keyboard: Placed after the form in DOM order.
    Accessible name: A complementary region named "Return approval actions".
    PROHIBITED: Never navigates to a separate review screen — UX-DEC-007 requires same-page approval.

C-OPS-14 Timezone Deadline Display
    Figma name: Data/Deadline-Display/{Comfortable|Approaching|Passed}
    Purpose: Renders a statutory deadline as an exact instant with a mandatory timezone label. Added for UX-DEC-004 and 005.
    Anatomy: Label "Closes at" · deadline value in tabular numerals · timezone label · optional remaining-time line · optional stored-UTC line.
    Properties: Text: Deadline value, Timezone, Remaining. Boolean: Show remaining, Show UTC.
    Variants: State = Comfortable | Approaching | Passed
    States: Approaching uses warning colour. Passed uses error colour and the parent form is replaced by the Statutory Deadline Block. The timezone label is never truncated or hidden.
    Dimensions: Hugs content, two lines at 18, three where UTC is shown
    Auto Layout: Vertical, gap 4, hug.
    Keyboard: Not interactive.
    Accessible name: "Closes at 8 September 2026, 23:59 India Standard Time." The timezone is spoken in full.
    PROHIBITED: Never renders a bare day count — ambiguous at the UX-DEC-004 boundary. Never omits the timezone.


AUTO LAYOUT
Every component uses Auto Layout as specified per component. Nesting depth must not exceed six levels — deeper nesting makes variant swapping unreliable.

STATES
Focus state is 2px focus-ring outline at 2px offset on EVERY focusable element, without exception, including disabled controls.
Disabled state uses text-disabled, surface-sunken fill, and ALWAYS pairs with a Disabled Reason.
Read-only on inputs is DISTINCT from disabled: no border, surface-sunken fill, text-primary, text selectable.
Permission-hidden is a BOOLEAN PROPERTY that removes the element from Auto Layout, not a visual variant.

INTERACTIONS
None. Components are built, not wired.

RESPONSIVE
Where a component has Desktop and Touch sizes, build both as a Size variant.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 and 02. Components from earlier component prompts.

COMPLETION CHECKLIST
1. All 14 components exist with the exact Figma names listed.
2. Every interactive component has a Focus variant with a 2px ring at 2px offset.
3. Every input distinguishes Read-only from Disabled visually.
4. Permission-hidden is modelled as a Boolean, not a variant.
5. Every component uses only variables — no hard-coded values.
6. Nesting depth does not exceed six levels in any component.
7. Components are published to the library.

STOP CONDITION
Stop after C-OPS-14. Do not build templates or screen frames.
```

## P07 — Page templates

*Blueprint reference: Blueprint Section 11*
*Figma page: `04 — Page Templates`*

```
OBJECTIVE
Create 8 page templates as component sets. Every screen frame will instance one of these.

EXISTING WORK TO REUSE
All 78 components from P02 to P06. All variables and styles.

FIGMA PAGE
04 — Page Templates

FRAMES TO CREATE
8 component sets in order:
Pattern/T01-List · Pattern/T02-Master-Form · Pattern/T03-Transaction · Pattern/T04-Review
Pattern/T05-Dashboard · Pattern/T06-Report · Pattern/T07-Config · Pattern/T08-Audit

Each sits inside Navigation/App-Shell/Desktop.

COMPONENTS TO INSTANTIATE
T01 List (17 screens)
  Title block 24/24/16/24, horizontal, hug. Page title, record count, one primary action right.
  Toolbar 56: search, filter trigger, column chooser, export.
  Filter chips row 32, absent when no filter applied.
  Table container filling, 24 side padding, horizontal scroll contained INSIDE it.
  Table header 40 sticky. Rows 44. Pagination footer 52.
  States: Default, Filtered, Empty-NoRecords, Empty-NoMatches, Loading, Error, PermissionRestricted

T02 Master Form (13 screens)
  Title block. Validation summary slot hidden until failed submit.
  Form scroll region, vertical, 24 between sections, 12 within a section.
  Field rows horizontal, two columns desktop, each field max 560.
  Audit metadata row at the foot, Body Small, text-secondary.
  Sticky action bar 72.
  States: Create, Edit, Dirty, ValidationError, DuplicateError, ServerError, ReadOnly,
          Loading, DeactivationBlocked, DeactivationWarning, ConcurrentUpdate

T03 Transaction (11 screens)
  Title block carrying a Status Badge.
  Header fields card: surface, 1px border, 8 radius, 16 padding.
  Line grid: Transaction/Line-Grid instance, 52 rows, expandable sub-panel slot.
  Totals region 320 wide, right-aligned, 16 above.
  Sticky action bar 72 carrying compact totals.
  States: BlankDraft, PopulatedDraft, LineError, ValidationSummary, SavedDraft,
          ApprovalEligible, ReadOnlyApproved, Loading, ConcurrentUpdate, PermissionRestricted

T04 Review (4 screens)
  Title block able to carry TWO Status Badges side by side.
  Status timeline 48 horizontal with a branch fork slot.
  Summary block: Definition List two-column, surface-sunken.
  Transaction chain row, hidden where no links exist.
  Read-only detail table. Totals region. Approval bar 72.
  States: AwaitingDecision, DecisionTaken, PartiallyActioned, BlockedByStatus,
          BlockedByPermission, ReturnedForCorrection, Reversed, AuditDrawerOpen,
          Loading, ConcurrentUpdate

T05 Dashboard (1 screen)
  Title block with Company and Plant context line.
  KPI grid: horizontal wrap, 24 gap, THREE cards per row, EXACTLY SIX cards.
  Quick actions row: EXACTLY THREE.
  States: Normal, Loading, PartialWidgetFailure, NoData, PermissionRestricted

T06 Report (13 screens)
  Title block with filter trigger and export.
  Scope line showing Company, Plant and date range - ALWAYS VISIBLE, never hidden.
  Filter chips row. Table container. Header 40 sticky.
  Totals row 44 pinned to the table foot. Pagination footer.
  States: Default, Filtered, NoData, Loading, ExportInProgress, ExportLimitExceeded,
          Error, PermissionRestricted

T07 Config (4 screens)
  Title block. Append-only Information Alert, NOT dismissible.
  History table, newest effective date first.
  Add panel hidden until Add is pressed, appearing inline above the table.
  CRITICAL: NO edit action on any row, in any state, under any permission.
  States: Default, Adding, ValidationError, ScopeOverride, Empty, Loading, PermissionRestricted

T08 Audit (1 screen plus a system-wide drawer)
  Full page: title, filter chips, event table newest first, expandable before/after detail.
  Drawer: 480 wide, elevation/3, Audit Timeline instead of a table.
  CRITICAL: NO edit and NO delete control in either form, in any state.
  States: Default, Filtered, DetailExpanded, Loading, Empty, ExportRestricted


AUTO LAYOUT
Follow the Auto Layout tables in Blueprint Section 11. Horizontal scroll belongs to a table container, never to the page.

STATES
Build every state listed per template. A state that only changes a value is not a separate state — it is an annotation.

INTERACTIONS
None. Templates are built, not wired.

RESPONSIVE
Build the desktop form. Annotate the tablet and mobile transformation rather than drawing three copies.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01, 02 and 03.

COMPLETION CHECKLIST
1. 8 templates exist as component sets on page 04.
2. Each has every state listed above.
3. T05 has exactly six KPI cards and three quick actions.
4. T07 has no edit action anywhere, in any state.
5. T08 has no edit and no delete control in either form.
6. Horizontal scroll is contained inside table containers, never the page.
7. Every template uses Auto Layout with variable-bound spacing.

STOP CONDITION
Stop after Pattern/T08-Audit. Do not build screen frames.
```

## P08 — Dashboard

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `05 — Dashboard`*

```
OBJECTIVE
Build the desktop frames for 1 screen(s) on page "05 — Dashboard". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
05 — Dashboard

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-DSH-SCR-001-View-Default` | View | Default | T05 | All six widgets loaded |
| `D-DSH-SCR-001-View-Loading` | View | Loading | T05 | Six KPI skeletons, quick actions enabled |
| `D-DSH-SCR-001-View-Error` | View | Error | T05 | One widget failed, five loaded |
| `D-DSH-SCR-001-View-Empty` | View | Empty | T05 | All widgets zero, neutral styling |
| `D-DSH-SCR-001-View-PermissionRestricted` | View | PermissionRestricted | T05 | A widget absent, grid reflowed |


COMPONENTS TO INSTANTIATE
DSH-SCR-001 — Dashboard  [template T05]
    Sections: KPI widgets — exactly six [Today's challans (count and total quantity); Today's invoices (count and total value); Unbilled challans (count); Reserved invoice numbers (count); Credit notes awaiting IRN (count); IRN recording failures (count)] | Quick actions — exactly three [Create challan; Create invoice; View reports]
    Filters: none
    Actions: Create challan (Quick action) · Create invoice (Quick action) · View reports (Quick action)
    Statuses: None. Counts only.
    Mobile card: One card per row, full width. Quick actions stacked at 44px.
    RULE: EXACTLY six widgets and three quick actions. Do not add a seventh widget, a chart or a welcome message. A widget the active role cannot see is absent and the grid reflows.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Exactly six KPI cards, no seventh, no chart, no welcome message.
2. Loading frame keeps quick actions ENABLED.
3. Error frame affects ONE card only; the other five render.
4. NoData frame uses NEUTRAL styling — zero is a valid business answer.
5. All 5 desktop frames exist with the exact names above.
6. Every frame is a template instance, not a recreation.
7. Every Status Badge carries a text label.
8. Permission-restricted frames REMOVE controls rather than disabling them.
9. Every disabled control carries a Disabled Reason.
10. Sample data matches the list above exactly.
11. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "05 — Dashboard". Do not build mobile frames, prototype links or any other module.
```

## P09 — Company and Plant masters

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `06 — Company & Plant`*

```
OBJECTIVE
Build the desktop frames for 4 screen(s) on page "06 — Company & Plant". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
06 — Company & Plant

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-CMP-SCR-001-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-CMP-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-CMP-SCR-001-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-CMP-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-CMP-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-CMP-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-CMP-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-CMP-SCR-002-Create-Default` | Create | Default | T02 | Empty form |
| `D-CMP-SCR-002-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-CMP-SCR-002-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-CMP-SCR-002-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-CMP-SCR-002-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-CMP-SCR-002-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-CMP-SCR-002-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-CMP-SCR-002-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-CMP-SCR-002-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-CMP-SCR-003-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-CMP-SCR-003-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-CMP-SCR-003-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-CMP-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-CMP-SCR-003-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-CMP-SCR-003-List-Error` | List | Error | T01 | Retrieval failed |
| `D-CMP-SCR-003-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-CMP-SCR-004-Create-Default` | Create | Default | T02 | Empty form |
| `D-CMP-SCR-004-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-CMP-SCR-004-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-CMP-SCR-004-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-CMP-SCR-004-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-CMP-SCR-004-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-CMP-SCR-004-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-CMP-SCR-004-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-CMP-SCR-004-Create-Loading` | Create | Loading | T02 | Form skeleton |


COMPONENTS TO INSTANTIATE
CMP-SCR-001 — Company List  [template T01]
    Columns: Company name (P1) · GSTIN (P1) · State (P2) · Timezone (P3) · Status (P1) · Actions (P1)
    Filters: Keyword search across name and GSTIN · Status: All / Active / Inactive
    Actions: Add Company (Primary) · Edit (Row menu) · Deactivate (Row menu, destructive) · View audit history (Row menu)
    Statuses: Active · Inactive
    Mobile card: Record card. Title = Company name. Status badge. Lines: GSTIN, State.
    RULE: UX-DEC-001 applies: deactivation is BLOCKED where active dependent transactions or mappings exist.

CMP-SCR-002 — Company Add / Edit  [template T02]
    Sections: Identification [Company name * (Text, 120); Legal name (Text, 160); Short code * (Text, 10, uppercase)] | Statutory details [GSTIN * (Code, 15, uppercase); PAN (Code, 10); State * (Searchable select); State code (Read-only, derived from State)] | Address [Address line 1 * (Text); Address line 2 (Text); City * (Text); PIN code * (Number, 6)] | Regional [Timezone * (Searchable select, default Asia/Kolkata); Currency (Read-only, INR)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column, inputs 48px, sticky footer 64px.
    RULE: Timezone drives statutory deadline evaluation under UX-DEC-005. Default Asia/Kolkata.

CMP-SCR-003 — Plant / Mapping List  [template T01]
    Columns: Plant name (P1) · Plant code (P1) · Type (P2) · Associated companies (P2) · Status (P1) · Actions (P1)
    Filters: Keyword search · Company association · Status
    Actions: Add Plant (Primary) · Edit (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Associations render as wrapped chips inside the card.
    RULE: A Plant may be shared across companies. Shared Plant in the demonstration dataset is Chakan Plant.

CMP-SCR-004 — Plant Add / Edit + Company Mapping  [template T02]
    Sections: Identification [Plant name * (Text, 120); Plant code * (Text, 10, uppercase); Plant type * (Radio: RMC / Crusher / Both)] | Address [Address line 1 * (Text); City * (Text); State * (Searchable select); PIN code * (Number, 6)] | Company association [Associated companies * (Multi-select, minimum one)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Multi-select opens a full-screen sheet.
    RULE: Removing a company association is blocked where transactions exist for that pairing.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. UX-DEC-001: deactivation is BLOCKED where active dependent transactions or mappings exist. Build BOTH the OV-12 Blocked dialog frame and the OV-13 Warning frame.
2. OV-12 has NO override and NO destructive action.
3. All 32 desktop frames exist with the exact names above.
4. Every frame is a template instance, not a recreation.
5. Every Status Badge carries a text label.
6. Permission-restricted frames REMOVE controls rather than disabling them.
7. Every disabled control carries a Disabled Reason.
8. Sample data matches the list above exactly.
9. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "06 — Company & Plant". Do not build mobile frames, prototype links or any other module.
```

## P10 — Clients and Vendors

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `07 — Clients & Vendors`*

```
OBJECTIVE
Build the desktop frames for 6 screen(s) on page "07 — Clients & Vendors". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
07 — Clients & Vendors

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-PTY-SCR-001-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-PTY-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-PTY-SCR-001-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-PTY-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-PTY-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-PTY-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-PTY-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-PTY-SCR-002-Create-Default` | Create | Default | T02 | Empty form |
| `D-PTY-SCR-002-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-PTY-SCR-002-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-PTY-SCR-002-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-PTY-SCR-002-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-PTY-SCR-002-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-PTY-SCR-002-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-PTY-SCR-002-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-PTY-SCR-002-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-PTY-SCR-003-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-PTY-SCR-003-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-PTY-SCR-003-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-PTY-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-PTY-SCR-003-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-PTY-SCR-003-List-Error` | List | Error | T01 | Retrieval failed |
| `D-PTY-SCR-003-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-PTY-SCR-004-Create-Default` | Create | Default | T02 | Empty form |
| `D-PTY-SCR-004-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-PTY-SCR-004-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-PTY-SCR-004-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-PTY-SCR-004-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-PTY-SCR-004-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-PTY-SCR-004-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-PTY-SCR-004-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-PTY-SCR-004-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-PTY-SCR-005-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-PTY-SCR-005-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-PTY-SCR-005-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-PTY-SCR-005-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-PTY-SCR-005-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-PTY-SCR-005-List-Error` | List | Error | T01 | Retrieval failed |
| `D-PTY-SCR-005-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-PTY-SCR-006-Create-Default` | Create | Default | T02 | Empty form |
| `D-PTY-SCR-006-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-PTY-SCR-006-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-PTY-SCR-006-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-PTY-SCR-006-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-PTY-SCR-006-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-PTY-SCR-006-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-PTY-SCR-006-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-PTY-SCR-006-Create-Loading` | Create | Loading | T02 | Form skeleton |


COMPONENTS TO INSTANTIATE
PTY-SCR-001 — Client List  [template T01]
    Columns: Client name (P1) · GSTIN (P1) · City (P2) · Sites (P3) · Status (P1) · Actions (P1)
    Filters: Keyword search across name and GSTIN · City · Status
    Actions: Add Client (Primary) · Edit (Row menu) · View sites (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Title = Client name. Lines: GSTIN, City.
    RULE: UX-DEC-002: blocked while open operational transactions exist; allowed with warning where only historical records exist.

PTY-SCR-002 — Client Add / Edit  [template T02]
    Sections: Identification [Client name * (Text, 120); Client code (Text, 10, uppercase)] | Statutory details [GSTIN * (Code, 15, uppercase); PAN (Code, 10); State * (Searchable select); Place of supply (Read-only, derived from State)] | Contact [Contact person (Text); Phone (Text, 10); Email (Text)] | Address [Address line 1 * (Text); City * (Text); PIN code * (Number, 6)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column, sticky footer.
    RULE: GSTIN uniqueness is validated per Company. A duplicate raises the duplicate-error state.

PTY-SCR-003 — Client Site List  [template T01]
    Columns: Site name (P1) · Parent client (P1) · City (P2) · Status (P1) · Actions (P1)
    Filters: Keyword search · Parent client · Status
    Actions: Add Site (Primary) · Edit (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Parent client shown as a persistent context line above the list, not repeated per card.
    RULE: Client Site is always selected from this master. It is never free text on a transaction.

PTY-SCR-004 — Client Site Add / Edit  [template T02]
    Sections: Parent [Client (Read-only, carried from the parent list)] | Identification [Site name * (Text, 120); Site code (Text, 10)] | Address [Address line 1 * (Text); City * (Text); PIN code * (Number, 6)] | Contact [Site contact (Text); Phone (Text, 10)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Parent client renders as a read-only summary row at the top.
    RULE: A site does not carry its own GSTIN. Statutory identity belongs to the parent Client.

PTY-SCR-005 — Vendor List  [template T01]
    Columns: Vendor name (P1) · GSTIN (P1) · City (P2) · Vehicles (P3) · Status (P1) · Actions (P1)
    Filters: Keyword search · City · Status
    Actions: Add Vendor (Primary) · Edit (Row menu) · View vehicles (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Title = Vendor name. Lines: GSTIN, City.
    RULE: Vendor is a separate master from Client even where the same real-world organisation appears in both.

PTY-SCR-006 — Vendor Add / Edit  [template T02]
    Sections: Identification [Vendor name * (Text, 120); Vendor code (Text, 10, uppercase)] | Statutory details [GSTIN * (Code, 15, uppercase); PAN (Code, 10); State * (Searchable select)] | Contact [Contact person (Text); Phone (Text, 10); Email (Text)] | Address [Address line 1 * (Text); City * (Text); PIN code * (Number, 6)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column, sticky footer.
    RULE: Vehicles associate to a Vendor and are managed on the Vehicles page.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. UX-DEC-002: blocked while OPEN OPERATIONAL transactions exist; allowed with warning where only historical records exist.
2. Client Site is always a master selection, never free text.
3. All 48 desktop frames exist with the exact names above.
4. Every frame is a template instance, not a recreation.
5. Every Status Badge carries a text label.
6. Permission-restricted frames REMOVE controls rather than disabling them.
7. Every disabled control carries a Disabled Reason.
8. Sample data matches the list above exactly.
9. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "07 — Clients & Vendors". Do not build mobile frames, prototype links or any other module.
```

## P11 — Products, Units and Recipes

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `08 — Products, Units & Recipes`*

```
OBJECTIVE
Build the desktop frames for 5 screen(s) on page "08 — Products, Units & Recipes". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
08 — Products, Units & Recipes

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-PRD-SCR-001-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-PRD-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-PRD-SCR-001-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-PRD-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-PRD-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-PRD-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-PRD-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-PRD-SCR-002-Create-Default` | Create | Default | T02 | Empty form |
| `D-PRD-SCR-002-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-PRD-SCR-002-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-PRD-SCR-002-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-PRD-SCR-002-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-PRD-SCR-002-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-PRD-SCR-002-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-PRD-SCR-002-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-PRD-SCR-002-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-PRD-SCR-003-Create-Default` | Create | Default | T02 | Empty form |
| `D-PRD-SCR-003-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-PRD-SCR-003-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-PRD-SCR-003-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-PRD-SCR-003-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-PRD-SCR-003-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-PRD-SCR-003-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-PRD-SCR-003-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-PRD-SCR-003-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-PRD-SCR-004-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-PRD-SCR-004-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-PRD-SCR-004-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-PRD-SCR-004-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-PRD-SCR-004-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-PRD-SCR-004-List-Error` | List | Error | T01 | Retrieval failed |
| `D-PRD-SCR-004-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-RCP-SCR-001-Create-Default` | Create | Default | T02 | Empty form |
| `D-RCP-SCR-001-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-RCP-SCR-001-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-RCP-SCR-001-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-RCP-SCR-001-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-RCP-SCR-001-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-RCP-SCR-001-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-RCP-SCR-001-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-RCP-SCR-001-Create-Loading` | Create | Loading | T02 | Form skeleton |


COMPONENTS TO INSTANTIATE
PRD-SCR-001 — Product List  [template T01]
    Columns: Product name (P1) · Classification (P1) · Unit (P2) · GST rate (P2) · Shelf life (days) (P3) · Status (P1) · Actions (P1)
    Filters: Keyword search · Classification: Finished Product / Raw Material · Unit · Status
    Actions: Add Product (Primary) · Edit (Row menu) · View recipe (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Lines: Classification, Unit.
    RULE: UX-DEC-003: deactivation is BLOCKED where available stock, open allocations, or open operational transactions exist.

PRD-SCR-002 — Product Add / Edit  [template T02]
    Sections: Identification [Product name * (Text, 120); Product code * (Text, 20, uppercase); Classification * (Radio: Finished Product / Raw Material)] | Measurement [Unit * (Searchable select); Decimal precision * (Number, default 3)] | Statutory [HSN code (Code, 8); GST rate * (Percentage, default 18.00)] | Inventory [Shelf life in days (Number); Track by lot (Read-only, always Yes in Phase 1)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column.
    RULE: Shelf life drives SYSTEM_EXPIRY wastage generation. Changing it does not retrospectively re-age existing lots.

PRD-SCR-003 — Raw Material Add / Edit  [template T02]
    Sections: Identification [Material name * (Text, 120); Material code * (Text, 20); Classification (Read-only, fixed to Raw Material)] | Measurement [Unit * (Searchable select); Decimal precision * (Number, default 3)] | Statutory [HSN code (Code, 8); GST rate * (Percentage)] | Inventory [Shelf life in days (Number)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column.
    RULE: Shares the Product table. Classification is fixed and rendered read-only.

PRD-SCR-004 — Unit List and Add / Edit  [template T01]
    Columns: Unit name (P1) · Symbol (P1) · Decimal precision (P2) · Status (P1) · Actions (P1)
    Filters: Keyword search · Status
    Actions: Add Unit (Primary) · Edit (Inline panel) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Add and edit open a full-screen sheet.
    RULE: Add and edit use an inline panel above the table rather than a separate route.

RCP-SCR-001 — Recipe Definition  [template T02]
    Sections: Output [Finished product * (Searchable select); Output quantity * (Quantity, per batch); Effective from * (Date)] | Components [Editable line grid: Raw material * · Consumption quantity * · Unit (read-only) · Remove] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Add component (Tertiary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Components become line cards.
    RULE: The recipe drives raw-material consumption on Plant Production Inward (INW-SCR-002).

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. UX-DEC-003: blocked where available stock, open allocations or open operational transactions exist. A stock dependency states a QUANTITY with its unit, not a row count.
2. All 41 desktop frames exist with the exact names above.
3. Every frame is a template instance, not a recreation.
4. Every Status Badge carries a text label.
5. Permission-restricted frames REMOVE controls rather than disabling them.
6. Every disabled control carries a Disabled Reason.
7. Sample data matches the list above exactly.
8. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "08 — Products, Units & Recipes". Do not build mobile frames, prototype links or any other module.
```

## P12 — Vehicles

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `09 — Vehicles`*

```
OBJECTIVE
Build the desktop frames for 4 screen(s) on page "09 — Vehicles". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
09 — Vehicles

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-VEH-SCR-001-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-VEH-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-VEH-SCR-001-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-VEH-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-VEH-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-VEH-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-VEH-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-VEH-SCR-002-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-VEH-SCR-002-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-VEH-SCR-002-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-VEH-SCR-002-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-VEH-SCR-002-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-VEH-SCR-002-List-Error` | List | Error | T01 | Retrieval failed |
| `D-VEH-SCR-002-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-VEH-SCR-003-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-VEH-SCR-003-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-VEH-SCR-003-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-VEH-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-VEH-SCR-003-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-VEH-SCR-003-List-Error` | List | Error | T01 | Retrieval failed |
| `D-VEH-SCR-003-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-VEH-SCR-004-Create-Default` | Create | Default | T02 | Empty form |
| `D-VEH-SCR-004-Edit-Default` | Edit | Default | T02 | Populated record |
| `D-VEH-SCR-004-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-VEH-SCR-004-Edit-Draft` | Edit | Draft | T02 | Dirty state, unsaved changes |
| `D-VEH-SCR-004-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-VEH-SCR-004-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-VEH-SCR-004-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Deactivation blocked by dependencies |
| `D-VEH-SCR-004-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Record changed by another user |
| `D-VEH-SCR-004-Create-Loading` | Create | Loading | T02 | Form skeleton |


COMPONENTS TO INSTANTIATE
VEH-SCR-001 — Vehicle Selection View  [template T01]
    Columns: Vehicle number (P1) · Vendor (P1) · Capacity (P2) · Status (P1)
    Filters: Keyword search on vehicle number · Vendor · Status: Active only by default
    Actions: Select (Row click, returns to caller)
    Statuses: Active · Inactive
    Mobile card: Full-screen selection sheet with a pinned search field.
    RULE: READ-ONLY. This screen has NO Add and NO Edit form. It reads from the Vendor master. Do not build a creation route here.

VEH-SCR-002 — Vehicle List  [template T01]
    Columns: Vehicle number (P1) · Vendor (P1) · Capacity (P2) · Status (P1) · Actions (P1)
    Filters: Keyword search · Vendor · Status
    Actions: Add Vehicle (Primary) · Edit (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Title = Vehicle number.
    RULE: Vehicle numbers are uppercase with no spaces.

VEH-SCR-003 — Vendor Vehicle List  [template T01]
    Columns: Vehicle number (P1) · Capacity (P1) · Status (P1) · Actions (P1)
    Filters: Keyword search · Status
    Actions: Add Vehicle (Primary) · Edit (Row menu) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Parent vendor is a persistent context line above the list.
    RULE: Scoped view of VEH-SCR-002 reached from the vendor detail.

VEH-SCR-004 — Vehicle Add / Edit  [template T02]
    Sections: Identification [Vehicle number * (Text, 12, uppercase, no spaces); Vehicle type (Searchable select)] | Association [Vendor * (Searchable select)] | Capacity [Capacity (Quantity); Unit (Read-only, derived from the capacity basis)] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Single column.
    RULE: Item 16 may later add an own-fleet indicator. One additional field, no relayout.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. VEH-SCR-001 is READ-ONLY. It has NO Add and NO Edit route. Do not build a creation form for it.
2. All 30 desktop frames exist with the exact names above.
3. Every frame is a template instance, not a recreation.
4. Every Status Badge carries a text label.
5. Permission-restricted frames REMOVE controls rather than disabling them.
6. Every disabled control carries a Disabled Reason.
7. Sample data matches the list above exactly.
8. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "09 — Vehicles". Do not build mobile frames, prototype links or any other module.
```

## P13 — Rates, Charges and Statutory

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `10 — Rates & Charges`*

```
OBJECTIVE
Build the desktop frames for 4 screen(s) on page "10 — Rates & Charges". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
10 — Rates & Charges

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-PRC-SCR-001-Configure-Default` | Configure | Default | T07 | History, newest effective first |
| `D-PRC-SCR-001-Configure-Draft` | Configure | Draft | T07 | Add panel open inline above the history |
| `D-PRC-SCR-001-Configure-Error` | Configure | Error | T07 | Overlapping effective date rejected |
| `D-PRC-SCR-001-Configure-Empty` | Configure | Empty | T07 | No configuration yet |
| `D-PRC-SCR-001-Configure-Loading` | Configure | Loading | T07 | Row skeletons |
| `D-PRC-SCR-001-Configure-PermissionRestricted` | Configure | PermissionRestricted | T07 | Role without create |
| `D-PRC-SCR-002-Configure-Default` | Configure | Default | T07 | History, newest effective first |
| `D-PRC-SCR-002-Configure-Draft` | Configure | Draft | T07 | Add panel open inline above the history |
| `D-PRC-SCR-002-Configure-Error` | Configure | Error | T07 | Overlapping effective date rejected |
| `D-PRC-SCR-002-Configure-Empty` | Configure | Empty | T07 | No configuration yet |
| `D-PRC-SCR-002-Configure-Loading` | Configure | Loading | T07 | Row skeletons |
| `D-PRC-SCR-002-Configure-PermissionRestricted` | Configure | PermissionRestricted | T07 | Role without create |
| `D-ACH-SCR-001-Configure-Default` | Configure | Default | T07 | History, newest effective first |
| `D-ACH-SCR-001-Configure-Draft` | Configure | Draft | T07 | Add panel open inline above the history |
| `D-ACH-SCR-001-Configure-Error` | Configure | Error | T07 | Overlapping effective date rejected |
| `D-ACH-SCR-001-Configure-Empty` | Configure | Empty | T07 | No configuration yet |
| `D-ACH-SCR-001-Configure-Loading` | Configure | Loading | T07 | Row skeletons |
| `D-ACH-SCR-001-Configure-PermissionRestricted` | Configure | PermissionRestricted | T07 | Role without create |
| `D-STAT-SCR-001-Configure-Default` | Configure | Default | T07 | History, newest effective first |
| `D-STAT-SCR-001-Configure-Draft` | Configure | Draft | T07 | Add panel open inline above the history |
| `D-STAT-SCR-001-Configure-Error` | Configure | Error | T07 | Overlapping effective date rejected |
| `D-STAT-SCR-001-Configure-Empty` | Configure | Empty | T07 | No configuration yet |
| `D-STAT-SCR-001-Configure-Loading` | Configure | Loading | T07 | Row skeletons |
| `D-STAT-SCR-001-Configure-PermissionRestricted` | Configure | PermissionRestricted | T07 | Role without create |


COMPONENTS TO INSTANTIATE
PRC-SCR-001 — Universal Rate Configuration  [template T07]
    Columns: Effective from (P1) · Product (P1) · Rate (P1) · Scope (P2) · Added by (P3) · Added on (P3)
    Filters: Product · Effective date range · Show superseded
    Actions: Add rate (Primary)
    Statuses: Currently effective · Superseded · Future dated
    Mobile card: Record card. Add opens a full-screen sheet.
    RULE: APPEND-ONLY. There is NO edit action on any row, in any state, under any permission. To change a rate, add a replacement with a new effective date.

PRC-SCR-002 — Company-Specific Rate Configuration  [template T07]
    Columns: Effective from (P1) · Client (P1) · Product (P1) · Rate (P1) · Added by (P3)
    Filters: Client · Product · Effective date range · Show superseded
    Actions: Add rate (Primary)
    Statuses: Currently effective · Superseded · Future dated
    Mobile card: Record card grouped by client.
    RULE: APPEND-ONLY, as PRC-SCR-001. A company-specific rate takes precedence over a universal rate for the same product and date.

ACH-SCR-001 — Additional Charge Configuration  [template T07]
    Columns: Charge name (P1) · Classification (P1) · Default calculation (P2) · Default value (P2) · Status (P1) · Actions (P1)
    Filters: Keyword search · Classification · Status
    Actions: Add charge (Primary) · Edit (Inline panel) · Deactivate (Row menu, destructive)
    Statuses: Active · Inactive
    Mobile card: Record card. Inline panel becomes a sheet.
    RULE: Classification distinguishes Discount from Ordinary Positive Charge. An Ordinary Positive Charge may not be entered as a percentage.

STAT-SCR-001 — Statutory Deadline Configuration  [template T07]
    Columns: Deadline type (P1) · Basis (P1) · Offset (P2) · Timezone (P1) · Effective from (P2)
    Filters: Deadline type · Show superseded
    Actions: Add configuration (Primary)
    Statuses: Currently effective · Superseded
    Mobile card: Record card. Timezone is never truncated.
    RULE: UX-DEC-004: the block applies when current_datetime >= calculated_deadline, so the exact deadline instant is NOT eligible. UX-DEC-005: timestamps stored UTC, evaluated and displayed in the Company timezone, default Asia/Kolkata, label always shown.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. PRC-SCR-001 and PRC-SCR-002 use T07 and have NO edit action on any row.
2. STAT-SCR-001 shows the deadline as an exact instant with a MANDATORY timezone label. Never a day count.
3. All 24 desktop frames exist with the exact names above.
4. Every frame is a template instance, not a recreation.
5. Every Status Badge carries a text label.
6. Permission-restricted frames REMOVE controls rather than disabling them.
7. Every disabled control carries a Disabled Reason.
8. Sample data matches the list above exactly.
9. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "10 — Rates & Charges". Do not build mobile frames, prototype links or any other module.
```

## P14 — Material Inward

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `11 — Material Inward`*

```
OBJECTIVE
Build the desktop frames for 4 screen(s) on page "11 — Material Inward". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
11 — Material Inward

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INW-SCR-001-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-INW-SCR-001-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INW-SCR-001-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INW-SCR-001-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INW-SCR-001-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INW-SCR-001-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INW-SCR-001-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INW-SCR-001-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INW-SCR-001-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-INW-SCR-002-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-INW-SCR-002-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INW-SCR-002-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INW-SCR-002-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INW-SCR-002-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INW-SCR-002-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INW-SCR-002-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INW-SCR-002-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INW-SCR-002-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-INW-SCR-003-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-INW-SCR-003-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INW-SCR-003-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INW-SCR-003-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INW-SCR-003-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INW-SCR-003-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INW-SCR-003-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INW-SCR-003-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INW-SCR-003-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-INW-SCR-005-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-INW-SCR-005-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-INW-SCR-005-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-INW-SCR-005-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-INW-SCR-005-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-INW-SCR-005-List-Error` | List | Error | T01 | Retrieval failed |
| `D-INW-SCR-005-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |


COMPONENTS TO INSTANTIATE
INW-SCR-001 — Vendor Inward Entry  [template T03]
    Sections: Source [Vendor * (Searchable select); Vendor document number * (Text, 40); Vendor document date * (Date)] | Receipt [Received date * (Date, defaults to today); Vehicle (Searchable select, optional)] | Lines [Editable line grid: # · Raw material * · Quantity * · Unit (read-only) · Remarks · Remove] | Totals [Line count (derived); Total quantity by unit (derived)]
    Filters: none
    Actions: Save (Primary) · Add line (Tertiary) · Cancel (Secondary)
    Statuses: None. Inward posts directly on Save with no approval step and no status badge.
    Mobile card: Line cards. Collapsed shows material and quantity.
    RULE: Posts DIRECTLY to inventory on Save. Reference format is a placeholder pending OD-B3-04. No duplicate-document warning is drawn pending OD-B3-05.

INW-SCR-002 — Plant Production Inward  [template T03]
    Sections: Production [Finished product * (Searchable select); Produced quantity * (Quantity); Production date * (Date, defaults to today); Batch reference (Text, 40)] | Recipe consumption [Read-only derived grid: Raw material · Consumption per batch · Total consumption · Available balance] | Totals [Total raw material consumed by unit (derived)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: None. Posts directly on Save.
    Mobile card: Consumption grid becomes read-only cards.
    RULE: Consumption is derived from the active recipe and is not independently editable. This source type has no Cancel permission — OD-B3-06 governs its reversal path.

INW-SCR-003 — Opening Stock Entry  [template T03]
    Sections: Cutover [As-at date * (Date, restricted range with a stated reason when out of range)] | Lines [Editable line grid: # · Material * · Quantity * · Unit (read-only) · Lot reference · Remove] | Totals [Line count (derived); Total quantity by unit (derived)]
    Filters: none
    Actions: Save (Primary) · Add line (Tertiary) · Cancel (Secondary)
    Statuses: None. Posts directly on Save.
    Mobile card: Line cards.
    RULE: A one-time cutover entry. The date field carries a restricted range; out-of-range entry states the cutover reason.

INW-SCR-005 — Inward Register and Reversal  [template T01]
    Columns: Reference (P1) · Date (P1) · Source type (P1) · Counterparty (P2) · Lines (P3) · Total quantity (P1) · Reversal (P2) · Actions (P1)
    Filters: Date range · Source type: Vendor / Production / Opening Stock / Return · Material · Counterparty · Reversal state
    Actions: View (Row click) · Reverse (Row menu, destructive) · View audit history (Row menu)
    Statuses: Reversed · Not reversed
    Mobile card: Record card. Lines: date, source type, total quantity.
    RULE: All four inward source types appear here. Reverse is disabled where the inward is allocated to a challan, naming the consuming document.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. These three inward types post DIRECTLY on Save. No approval step, no status badge.
2. Do NOT draw a duplicate-document warning — OD-B3-05 is unanswered.
3. Reverse is disabled where the inward is allocated, naming the consuming challan.
4. All 34 desktop frames exist with the exact names above.
5. Every frame is a template instance, not a recreation.
6. Every Status Badge carries a text label.
7. Permission-restricted frames REMOVE controls rather than disabling them.
8. Every disabled control carries a Disabled Reason.
9. Sample data matches the list above exactly.
10. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "11 — Material Inward". Do not build mobile frames, prototype links or any other module.
```

## P15 — Material Return and Recovery

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `11 — Material Inward`*

```
OBJECTIVE
Build the desktop frames for 1 screen(s) on page "11 — Material Inward". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
11 — Material Inward

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INW-SCR-004-Create-Default` | Create | Default | T03 | Reusable return, routing to available inventory |
| `D-INW-SCR-004-Create-Draft` | Create | Draft | T03 | Not reusable, expired, routed to wastage |
| `D-INW-SCR-004-Create-PendingApproval` | Create | PendingApproval | T03 | Saved, awaiting return approval |
| `D-INW-SCR-004-Create-Approved` | Create | Approved | T03 | Approved, reusable quantity now Available |
| `D-INW-SCR-004-Create-ReturnedForCorrection` | Create | ReturnedForCorrection | T03 | Returned to creator with a reason |
| `D-INW-SCR-004-Create-Error` | Create | Error | T03 | Returned quantity exceeds despatched |
| `D-INW-SCR-004-Create-PermissionRestricted` | Create | PermissionRestricted | T03 | Creator without approval permission, reusability control absent |
| `D-INW-SCR-004-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INW-SCR-004-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INW-SCR-004-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INW-SCR-004-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INW-SCR-004-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INW-SCR-004-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |


COMPONENTS TO INSTANTIATE
INW-SCR-004 — Material Return / Recovery Entry  [template T03]
    Sections: Source [Source document (Read-only: challan or disposition reference); Product (Read-only); Despatched quantity (Read-only)] | Return [Returned quantity * (Quantity, validated against despatched); Return date * (Date)] | Quality decision [Reusable * (Radio: Reusable / Not reusable) — visible only where the active role holds Return — Approve; Reason (Searchable select, required when Not reusable)] | Routing [Routing * (Radio: Return to available inventory / Route to wastage)] | Evidence [Optional attachment region (image or PDF)]
    Filters: none
    Actions: Save (Primary) · Approve Return (Secondary, same page) · Return for Correction (Tertiary) · Cancel (Secondary)
    Statuses: Draft · Pending Approval · Approved · Returned for Correction
    Mobile card: Radio options full width at 44px. Quantity summary pins above the sticky bar.
    RULE: UX-DEC-006: the authorised approver decides reusability; an unauthorised creator cannot confirm it. UX-DEC-007: approval is REQUIRED before reusable quantity enters Available inventory. Approve Return appears on the same page when permitted. Creator self-approval is allowed where their active role holds Return — Approve.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. UX-DEC-007: approval is REQUIRED before reusable quantity enters Available inventory.
2. Approve Return sits on the SAME PAGE via C-OPS-13 Return Approval Bar. Do not build a separate review screen.
3. UX-DEC-006: the Reusable control is rendered ONLY where the active role holds Return — Approve. Build both the present and the absent frame.
4. All 13 desktop frames exist with the exact names above.
5. Every frame is a template instance, not a recreation.
6. Every Status Badge carries a text label.
7. Permission-restricted frames REMOVE controls rather than disabling them.
8. Every disabled control carries a Disabled Reason.
9. Sample data matches the list above exactly.
10. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "11 — Material Inward". Do not build mobile frames, prototype links or any other module.
```

## P16 — Rejection and Disposition

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `12 — Rejection & Disposition`*

```
OBJECTIVE
Build the desktop frames for 3 screen(s) on page "12 — Rejection & Disposition". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
12 — Rejection & Disposition

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-DSP-SCR-001-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-DSP-SCR-001-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-DSP-SCR-001-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-DSP-SCR-001-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-DSP-SCR-001-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-DSP-SCR-001-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-DSP-SCR-001-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-DSP-SCR-001-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-DSP-SCR-001-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-DSP-SCR-002-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-DSP-SCR-002-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-DSP-SCR-002-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-DSP-SCR-002-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-DSP-SCR-002-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-DSP-SCR-002-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-DSP-SCR-002-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-DSP-SCR-002-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-DSP-SCR-002-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-DSP-SCR-003-Review-Default` | Review | Default | T04 | Pending, 12.000 MT undisposed |
| `D-DSP-SCR-003-Review-Draft` | Review | Draft | T04 | Partial reassignment 7.000, 5.000 undisposed |
| `D-DSP-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Partial return 3.000 added, 2.000 undisposed |
| `D-DSP-SCR-003-Review-Approved` | Review | Approved | T04 | Fully disposed, reconciliation satisfied |
| `D-DSP-SCR-003-Review-Error` | Review | Error | T04 | DSP-ERR-017, sum exceeds rejected by 3.000 MT |
| `D-DSP-SCR-003-Review-PermissionRestricted` | Review | PermissionRestricted | T04 | Reassignment path absent for Store Keeper |
| `D-DSP-SCR-003-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T04 | Returned with a reason banner |
| `D-DSP-SCR-003-Review-Reversed` | Review | Reversed | T04 | Reversed, compensating movement shown |
| `D-DSP-SCR-003-Review-Loading` | Review | Loading | T04 | Summary and timeline skeletons |
| `D-DSP-SCR-003-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T04 | Changed by another user |


COMPONENTS TO INSTANTIATE
DSP-SCR-001 — Customer Rejection Entry  [template T03]
    Sections: Source [Source challan * (Searchable select); Client (Read-only, derived); Product (Read-only, derived); Despatched quantity (Read-only)] | Rejection [Rejected quantity * (Quantity, validated against despatched); Rejection date * (Date); Rejection reason * (Searchable select); Remarks (Text area)] | Quantity chain [Quantity Summary: Despatched · Rejected · Accepted (derived)]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Pending Disposition
    Mobile card: Quantity Summary pins above the sticky bar.
    RULE: Saving creates a rejection awaiting disposition. No inventory movement occurs at this point.

DSP-SCR-002 — Rejection Reassignment Entry  [template T03]
    Sections: Source [Rejection reference (Read-only); Product (Read-only); Available for disposition (Read-only)] | Reassignment [Replacement client * (Searchable select); Replacement client site * (Searchable select, dependent on client); Reassigned quantity * (Quantity); Reassignment date * (Date)] | Exclusivity [Warning alert stating that reassigned quantity cannot also be returned or wasted]
    Filters: none
    Actions: Save (Primary) · Cancel (Secondary)
    Statuses: Reassigned
    Mobile card: Client and site selection open full-screen sheets.
    RULE: DSP-ERR-018 fires where client or site is omitted. The exclusive-disposition rule is enforced by the parent DSP-SCR-003 panel.

DSP-SCR-003 — Disposition Resolution  [template T04]
    Sections: Rejection summary [Rejection reference (Read-only); Source challan (Read-only); Product (Read-only); Rejected quantity (Read-only)] | Disposition paths [Return to availability — quantity input, visible only with Disposition — Return; Reassignment — quantity input plus client and site, visible only with Disposition — Reassign; Wastage — quantity input plus reason, visible only with Disposition — Wastage] | Reconciliation [Quantity Summary: Rejected · Dispositioned · Undisposed (live derived)]
    Filters: none
    Actions: Save disposition (Primary) · Cancel (Secondary)
    Statuses: Pending Disposition · Partially Disposed · Fully Disposed
    Mobile card: Paths stack. Quantity Summary pins above the sticky bar.
    RULE: THE EXCLUSIVE-DISPOSITION RULE: one unit of quantity travels down exactly one path. A path the active role lacks permission for is ABSENT, not disabled. DSP-ERR-017 fires when the sum exceeds the rejected quantity.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. The three disposition paths are MUTUALLY EXCLUSIVE per unit of quantity.
2. A path the role lacks permission for is ABSENT — no row, no label, no disabled control. The PermissionRestricted frame must be visibly SHORTER than the Default frame.
3. DSP-ERR-017 names all three quantities.
4. All 28 desktop frames exist with the exact names above.
5. Every frame is a template instance, not a recreation.
6. Every Status Badge carries a text label.
7. Permission-restricted frames REMOVE controls rather than disabling them.
8. Every disabled control carries a Disabled Reason.
9. Sample data matches the list above exactly.
10. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "12 — Rejection & Disposition". Do not build mobile frames, prototype links or any other module.
```

## P17 — Wastage

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `13 — Wastage`*

```
OBJECTIVE
Build the desktop frames for 3 screen(s) on page "13 — Wastage". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
13 — Wastage

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-WST-SCR-001-List-Default` | List | Default | T01 | User and SYSTEM_EXPIRY rows together, Origin column distinguishes them |
| `D-WST-SCR-001-Create-Default` | Create | Default | T01 | Blank entry, evidence region empty |
| `D-WST-SCR-001-Create-Draft` | Create | Draft | T01 | Populated with one evidence attachment uploaded |
| `D-WST-SCR-001-Create-Error` | Create | Error | T01 | Quantity exceeds the available balance |
| `D-WST-SCR-001-List-Filtered` | List | Filtered | T01 | Filtered to SYSTEM origin only |
| `D-WST-SCR-001-List-Empty` | List | Empty | T01 | No wastage recorded yet |
| `D-WST-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-WST-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Record wastage absent |
| `D-WST-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-WST-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-WST-SCR-002-Review-PendingApproval` | Review | PendingApproval | T04 | Awaiting approval, evidence attached |
| `D-WST-SCR-002-Review-Approved` | Review | Approved | T04 | Approved, inventory reduced |
| `D-WST-SCR-002-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T04 | Returned with a reason banner |
| `D-WST-SCR-002-Review-Cancelled` | Review | Cancelled | T04 | SYSTEM_EXPIRY row, actor SYSTEM, no Approve action |
| `D-WST-SCR-002-Review-Loading` | Review | Loading | T04 | Summary skeleton |
| `D-WST-SCR-002-Review-PermissionRestricted` | Review | PermissionRestricted | T04 | Approve absent for a role without the permission |
| `D-WST-SCR-002-Review-Reversed` | Review | Reversed | T04 | Reversed, compensating movement shown |
| `D-WST-SCR-002-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T04 | Changed by another user |
| `D-WST-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Awaiting a decision |
| `D-WST-SCR-003-Review-Approved` | Review | Approved | T04 | Read-only approved record |
| `D-WST-SCR-003-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T04 | Returned with a reason banner |
| `D-WST-SCR-003-Review-Reversed` | Review | Reversed | T04 | Reversed, compensating movement shown |
| `D-WST-SCR-003-Review-Loading` | Review | Loading | T04 | Summary and timeline skeletons |
| `D-WST-SCR-003-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T04 | Changed by another user |
| `D-WST-SCR-003-Review-PermissionRestricted` | Review | PermissionRestricted | T04 | Decision actions absent |


COMPONENTS TO INSTANTIATE
WST-SCR-001 — Wastage Register and Entry  [template T01]
    Columns: Reference (P1) · Date (P1) · Material (P1) · Quantity (P1) · Reason (P2) · Origin (P2) · Status (P1) · Actions (P1)
    Filters: Date range · Material · Reason · Origin: User / System · Status
    Actions: Record wastage (Primary) · View (Row click) · View audit history (Row menu)
    Statuses: Draft · Pending Approval · Approved · Returned for Correction · Reversed
    Mobile card: Record card. Lines: date, material, quantity, reason.
    RULE: The Origin column distinguishes user-recorded rows from SYSTEM_EXPIRY rows. UX-DEC-008: evidence attachment is OPTIONAL and never blocks approval.

WST-SCR-002 — Wastage Review and Approval  [template T04]
    Sections: Summary [Reference (Read-only); Material (Read-only); Quantity (Read-only); Reason (Read-only); Origin (Read-only); Raised by and on (Read-only)] | Evidence [Attachment list with preview, read-only after approval] | Effect notice [Information alert: inventory reduces on approval, not before]
    Filters: none
    Actions: Approve (Primary) · Return for Correction (Secondary) · View audit history (Tertiary)
    Statuses: Pending Approval · Approved · Returned for Correction
    Mobile card: Timeline vertical. Actions in a sticky footer.
    RULE: INVENTORY REDUCES ONLY AT APPROVAL. SYSTEM_EXPIRY rows insert directly at Approved with actor SYSTEM and carry no Approve action.

WST-SCR-003 — Wastage Reversal  [template T04]
    Sections: Summary [Reference (Read-only); Material and quantity (Read-only); Approved by and on (Read-only); Source lot to be restored (Read-only)] | Reversal [Mandatory reason (captured in the dialog, not inline)]
    Filters: none
    Actions: Reverse wastage (Destructive) · View audit history (Tertiary)
    Statuses: Approved · Reversed
    Mobile card: Reason dialog becomes a full-screen sheet.
    RULE: The dialog names the EXACT source lot restored. A second reversal is blocked — the control is present, disabled, with its reason.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Inventory reduces ONLY at approval, never at entry.
2. UX-DEC-008: evidence is OPTIONAL and never blocks approval. Build the upload, progress, preview and read-only states.
3. SYSTEM_EXPIRY rows insert directly at Approved with actor SYSTEM and carry NO Approve action.
4. A second reversal is blocked — the control is present, disabled, with its reason.
5. All 25 desktop frames exist with the exact names above.
6. Every frame is a template instance, not a recreation.
7. Every Status Badge carries a text label.
8. Permission-restricted frames REMOVE controls rather than disabling them.
9. Every disabled control carries a Disabled Reason.
10. Sample data matches the list above exactly.
11. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "13 — Wastage". Do not build mobile frames, prototype links or any other module.
```

## P18 — Challans

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `14 — Challans`*

```
OBJECTIVE
Build the desktop frames for 2 screen(s) on page "14 — Challans". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
14 — Challans

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-CHL-SCR-001-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-CHL-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-CHL-SCR-001-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-CHL-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-CHL-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-CHL-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-CHL-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-CHL-SCR-002-Create-Default` | Create | Default | T03 | Blank draft, invoice toggle off |
| `D-CHL-SCR-002-Create-Draft` | Create | Draft | T03 | Two lines, invoice toggle off |
| `D-CHL-SCR-002-Create-PendingApproval` | Create | PendingApproval | T03 | Invoice section revealed, all fields live |
| `D-CHL-SCR-002-Create-Approved` | Create | Approved | T03 | FIFO allocation suggested, both lots marked Suggested |
| `D-CHL-SCR-002-Create-ReturnedForCorrection` | Create | ReturnedForCorrection | T03 | Allocation manually modified, both lots marked Modified |
| `D-CHL-SCR-002-Create-Error` | Create | Error | T03 | Insufficient quantity, CHL-ERR-004 shown |
| `D-CHL-SCR-002-Review-Approved` | Review | Approved | T03 | Challan approved, invoice still Draft, user stays on page |
| `D-CHL-SCR-002-Review-PendingApproval` | Review | PendingApproval | T03 | Invoice submitted, Billing Clerk view, Approve Invoice absent |
| `D-CHL-SCR-002-Review-IRNFailed` | Review | IRNFailed | T03 | Invoice approval failed, challan badge still APPROVED |
| `D-CHL-SCR-002-Review-IRNGenerated` | Review | IRNGenerated | T03 | Both approved, transaction chain shown |
| `D-CHL-SCR-002-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Invoice returned with reason banner and changed markers |
| `D-CHL-SCR-002-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | CHL-ERR-022, stock changed after allocation |
| `D-CHL-SCR-002-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-CHL-SCR-002-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |


COMPONENTS TO INSTANTIATE
CHL-SCR-001 — Challan List  [template T01]
    Columns: Challan number (P1) · Date (P1) · Client (P1) · Client site (P3) · Vehicle (P3) · Total quantity (P1) · Challan status (P1) · Invoice status (P2) · Actions (P1)
    Filters: Date range · Client · Client site · Challan status · Invoice status · Vehicle
    Actions: Create challan (Primary) · View (Row click) · View audit history (Row menu)
    Statuses: Draft · Approved · Unbilled · Billed
    Mobile card: Record card carrying BOTH status badges. Lines: date, client, total quantity.
    RULE: Two independent status columns. A challan may be Approved while its invoice is still Draft.

CHL-SCR-002 — Challan Create / Review with Immediate Invoice  [template T03 then T04]
    Sections: Challan header [Client * (Searchable select); Client site (Searchable select, dependent; hidden where the client has no sites); Vehicle * (Searchable select from VEH-SCR-001); Challan date * (Date, defaults to today)] | Challan lines [Editable line grid: # · Product * · Quantity * · Unit (read-only) · Allocation summary · Remove; Each line expands to the Inward Allocation Panel] | Invoice toggle [Also prepare invoice on this page (Checkbox). When off the entire invoice section is NOT RENDERED.] | Invoice header [Invoice date * (Date); Invoice number (Read-only, assigned on approval); Use a reserved invoice number (Checkbox plus reservation selector)] | Invoice lines [Read-only mirror of the challan lines, one to one, plus Rate * and Rate Resolution Indicator and derived Amount] | Discount and additional charges [Charge grid: Charge * · Type · Value · Amount (derived) · Remove] | Totals [Calculation Summary in the fixed order defined in Section 12]
    Filters: none
    Actions: Save draft (Secondary) · Approve Challan (Primary) · Approve Invoice (Secondary) · Return for Correction (Tertiary) · Cancel (Secondary)
    Statuses: Challan: Draft, Approved · Invoice: Draft, Pending Approval, Returned for Correction, Approved, Pending IRN
    Mobile card: Line cards. Allocation opens a full-screen sheet. Calculation Summary pins above a 64px sticky footer.
    RULE: HIGHEST-RISK SCREEN. Approve Challan and Approve Invoice are two separate, separately permissioned controls. Never merged. The challan is approved first; the user STAYS ON THE PAGE; an invoice approval failure never rolls back the challan approval. The challan number is issued at APPROVAL, not at draft save.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Approve Challan and Approve Invoice are TWO SEPARATE CONTROLS. Never merged. The string "Save and Approve Both" must not appear on any frame.
2. The challan is approved FIRST. Approve Invoice is disabled until then with "Approve the challan first."
3. After approving the challan the user STAYS ON THE PAGE.
4. On D-CHL-SCR-002-Review-IRNFailed the CHALLAN BADGE MUST STILL READ APPROVED. An invoice approval failure never rolls back the challan approval.
5. The challan number is issued at APPROVAL, not at draft save. Blank and draft frames show no challan number.
6. Allocation states are labelled in WORDS: Suggested, Modified, Locked, Ineligible.
7. All 21 desktop frames exist with the exact names above.
8. Every frame is a template instance, not a recreation.
9. Every Status Badge carries a text label.
10. Permission-restricted frames REMOVE controls rather than disabling them.
11. Every disabled control carries a Disabled Reason.
12. Sample data matches the list above exactly.
13. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "14 — Challans". Do not build mobile frames, prototype links or any other module.
```

## P19 — Invoices

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `15 — Invoices`*

```
OBJECTIVE
Build the desktop frames for 4 screen(s) on page "15 — Invoices". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
15 — Invoices

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INV-SCR-001-List-Default` | List | Default | T01 | Grouped by client, nothing selected |
| `D-INV-SCR-001-List-Draft` | List | Draft | T01 | Two Beta challans selected, Plant locked |
| `D-INV-SCR-001-List-PermissionRestricted` | List | PermissionRestricted | T01 | Other-client and other-Plant rows disabled with reasons |
| `D-INV-SCR-001-List-Empty` | List | Empty | T01 | No unbilled challans in scope |
| `D-INV-SCR-001-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-INV-SCR-001-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-INV-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-INV-SCR-001-List-Error` | List | Error | T01 | Retrieval failed |
| `D-INV-SCR-002-Create-Default` | Create | Default | T03 | Blank entry, one empty line |
| `D-INV-SCR-002-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INV-SCR-002-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INV-SCR-002-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INV-SCR-002-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INV-SCR-002-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INV-SCR-002-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INV-SCR-002-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INV-SCR-002-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-INV-SCR-003-Review-PendingIRN` | Review | PendingIRN | T04 | Four controls present and disabled |
| `D-INV-SCR-003-Review-IRNFailed` | Review | IRNFailed | T04 | Failed fork on the timeline, remarks shown |
| `D-INV-SCR-003-Review-IRNGenerated` | Review | IRNGenerated | T04 | Terminal, IRN details read-only |
| `D-INV-SCR-003-Review-Cancelled` | Review | Cancelled | T04 | Cancelled pre-IRN, number released |
| `D-INV-SCR-003-Review-Draft` | Review | Draft | T04 | Edit revokes approval confirmation |
| `D-INV-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Awaiting a decision |
| `D-INV-SCR-003-Review-Approved` | Review | Approved | T04 | Read-only approved record |
| `D-INV-SCR-003-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T04 | Returned with a reason banner |
| `D-INV-SCR-003-Review-Reversed` | Review | Reversed | T04 | Reversed, compensating movement shown |
| `D-INV-SCR-003-Review-Loading` | Review | Loading | T04 | Summary and timeline skeletons |
| `D-INV-SCR-003-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T04 | Changed by another user |
| `D-INV-SCR-003-Review-PermissionRestricted` | Review | PermissionRestricted | T04 | Decision actions absent |
| `D-INV-SCR-004-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-INV-SCR-004-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-INV-SCR-004-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-INV-SCR-004-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-INV-SCR-004-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-INV-SCR-004-List-Error` | List | Error | T01 | Retrieval failed |
| `D-INV-SCR-004-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |


COMPONENTS TO INSTANTIATE
INV-SCR-001 — Unbilled Challan Selection  [template T01]
    Columns: Select (P1) · Challan number (P1) · Date (P1) · Client (P1) · Plant (P1) · Total quantity (P1) · Line count (P3)
    Filters: Date range · Client · Plant · Product
    Actions: Create invoice from selection (Primary) · Clear selection (Tertiary)
    Statuses: Unbilled
    Mobile card: Record cards with a selection checkbox. Selection summary pins above the sticky footer.
    RULE: UX-DEC-009: one invoice cannot contain challans from multiple Plants. After the first selection the Plant LOCKS, only eligible challans from that Company and Plant are shown, incompatible rows are DISABLED and each states why. The same lock applies to Client.

INV-SCR-002 — Later / Bulk Invoice Create  [template T03]
    Sections: Invoice header [Client (Read-only, from selection); Plant (Read-only, from selection); Invoice date * (Date); Use a reserved invoice number (Checkbox plus reservation selector)] | Source challans [Read-only list of selected challans with number, date and quantity] | Invoice lines [Derived grid: Product · Quantity (derived, not editable) · Rate * · Rate Resolution Indicator · Amount (derived)] | Discount and additional charges [Charge grid as CHL-SCR-002] | Totals [Calculation Summary in the fixed order]
    Filters: none
    Actions: Save draft (Secondary) · Save and submit (Primary) · Set manual rate (Tertiary) · Cancel (Secondary)
    Statuses: Draft · Pending Approval
    Mobile card: Line cards. Calculation Summary pins above the sticky footer.
    RULE: Quantities derive from the source challans and are never independently editable here. CHL-ERR-008 fires where a rate does not resolve.

INV-SCR-003 — Invoice Review and Approval  [template T04]
    Sections: Header [Invoice number (Read-only); Invoice date (Read-only); Client (Read-only); Company and Plant (Read-only)] | Lifecycle [Status Timeline: Draft → Pending Approval → Approved → Pending IRN → IRN Generated, with an IRN Failed fork and a Cancelled terminal branch] | Linked documents [Transaction Chain showing source challans with their own status badges] | Lines and totals [Read-only line table plus Calculation Summary] | IRN details [Shown only once IRN Generated: IRN, acknowledgement number, acknowledgement date-time with timezone]
    Filters: none
    Actions: Approve invoice (Primary) · Return for Correction (Secondary) · Edit invoice (Secondary) · Cancel invoice (Destructive) · Record IRN outcome (Primary) · Create credit note (Secondary) · View audit history (Tertiary)
    Statuses: Draft · Pending Approval · Returned for Correction · Approved · Pending IRN · IRN Failed · IRN Generated · Cancelled
    Mobile card: Timeline vertical. Lines become cards. Actions in a sticky footer.
    RULE: At Pending IRN, FOUR controls are present and disabled: Edit, Cancel, Release number, Unbill challans. Editing an approved pre-IRN invoice REVOKES its approval. Post-IRN correction is by credit note only.

INV-SCR-004 — Invoice List  [template T01]
    Columns: Invoice number (P1) · Date (P1) · Client (P1) · Total value (P1) · Invoice status (P1) · IRN status (P1) · Credit status (P3) · Actions (P1)
    Filters: Date range · Client · Invoice status · IRN status · Credit status
    Actions: View (Row click) · Record IRN outcome (Row menu) · View audit history (Row menu)
    Statuses: Draft · Pending Approval · Returned for Correction · Approved · Pending IRN · IRN Failed · IRN Generated · Cancelled
    Mobile card: Record card carrying invoice and IRN badges. Lines: date, client, total value.
    RULE: Credit status is derived and changes only when a credit note reaches IRN Generated.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. UX-DEC-009: one invoice cannot span multiple Plants. After the first challan selection the Plant LOCKS. Build C-DAT-15 Plant Lock Indicator into the filter chip row and DISABLE incompatible rows with an inline reason.
2. At Pending IRN, FOUR controls are present and disabled: Edit, Cancel, Release number, Unbill challans.
3. Editing an approved pre-IRN invoice REVOKES approval.
4. All 36 desktop frames exist with the exact names above.
5. Every frame is a template instance, not a recreation.
6. Every Status Badge carries a text label.
7. Permission-restricted frames REMOVE controls rather than disabling them.
8. Every disabled control carries a Disabled Reason.
9. Sample data matches the list above exactly.
10. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "15 — Invoices". Do not build mobile frames, prototype links or any other module.
```

## P20 — Invoice number reservation

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `15 — Invoices`*

```
OBJECTIVE
Build the desktop frames for 1 screen(s) on page "15 — Invoices". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
15 — Invoices

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INV-SCR-007-Create-Default` | Create | Default | T01 | Reservation form, client and challans unselected |
| `D-INV-SCR-007-Create-Draft` | Create | Draft | T01 | Client CL1 and two challans selected, permanence warning shown |
| `D-INV-SCR-007-Create-Error` | Create | Error | T01 | Client has no unbilled challans |
| `D-INV-SCR-007-List-Default` | List | Default | T01 | Reserved, consumed and released rows together |
| `D-INV-SCR-007-List-Filtered` | List | Filtered | T01 | Released row expanded showing reuse history |
| `D-INV-SCR-007-List-PermissionRestricted` | List | PermissionRestricted | T01 | Release absent for a role without the permission |
| `D-INV-SCR-007-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-INV-SCR-007-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-INV-SCR-007-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-INV-SCR-007-List-Error` | List | Error | T01 | Retrieval failed |


COMPONENTS TO INSTANTIATE
INV-SCR-007 — Invoice Number Reservation  [template T01]
    Columns: Reservation (P1) · Invoice number (P1) · Client (P1) · Bound challans (P2) · Reserved on (P2) · Status (P1) · Actions (P1)
    Filters: Client · Status: Reserved / Consumed / Released · Reserved date range
    Actions: Reserve number (Primary) · Release number (Row menu, destructive) · View reuse history (Row expand)
    Statuses: Reserved · Consumed · Released
    Mobile card: Record card. Reuse history expands in place.
    RULE: A reservation PERMANENTLY binds Client and Challans and cannot be transferred. A released pre-IRN number may be reused; a number that reached IRN can never be reused.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. A reservation PERMANENTLY binds Client and Challans and cannot be transferred.
2. A released pre-IRN number may be reused. A number that reached IRN can NEVER be reused.
3. Release is disabled on consumed rows with its reason.
4. All 10 desktop frames exist with the exact names above.
5. Every frame is a template instance, not a recreation.
6. Every Status Badge carries a text label.
7. Permission-restricted frames REMOVE controls rather than disabling them.
8. Every disabled control carries a Disabled Reason.
9. Sample data matches the list above exactly.
10. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "15 — Invoices". Do not build mobile frames, prototype links or any other module.
```

## P21 — Invoice and Credit Note IRN

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `16 — Credit Notes & IRN`*

```
OBJECTIVE
Build the desktop frames for 2 screen(s) on page "16 — Credit Notes & IRN". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
16 — Credit Notes & IRN

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INV-SCR-008-Create-Default` | Create | Default | T03 | Outcome unselected, both field sets hidden |
| `D-INV-SCR-008-Create-IRNGenerated` | Create | IRNGenerated | T03 | Success selected, three mandatory fields |
| `D-INV-SCR-008-Create-IRNFailed` | Create | IRNFailed | T03 | Failure selected, remarks mandatory, success fields absent |
| `D-INV-SCR-008-Create-PermissionRestricted` | Create | PermissionRestricted | T03 | Statutory deadline passed, form replaced entirely |
| `D-INV-SCR-008-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INV-SCR-008-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INV-SCR-008-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INV-SCR-008-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INV-SCR-008-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INV-SCR-008-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INV-SCR-008-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INV-SCR-008-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |
| `D-INV-SCR-012-Create-Default` | Create | Default | T03 | Outcome unselected, both field sets hidden |
| `D-INV-SCR-012-Create-IRNGenerated` | Create | IRNGenerated | T03 | Success selected, three mandatory fields, timezone label shown |
| `D-INV-SCR-012-Create-IRNFailed` | Create | IRNFailed | T03 | Failure selected, remarks mandatory, success fields absent |
| `D-INV-SCR-012-Create-PermissionRestricted` | Create | PermissionRestricted | T03 | Deadline passed, form replaced by the statutory block |
| `D-INV-SCR-012-Create-Loading` | Create | Loading | T03 | Summary skeleton |
| `D-INV-SCR-012-Create-Draft` | Create | Draft | T03 | Populated, saved draft |
| `D-INV-SCR-012-Create-Error` | Create | Error | T03 | Validation summary plus inline errors |
| `D-INV-SCR-012-Review-PendingApproval` | Review | PendingApproval | T03 | Submitted, awaiting a decision |
| `D-INV-SCR-012-Review-Approved` | Review | Approved | T03 | Read-only approved record |
| `D-INV-SCR-012-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INV-SCR-012-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INV-SCR-012-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |


COMPONENTS TO INSTANTIATE
INV-SCR-008 — Record Invoice IRN Outcome  [template T03]
    Sections: Invoice summary [Invoice number (Read-only); Invoice date (Read-only); Client (Read-only); Total value (Read-only); Statutory deadline (Read-only, with timezone label)] | Outcome [Outcome * (Radio: Success / Failure)] | Success fields [IRN * (Code, 64); Acknowledgement number * (Code, 16); Acknowledgement date-time * (Date-Time with timezone)] | Failure fields [Failure remarks * (Text area, 500)]
    Filters: none
    Actions: Record outcome (Primary) · Cancel (Secondary)
    Statuses: Pending IRN · IRN Generated · IRN Failed
    Mobile card: Full-width fields. The IRN value wraps rather than truncating.
    RULE: MANUAL RECORDING ONLY. No live integration, no connection status, no queue, no automatic retry. The Success and Failure field sets SWAP entirely; the unselected set is absent, not disabled. UX-DEC-004: blocked when current_datetime >= calculated_deadline, so the exact deadline instant is not eligible.

INV-SCR-012 — Record Credit Note IRN Outcome  [template T03]
    Sections: Credit note summary [Credit note number (Read-only); Original invoice (Read-only); Credit value (Read-only); Statutory deadline (Read-only, with timezone label)] | Outcome [Outcome * (Radio: Success / Failure)] | Success fields [IRN * (Code, 64); Acknowledgement number * (Code, 16); Acknowledgement date-time * (Date-Time with timezone)] | Failure fields [Failure remarks * (Text area, 500)]
    Filters: none
    Actions: Record outcome (Primary) · Cancel (Secondary)
    Statuses: Pending IRN · IRN Generated · IRN Failed
    Mobile card: As INV-SCR-008.
    RULE: Instantiates the same IRN Outcome Form as INV-SCR-008 against a credit note. The ORIGINAL invoice Credit Status changes only when this reaches IRN Generated.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. MANUAL RECORDING ONLY. No live integration, no connection status, no queue, no automatic retry anywhere.
2. The Success and Failure field sets SWAP entirely. The unselected set is ABSENT, not disabled.
3. UX-DEC-004: blocked when current_datetime >= calculated_deadline. The Statutory Deadline Block REPLACES the entire form. No override control exists.
4. UX-DEC-005: the timezone label is mandatory and never truncated.
5. All 24 desktop frames exist with the exact names above.
6. Every frame is a template instance, not a recreation.
7. Every Status Badge carries a text label.
8. Permission-restricted frames REMOVE controls rather than disabling them.
9. Every disabled control carries a Disabled Reason.
10. Sample data matches the list above exactly.
11. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "16 — Credit Notes & IRN". Do not build mobile frames, prototype links or any other module.
```

## P22 — Credit Notes

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `16 — Credit Notes & IRN`*

```
OBJECTIVE
Build the desktop frames for 2 screen(s) on page "16 — Credit Notes & IRN". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
16 — Credit Notes & IRN

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-INV-SCR-010-List-Default` | List | Default | T01 | Populated, 25 of 128 rows |
| `D-INV-SCR-010-List-Filtered` | List | Filtered | T01 | Two filters applied, 12 rows |
| `D-INV-SCR-010-List-Empty` | List | Empty | T01 | No records exist yet |
| `D-INV-SCR-010-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `D-INV-SCR-010-List-Loading` | List | Loading | T01 | Eight row skeletons |
| `D-INV-SCR-010-List-Error` | List | Error | T01 | Retrieval failed |
| `D-INV-SCR-010-List-PermissionRestricted` | List | PermissionRestricted | T01 | Role without create or row actions |
| `D-INV-SCR-011-Create-Default` | Create | Default | T03 | Prefilled from the original invoice |
| `D-INV-SCR-011-Create-Draft` | Create | Draft | T03 | Line 2 credit set to zero, row retained |
| `D-INV-SCR-011-Create-Error` | Create | Error | T03 | Credit exceeds remaining creditable on line 1 |
| `D-INV-SCR-011-Review-PendingApproval` | Review | PendingApproval | T03 | Independent credit note lifecycle |
| `D-INV-SCR-011-Review-Approved` | Review | Approved | T03 | Approved, awaiting IRN |
| `D-INV-SCR-011-Create-Loading` | Create | Loading | T03 | Header and line skeletons |
| `D-INV-SCR-011-Review-ReturnedForCorrection` | Review | ReturnedForCorrection | T03 | Returned with a reason banner |
| `D-INV-SCR-011-Review-ConcurrentUpdate` | Review | ConcurrentUpdate | T03 | Record changed by another user |
| `D-INV-SCR-011-Review-PermissionRestricted` | Review | PermissionRestricted | T03 | Role without the decision permission |


COMPONENTS TO INSTANTIATE
INV-SCR-010 — Credit Note List  [template T01]
    Columns: Credit note number (P1) · Date (P1) · Original invoice (P1) · Client (P2) · Credit value (P1) · Status (P1) · IRN status (P1) · Actions (P1)
    Filters: Date range · Client · Original invoice · Status · IRN status
    Actions: View (Row click) · Record IRN outcome (Row menu) · View audit history (Row menu)
    Statuses: Draft · Pending Approval · Returned for Correction · Approved · Pending IRN · IRN Failed · IRN Generated
    Mobile card: Record card carrying credit note and IRN badges.
    RULE: A credit note has its own lifecycle, independent of the invoice it credits.

INV-SCR-011 — Credit Note Create and Review  [template T03 then T04]
    Sections: Original invoice [Invoice number (Read-only); Invoice date (Read-only); Client (Read-only); IRN status (Read-only, must be IRN Generated)] | Credit note header [Credit note date * (Date); Reason * (Searchable select); Remarks (Text area)] | Line credits [Credit Note Line Selector: Product · Original value · Already credited · Remaining creditable · Credit amount *] | Charge credits [Same four columns at charge level, validated independently] | Totals [Credit Calculation Summary mirroring the invoice order]
    Filters: none
    Actions: Save draft (Secondary) · Save and submit (Primary) · Approve credit note (Primary) · Return for Correction (Secondary) · Cancel (Secondary)
    Statuses: Draft · Pending Approval · Returned for Correction · Approved · Pending IRN
    Mobile card: Line cards with the credit input inside each card.
    RULE: Only an IRN-generated invoice may be credited. Credit is capped at the remaining creditable value at BOTH line and charge level, validated independently. Setting a line credit to zero removes it from the note without deleting the row.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Only an IRN-generated invoice may be credited.
2. Credit is capped at remaining creditable at BOTH line and charge level, validated independently.
3. A zeroed line is RETAINED, not deleted.
4. The original invoice Credit Status changes only when the credit note reaches IRN Generated.
5. All 16 desktop frames exist with the exact names above.
6. Every frame is a template instance, not a recreation.
7. Every Status Badge carries a text label.
8. Permission-restricted frames REMOVE controls rather than disabling them.
9. Every disabled control carries a Disabled Reason.
10. Sample data matches the list above exactly.
11. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "16 — Credit Notes & IRN". Do not build mobile frames, prototype links or any other module.
```

## P23 — Reports

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `17 — Reports`*

```
OBJECTIVE
Build the desktop frames for 13 screen(s) on page "17 — Reports". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
17 — Reports

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-RPT-SCR-001-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-001-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-001-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-001-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-001-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-001-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-002-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-002-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-002-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-002-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-002-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-002-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-003-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-003-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-003-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-003-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-003-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-003-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-004-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-004-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-004-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-004-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-004-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-004-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-005-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-005-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-005-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-005-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-005-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-005-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-006-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-006-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-006-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-006-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-006-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-006-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-007-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-007-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-007-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-007-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-007-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-007-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-008-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-008-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-008-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-008-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-008-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-008-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-009-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-009-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-009-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-009-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-009-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-009-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-010-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-010-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-010-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-010-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-010-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-010-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-011-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-011-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-011-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-011-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-011-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-011-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-012-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-012-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-012-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-012-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-012-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-012-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |
| `D-RPT-SCR-013-Report-Default` | Report | Default | T06 | Populated within the scope line |
| `D-RPT-SCR-013-Report-Filtered` | Report | Filtered | T06 | Filters applied, chips visible |
| `D-RPT-SCR-013-Report-Empty` | Report | Empty | T06 | No data for the selected filters |
| `D-RPT-SCR-013-Report-Loading` | Report | Loading | T06 | Twelve row skeletons |
| `D-RPT-SCR-013-Report-Error` | Report | Error | T06 | Retrieval failed |
| `D-RPT-SCR-013-Report-PermissionRestricted` | Report | PermissionRestricted | T06 | Export control absent |


COMPONENTS TO INSTANTIATE
RPT-SCR-001 — Challan Register Report  [template T06]
    Columns: Challan number · Date · Client · Client site · Vehicle · Product · Quantity · Challan status · Invoice status
    Filters: Date range · Client · Client site · Product · Challan status · Invoice status
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Challan number, Date, Client, Quantity.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-002 — Invoice Register Report  [template T06]
    Columns: Invoice number · Date · Client · Taxable value · CGST · SGST · IGST · Total · Invoice status · IRN status
    Filters: Date range · Client · Invoice status · IRN status
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Invoice number, Date, Client, Total.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-003 — Material Ledger Report  [template T06]
    Columns: Date · Movement type · Reference · In · Out · Running balance
    Filters: Date range · Material * · Plant · Movement type
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Date, Movement type, Signed quantity, Running balance.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-004 — Client Billing Summary Report  [template T06]
    Columns: Client · Challan count · Total quantity · Invoice count · Taxable value · Tax · Total billed
    Filters: Date range · Client · Plant
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Client, Total quantity, Total billed.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-005 — Vendor Inward Summary Report  [template T06]
    Columns: Vendor · Inward count · Material · Total quantity · Last inward date
    Filters: Date range · Vendor · Material
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Vendor, Material, Total quantity.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-006 — Inventory Position Report  [template T06]
    Columns: Material · Opening · Inward · Production · Consumed · Despatched · Returned · Wastage · Adjustments · Closing
    Filters: As-at date * · Plant · Material · Classification
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Material, Opening, Closing, Net movement.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-007 — Wastage Analysis Report  [template T06]
    Columns: Date · Material · Quantity · Reason · Origin · Approved by · Status
    Filters: Date range · Material · Reason · Origin · Status
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Date, Material, Quantity, Reason.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-008 — Rejection and Disposition Report  [template T06]
    Columns: Date · Source challan · Client · Product · Rejected · Returned · Reassigned · Wasted · Undisposed
    Filters: Date range · Client · Product · Disposition state
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Date, Product, Rejected, Undisposed.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-009 — GST Summary Report  [template T06]
    Columns: Period · Taxable value · CGST · SGST · IGST · Total tax · Invoice count
    Filters: Period * · Client · Place of supply
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Period, Taxable value, Total tax.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-010 — Credit Note Register Report  [template T06]
    Columns: Credit note number · Date · Original invoice · Client · Credit value · Status · IRN status
    Filters: Date range · Client · Status · IRN status
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Credit note number, Date, Credit value.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-011 — Invoice Number Reservation Report  [template T06]
    Columns: Reservation · Invoice number · Client · Status · Reserved on · Consumed or released on · Reason
    Filters: Date range · Client · Status
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Invoice number, Client, Status.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-012 — Statutory Deadline and IRN Status Report  [template T06]
    Columns: Document · Type · Date · Deadline (with timezone) · Time remaining · IRN status · Blocked
    Filters: Date range · Document type · IRN status · Deadline state
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Document, Deadline, IRN status.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

RPT-SCR-013 — Audit Activity Summary Report  [template T06]
    Columns: Date · User · Active role · Action count · Entities touched
    Filters: Date range · User · Active role · Entity
    Actions: Apply filters (Primary) · Export (Split button) · Clear all filters (Tertiary)
    Statuses: None. Data rows only.
    Mobile card: Record cards showing: Date, User, Action count.
    RULE: No-data wording is identical across all thirteen reports. Export covers the filtered set only and never exceeds the on-screen access scope. No inventory valuation column appears on any report.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Every report shows the SCOPE LINE: Company, Plant and date range. Never hidden.
2. No-data wording is IDENTICAL across all thirteen: "No data available for the selected filters".
3. NO inventory valuation column on any report.
4. RPT-SCR-003 running balance is DERIVED — mark it as derived.
5. RPT-SCR-006 has ten columns and no valuation.
6. All 78 desktop frames exist with the exact names above.
7. Every frame is a template instance, not a recreation.
8. Every Status Badge carries a text label.
9. Permission-restricted frames REMOVE controls rather than disabling them.
10. Every disabled control carries a Disabled Reason.
11. Sample data matches the list above exactly.
12. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "17 — Reports". Do not build mobile frames, prototype links or any other module.
```

## P24 — Users and Roles

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `18 — Users, Roles & Audit`*

```
OBJECTIVE
Build the desktop frames for 2 screen(s) on page "18 — Users, Roles & Audit". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
18 — Users, Roles & Audit

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-IAM-SCR-001-List-Default` | List | Default | T02 | Users with active status and role chips |
| `D-IAM-SCR-001-List-Filtered` | List | Filtered | T02 | Filtered to one role |
| `D-IAM-SCR-001-List-Empty` | List | Empty | T02 | No users match |
| `D-IAM-SCR-001-List-Loading` | List | Loading | T02 | Row skeletons |
| `D-IAM-SCR-001-Edit-Default` | Edit | Default | T02 | S. Patil with two roles, two companies, two plants |
| `D-IAM-SCR-001-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Super Admin option visible and DISABLED with the anti-escalation reason |
| `D-IAM-SCR-001-Edit-Error` | Edit | Error | T02 | Last role removed |
| `D-IAM-SCR-001-Edit-Draft` | Edit | Draft | T02 | Dirty state |
| `D-IAM-SCR-001-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Changed by another admin |
| `D-IAM-SCR-001-Create-Default` | Create | Default | T02 | Empty user form |
| `D-IAM-SCR-001-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-IAM-SCR-001-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-IAM-SCR-001-Create-Loading` | Create | Loading | T02 | Form skeleton |
| `D-IAM-SCR-002-List-Default` | List | Default | T02 | Roles with permission counts |
| `D-IAM-SCR-002-List-Loading` | List | Loading | T02 | Row skeletons |
| `D-IAM-SCR-002-List-Empty` | List | Empty | T02 | No roles match |
| `D-IAM-SCR-002-Edit-Default` | Edit | Default | T02 | Billing Clerk, accordion groups with selected counts |
| `D-IAM-SCR-002-Edit-Filtered` | Edit | Filtered | T02 | Permission search applied |
| `D-IAM-SCR-002-Edit-PermissionRestricted` | Edit | PermissionRestricted | T02 | Permissions above the editor level shown disabled |
| `D-IAM-SCR-002-Edit-Draft` | Edit | Draft | T02 | Dirty state |
| `D-IAM-SCR-002-Edit-ConcurrentUpdate` | Edit | ConcurrentUpdate | T02 | Changed by another admin |
| `D-IAM-SCR-002-Create-Default` | Create | Default | T02 | Empty role form |
| `D-IAM-SCR-002-Edit-Error` | Edit | Error | T02 | Duplicate identifier rejected |
| `D-IAM-SCR-002-View-Default` | View | Default | T02 | Read-only, role without edit |
| `D-IAM-SCR-002-View-Cancelled` | View | Cancelled | T02 | Inactive record, historical read-only |
| `D-IAM-SCR-002-Create-Loading` | Create | Loading | T02 | Form skeleton |


COMPONENTS TO INSTANTIATE
IAM-SCR-001 — User Access Assignment  [template T02]
    Sections: User identification [Full name * (Text, 120); Email * (Text); Employee code (Text, 20)] | Roles [Roles * (Multi-select, minimum one). Options above the editing user's own level are VISIBLE and DISABLED with the anti-escalation reason.] | Company access [Companies * (Multi-select, minimum one)] | Plant access [Plants * (Multi-select, dependent on selected companies)] | Active role explanation [Information alert stating that a user holding several roles operates under one active role at a time and permissions are evaluated against that role alone] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Deactivate user (Destructive) · View audit history (Tertiary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Multi-selects become full-screen sheets.
    RULE: ANTI-ESCALATION IS SHOWN, NOT HIDDEN. This is the one deliberate exception to hide-on-no-permission, because an administrator needs to understand the boundary.

IAM-SCR-002 — Role Permission Matrix  [template T02]
    Sections: Role identification [Role name * (Text, 60); Description (Text area)] | Permission search [Search across all permission names] | Permission groups [Accordion groups each showing a selected count in the collapsed header: Masters, Material, Challans, Invoices, Credit Notes and IRN, Reports, Administration] | Record [Created (Read-only); Last modified (Read-only); Status (Read-only badge)]
    Filters: none
    Actions: Save (Primary) · Expand all (Tertiary) · Collapse all (Tertiary) · Cancel (Secondary)
    Statuses: Active · Inactive
    Mobile card: Accordions full width. Counts stay visible when collapsed.
    RULE: Permissions above the editing user's own level are shown disabled with the anti-escalation reason.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. Permissions are evaluated against the SINGLE ACTIVE ROLE, never a union.
2. ANTI-ESCALATION IS SHOWN, NOT HIDDEN. The higher role option is VISIBLE and DISABLED with its reason. This is the one deliberate exception to hide-on-no-permission.
3. All 26 desktop frames exist with the exact names above.
4. Every frame is a template instance, not a recreation.
5. Every Status Badge carries a text label.
6. Permission-restricted frames REMOVE controls rather than disabling them.
7. Every disabled control carries a Disabled Reason.
8. Sample data matches the list above exactly.
9. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "18 — Users, Roles & Audit". Do not build mobile frames, prototype links or any other module.
```

## P25 — Audit history

*Blueprint reference: Blueprint Section 12 (screen specifications), Section 13 (frame inventory)*
*Figma page: `18 — Users, Roles & Audit`*

```
OBJECTIVE
Build the desktop frames for 1 screen(s) on page "18 — Users, Roles & Audit". Instance the named page templates. Do not recreate templates or components.

EXISTING WORK TO REUSE
All variables and text styles from P00. All 78 components from P02-P06. All 8 templates from P07.

FIGMA PAGE
18 — Users, Roles & Audit

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `D-AUD-SCR-001-View-Default` | View | Default | T08 | Events newest first |
| `D-AUD-SCR-001-View-Filtered` | View | Filtered | T08 | Four filters applied |
| `D-AUD-SCR-001-View-Empty` | View | Empty | T08 | No events match |
| `D-AUD-SCR-001-View-Loading` | View | Loading | T08 | Six event skeletons |
| `D-AUD-SCR-001-View-PermissionRestricted` | View | PermissionRestricted | T08 | Export control absent |


COMPONENTS TO INSTANTIATE
AUD-SCR-001 — Audit History  [template T08]
    Columns: Timestamp (P1) · User (P1) · Active role (P1) · Action (P1) · Entity (P2) · Reference (P2) · Company (P3) · Plant (P3)
    Filters: Date range · User · Active role · Action · Entity · Reference · Company · Plant
    Actions: Expand detail (Row click) · Export (Secondary)
    Statuses: None. Events only.
    Mobile card: Record card. Lines: user, active role, action.
    RULE: ROWS ARE PERMANENTLY IMMUTABLE. There is NO edit and NO delete control in any state under any permission. Export is a separately permissioned action. Unchanged fields are OMITTED from the before-and-after comparison.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Every frame instances its template. Do not alter template Auto Layout. Bind all gaps and padding to Spacing variables.

STATES
Build every State listed in the frame table above. Each must differ by which controls exist or which content shows, not merely by a value.

INTERACTIONS
Wire nothing in this prompt. Prototype connections are built in P28.

RESPONSIVE
Desktop only in this prompt. Mobile frames are built in P26.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Pages 01 to 04. Every frame from an earlier module prompt.

COMPLETION CHECKLIST
1. NO edit and NO delete control in any state, under any permission. Do not add one "for administrators".
2. Export is a SEPARATE permission. Build the frame where the export control is absent.
3. Unchanged fields are OMITTED from the before-and-after comparison, not shown as identical pairs.
4. Show both the local rendering and the stored UTC value per UX-DEC-005.
5. All 5 desktop frames exist with the exact names above.
6. Every frame is a template instance, not a recreation.
7. Every Status Badge carries a text label.
8. Permission-restricted frames REMOVE controls rather than disabling them.
9. Every disabled control carries a Disabled Reason.
10. Sample data matches the list above exactly.
11. No hard-coded colour or spacing value anywhere.

STOP CONDITION
Stop after the last frame on page "18 — Users, Roles & Audit". Do not build mobile frames, prototype links or any other module.
```

## P26 — Mobile variants

*Blueprint reference: Blueprint Sections 15.3, 15.5, 15.6*
*Figma page: `19 — Responsive Reference`*

```
OBJECTIVE
Create 107 mobile frames at 390x844. Apply the transformation rules. Do not redesign.

EXISTING WORK TO REUSE
Every desktop frame from P08 to P25. All components and templates.

FIGMA PAGE
19 — Responsive Reference

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `M-CMP-SCR-001-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-CMP-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-CMP-SCR-002-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-CMP-SCR-002-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-CMP-SCR-003-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-CMP-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-CMP-SCR-004-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-CMP-SCR-004-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PTY-SCR-001-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-PTY-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-PTY-SCR-002-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-PTY-SCR-002-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PTY-SCR-003-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-PTY-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-PTY-SCR-004-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-PTY-SCR-004-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PTY-SCR-005-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-PTY-SCR-005-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-PTY-SCR-006-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-PTY-SCR-006-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PRD-SCR-001-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-PRD-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-PRD-SCR-002-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-PRD-SCR-002-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PRD-SCR-003-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-PRD-SCR-003-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PRD-SCR-004-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-PRD-SCR-004-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-VEH-SCR-001-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-VEH-SCR-002-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-VEH-SCR-002-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-VEH-SCR-003-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-VEH-SCR-003-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-VEH-SCR-004-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-VEH-SCR-004-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-RCP-SCR-001-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-RCP-SCR-001-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-PRC-SCR-001-Configure-Default` | Configure | Default | T07 | Record cards |
| `M-PRC-SCR-002-Configure-Default` | Configure | Default | T07 | Record cards |
| `M-ACH-SCR-001-Configure-Default` | Configure | Default | T07 | Record cards |
| `M-STAT-SCR-001-Configure-Default` | Configure | Default | T07 | Record cards |
| `M-INW-SCR-001-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INW-SCR-001-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INW-SCR-002-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INW-SCR-002-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INW-SCR-003-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INW-SCR-003-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INW-SCR-004-Create-Default` | Create | Default | T03 | Stacked, radios full width at 44px |
| `M-INW-SCR-004-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INW-SCR-005-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-INW-SCR-005-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-DSP-SCR-001-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-DSP-SCR-001-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-DSP-SCR-002-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-DSP-SCR-002-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-DSP-SCR-003-Review-Default` | Review | Default | T04 | Paths stacked, summary pinned |
| `M-DSP-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Vertical timeline, sticky footer actions |
| `M-WST-SCR-001-List-Default` | List | Default | T01 | Record cards |
| `M-WST-SCR-001-Create-Default` | Create | Default | T01 | Stacked, camera and file sources offered |
| `M-WST-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-WST-SCR-002-Review-PendingApproval` | Review | PendingApproval | T04 | Vertical timeline, sticky footer |
| `M-WST-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Vertical timeline, sticky footer actions |
| `M-CHL-SCR-001-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-CHL-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-CHL-SCR-002-Create-Default` | Create | Default | T03 | Line cards, totals pinned above sticky footer |
| `M-CHL-SCR-002-Create-Error` | Create | Error | T03 | Offending card auto-expanded |
| `M-INV-SCR-001-List-Default` | List | Default | T01 | Selection cards, summary pinned |
| `M-INV-SCR-001-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-INV-SCR-002-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INV-SCR-002-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INV-SCR-003-Review-PendingIRN` | Review | PendingIRN | T04 | Disabled actions in overflow with inline reasons |
| `M-INV-SCR-003-Review-PendingApproval` | Review | PendingApproval | T04 | Vertical timeline, sticky footer actions |
| `M-INV-SCR-004-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-INV-SCR-004-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-INV-SCR-007-List-Default` | List | Default | T01 | Record cards, reuse history expands in place |
| `M-INV-SCR-007-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-INV-SCR-008-Create-IRNGenerated` | Create | IRNGenerated | T03 | Full-width fields, IRN wraps |
| `M-INV-SCR-008-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INV-SCR-008-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INV-SCR-010-List-Default` | List | Default | T01 | Record cards, 10 visible |
| `M-INV-SCR-010-List-NoResults` | List | NoResults | T01 | Filters match nothing |
| `M-INV-SCR-011-Create-Default` | Create | Default | T03 | Line cards with the credit input inside |
| `M-INV-SCR-011-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-INV-SCR-012-Create-IRNGenerated` | Create | IRNGenerated | T03 | Full-width fields, IRN wraps |
| `M-INV-SCR-012-Create-Default` | Create | Default | T03 | Line cards, stacked |
| `M-INV-SCR-012-Create-Error` | Create | Error | T03 | Card auto-expands to reveal the error |
| `M-DSH-SCR-001-View-Default` | View | Default | T05 | One card per row, stacked actions |
| `M-RPT-SCR-001-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-002-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-003-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-004-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-005-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-006-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-007-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-008-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-009-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-010-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-011-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-012-Report-Default` | Report | Default | T06 | Record cards |
| `M-RPT-SCR-013-Report-Default` | Report | Default | T06 | Record cards |
| `M-IAM-SCR-001-Edit-Default` | Edit | Default | T02 | Multi-selects become sheets |
| `M-IAM-SCR-001-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-IAM-SCR-001-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-IAM-SCR-002-Edit-Default` | Edit | Default | T02 | Accordions full width, counts visible collapsed |
| `M-IAM-SCR-002-Create-Default` | Create | Default | T02 | Empty form, stacked |
| `M-IAM-SCR-002-Edit-Error` | Edit | Error | T02 | Validation errors, stacked |
| `M-AUD-SCR-001-View-Default` | View | Default | T08 | Event cards |


COMPONENTS TO INSTANTIATE
TRANSFORMATION RULES - apply, do not redesign:
R1 Sidebar becomes a 280 drawer from a hamburger, closed by default.
R2 Context selectors become one 36 tappable summary opening a full-screen sheet.
R3 Tables become record cards. NEVER a shrunken table.
R4 Forms single column, inputs 48.
R5 Filters become a full-screen sheet.
R6 All actions move to a 64 sticky footer, primary full width.
R7 Totals pin directly above the sticky footer.
R8 All dialogs become full-screen sheets.
R9 Line grids become expandable cards.
R10 Tabs horizontally scrollable, never wrapped.

MOBILE CARD MAPPING - collapsed cards show EXACTLY these fields:
  CHL-SCR-001  Challan number | Challan+Invoice badges | Date, Client, Total quantity
  INV-SCR-001  Challan number | Unbilled | Date, Client, Plant, Total quantity
  INV-SCR-004  Invoice number | Invoice+IRN badges | Date, Client, Total value
  INV-SCR-007  Reserved number | Reservation | Client, Bound challans, Reserved on
  INV-SCR-010  Credit note number | CN+IRN badges | Date, Original invoice, Credit value
  INW-SCR-005  Inward reference | Reversal | Date, Source type, Total quantity
  WST-SCR-001  Wastage reference | Wastage | Date, Material, Quantity, Reason
  DSP-SCR-003  Rejection reference | Disposition | Material, Rejected, Undisposed
  RPT-SCR-003  Date | none | Movement type, Reference, Signed quantity, Running balance
  RPT-SCR-006  Material | none | Opening, Closing, Net movement
  AUD-SCR-001  Timestamp | none | User, Active role, Action
  Master lists Record name | Active/Inactive | two identifying fields
  Other reports Date or identifier | where present | two to three key values

MOBILE RULES NEVER BROKEN:
1 Never squeeze desktop columns into a narrow table.
2 Every touch target at least 44x44 with 8 separation.
3 Totals and the primary action together above the fold.
4 Actions in an overflow or the sticky footer, never a row of small icons.
5 Card titles never truncate the primary identifier - wrap instead.
6 Expansion happens in place; a collapsed card never navigates on an expand tap.
7 Numeric values never abbreviated in tables or totals.
8 Helper text carrying a governing figure is never hidden.
9 The timezone label on a deadline is never truncated.
10 Disabled reasons render INLINE within the card or sheet, not only as a hover tooltip.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Single column throughout. Page padding 16. Inputs 48. Sticky footer 64.

STATES
Build the states listed in the frame table. Where a desktop state has no distinct mobile treatment, it is not rebuilt.

INTERACTIONS
None. Wired in P28.

RESPONSIVE
This prompt IS the responsive work.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Every desktop frame. Pages 01 to 04.

COMPLETION CHECKLIST
1. All 107 mobile frames exist with the exact names above.
2. Every one of the 62 Screen IDs has at least one mobile frame.
3. No mobile frame contains a horizontally scrolling table.
4. Collapsed cards show exactly the essential fields listed.
5. All touch targets meet 44x44 with 8 separation.
6. Totals sit above the fold with the primary action.
7. Disabled reasons render inline, not only on hover.

STOP CONDITION
Stop after the last mobile frame. Do not build tablet frames or prototype links.
```

## P27 — Tablet reference

*Blueprint reference: Blueprint Sections 15.2, 15.5*
*Figma page: `19 — Responsive Reference`*

```
OBJECTIVE
Create the 3 bespoke tablet frames and the transformation reference boards. Only three screens differ materially from the desktop pattern.

EXISTING WORK TO REUSE
Every desktop and mobile frame. All components and templates.

FIGMA PAGE
19 — Responsive Reference

FRAMES TO CREATE
| Frame name | Mode | State | Template | Data scenario |
|---|---|---|---|---|
| `T-CHL-SCR-002-Create-Approved` | Create | Approved | T03 | Tablet, header single column, four grid columns |
| `T-DSH-SCR-001-View-Default` | View | Default | T05 | Two cards per row |
| `T-RPT-SCR-006-Report-Default` | Report | Default | T06 | Tablet, material column pinned, internal horizontal scroll |

Plus 4 reference boards on the same page:
Breakpoint Reference · Transformation Rules R1-R10 · Column Priority Reference · Mobile Card Mapping

COMPONENTS TO INSTANTIATE
ONLY these three screens get a bespoke tablet frame:
  T-CHL-SCR-002-Create-Approved  header single column, line grid keeps four P1 columns
  T-DSH-SCR-001-View-Default     two KPI cards per row, quick actions in one row
  T-RPT-SCR-006-Report-Default   THE ONE PERMITTED EXCEPTION

Do NOT build tablet frames for any other screen. Their tablet behaviour is fully described
by rules R1-R10 and is annotated on the desktop frame.

THE RPT-SCR-006 EXCEPTION:
Ten columns form a single opening-to-closing reconciliation. Splitting across cards or hiding
columns would break the arithmetic the user is checking. At TABLET ONLY it keeps a real table
with the Material column PINNED LEFT and horizontal scroll INSIDE the table container.
This does NOT extend to mobile, where it still becomes summary cards.

COLUMN PRIORITY:
  P1 always visible at every breakpoint
  P2 visible on tablet where space permits
  P3 desktop only

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
1024x768. Page padding 20. 8 columns, 20 gutter. Controls 48 where touch is expected.

STATES
One state per tablet frame — the Default. Other states inherit from desktop via annotation.

INTERACTIONS
None. Wired in P28.

RESPONSIVE
This prompt completes the responsive work.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Every desktop and mobile frame.

COMPLETION CHECKLIST
1. Exactly 3 tablet frames exist. No more.
2. T-RPT-SCR-006-Report-Default has the Material column pinned and scroll inside the container.
3. No other screen has a tablet frame.
4. The four reference boards exist.
5. Column priority is annotated on every list and report desktop frame.

STOP CONDITION
Stop after the reference boards. Do not wire prototypes.
```

## P28 — Prototype connections

*Blueprint reference: Blueprint Section 18*
*Figma page: `20 — Prototype Flows`*

```
OBJECTIVE
Create 24 flow boards and wire the prototype connections. Create no new frames — connect frames that already exist.

EXISTING WORK TO REUSE
Every frame built in P08 to P27.

FIGMA PAGE
20 — Prototype Flows

FRAMES TO CREATE
24 flow boards, one per flow, in this order:
1 Authentication and context to Dashboard      13 Wastage approval
2 Company, Plant and Role switch               14 Wastage reversal
3 Master creation                              15 Invoice IRN Success
4 Vendor Inward to Inventory                   16 Invoice IRN Failure and manual retry
5 Production Inward to Inventory               17 IRN-generated Invoice to partial Credit Note
6 Challan with allocation                      18 Credit Note approval and IRN
7 Challan approval then Invoice approval       19 Material Ledger drill-down
8 Later Invoice                                20 Inventory report drill-down
9 Number reservation and consumption           21 User access assignment
10 Customer rejection                          22 Active Role switch and permission change
11 Partial reassignment                        23 Audit history inspection
12 Material Return approval                    24 Statutory deadline blocked action

The exact source and destination Frame IDs for every connection are in Blueprint Section 18.

COMPONENTS TO INSTANTIATE
TRANSITIONS:
  Instant everywhere, EXCEPT a panel expanding in place, which uses Smart Animate at 200ms.
  No dissolves. No slide-ins between screens. Animation on data-dense screens obscures.

OVERLAY BEHAVIOUR:
  Dialogs close on Escape and scrim click.
  EXCEPT OV-06 Mandatory Reason and OV-13 Deactivation Warning, which close ONLY through Cancel.

FOR EVERY FLOW:
  Declare the starting frame explicitly on the board.
  Wire a working BACK path. A prototype that traps the reviewer is a defect.
  Wire the DISABLED and FAILURE paths, not only the happy path.
  Reviewers need to see the blocked route.

CRITICAL FLOWS TO GET RIGHT:
  Flow 7  must show that approving the challan leaves the user ON THE PAGE, and that an
          invoice approval failure leaves the challan badge reading APPROVED.
  Flow 16 must show a FRESH manual recording after failure, not a retry.
  Flow 24 must end at the statutory block with NO override control.

SAMPLE DATA - use these exact values:
  Companies: Apex RMC Pvt Ltd (27AAACA1234A1Z5), Apex Aggregates Pvt Ltd (27AAACA5678B1Z9)
  Plants: Chakan Plant (shared), Talegaon Crusher Plant, Ranjangaon RMC Plant
  Users: R. Kumar (Plant Manager), S. Patil (Store Keeper + Billing Clerk),
         A. Deshpande (Accounts Manager), N. Joshi (Super Admin)
  Clients: Beta Constructions (27AAAAA0000A1Z5, Pune), Metro Infra (27AACCM8765D1Z7, Pune),
           Sunrise Developers (27AABCS4321C1Z2, Mumbai), Delta Supplies (27BBBBB1111B1Z3, Nashik)
  Client Sites: Hinjawadi Phase 2 (Beta), Wakad Tower Site (Metro Infra), Baner Road Project (Sunrise)
  Vendors: Western Cement Suppliers, Reliable Aggregates
  Vehicles: MH12AB1234 (30.000 MT), MH14XY5678 (25.000 MT)
  Raw Materials: OPC 53 Cement, 20 mm Aggregate, M-Sand - all MT
  Products: M25 RMC, M30 RMC, Crushed Sand - all MT
  Documents: CH-2026-000481, CH-2026-000478, INV-2026-000119, INV-2026-000122,
             CRN-2026-000031, INW-2026-000212, INW-2026-000230, WST-2026-000067,
             REJ-2026-000044, RES-000014, LOT-2026-00212, LOT-2026-00230
  All sample data is ILLUSTRATIVE.

AUTO LAYOUT
Boards are frames containing the flow frames arranged left to right with 200 between them.

STATES
No new states.

INTERACTIONS
This prompt IS the interaction work.

RESPONSIVE
Wire the desktop flows. Mobile flows are not separately wired in Phase 1.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Every frame. Create nothing new.

COMPLETION CHECKLIST
1. 24 flow boards exist.
2. Every destination frame exists. No broken connections.
3. Every flow has a working back path.
4. Disabled and failure paths are wired, not just happy paths.
5. Transitions are Instant except in-place panel expansion.
6. OV-06 and OV-13 do not close on scrim click.
7. Flow 7 shows the user staying on the page after challan approval.

STOP CONDITION
Stop after Flow 24. Do not modify any frame.
```

## P29 — Content audit

*Blueprint reference: Blueprint Section 19*
*Figma page: `21 — Content & Error Catalogue`*

```
OBJECTIVE
Audit every string in the file against the Content Catalogue and build the catalogue page. Report findings; fix only what you are asked to fix.

EXISTING WORK TO REUSE
The complete file as built by P00 to P28.

FIGMA PAGE
21 — Content & Error Catalogue

FRAMES TO CREATE
Build 10 catalogue frames on page "21 — Content & Error Catalogue":
1 Buttons · 2 Labels · 3 Helper · 4 Confirmations · 5 Warnings · 6 Errors
7 Empty States · 8 Disabled Reasons · 9 Success · 10 Loading

Then audit and report:
1  Does any button use "Confirm", "OK", "Yes" or "Submit" alone?
2  Does any label say "Delete" or "Remove" instead of "Deactivate"?
3  Does any error message contain a SUBSTITUTED value where a placeholder belongs
   in a COMPONENT DEFAULT text property? Frames may show substituted values; component
   defaults must carry the placeholder form.
4  Are all twelve approved error codes used verbatim where they apply?
5  Is the report no-data wording identical across all thirteen reports?
6  Does every disabled control carry a reason, and does any reason say "not allowed"?
7  Does any deadline message use a day count instead of an exact instant?
8  Are the two empty states - nothing exists and nothing matches - distinguished everywhere?

COMPONENTS TO INSTANTIATE
No new components. This is an audit.


AUTO LAYOUT
Coverage and catalogue boards: vertical, gap 24, padding 24.

STATES
No new states.

INTERACTIONS
None.

RESPONSIVE
Audit covers all breakpoints.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Everything. This prompt reports; it does not fix.

COMPLETION CHECKLIST
1. Every question above has been answered explicitly.
2. Findings are listed with frame names, not summarised.
3. Nothing has been changed.

STOP CONDITION
Stop after reporting. Do not fix anything until the findings are reviewed.
```

## P30 — Accessibility audit

*Blueprint reference: Blueprint Section 20*
*Figma page: `22 — QA Coverage`*

```
OBJECTIVE
Audit the 15 accessibility QA frames and report findings.

EXISTING WORK TO REUSE
The complete file as built by P00 to P28.

FIGMA PAGE
22 — QA Coverage

FRAMES TO CREATE
AUDIT THESE 15 FRAMES:
  D-SHELL-Default                            landmark order, skip link
  D-CHL-SCR-002-Create-Error                 validation summary focus, error association
  D-CHL-SCR-002-Create-Approved              line grid keyboard, allocation state in words
  D-INV-SCR-003-Review-PendingIRN            four disabled controls focusable with reasons
  D-INV-SCR-008-Create-IRNFailed             field set swap moves focus and announces
  D-INV-SCR-008-Create-PermissionRestricted  statutory block focus, timezone spoken in full
  D-DSP-SCR-003-Review-PermissionRestricted  hidden path leaves no trace
  D-IAM-SCR-001-Edit-PermissionRestricted    anti-escalation exposed as disabled
  D-RPT-SCR-006-Report-Default               ten-column table semantics, pinned column
  T-RPT-SCR-006-Report-Default               the one permitted internal scroll
  M-CHL-SCR-002-Create-Error                 card expansion, inline reasons, 44px targets
  D-AUD-SCR-001-View-Default                 ordered list, full timestamps, UTC line
  D-WST-SCR-001-Create-Draft                 upload progress and preview announced
  D-CMP-SCR-002-Edit-PermissionRestricted    OV-12 focus trap, assertive announcement
  D-DSH-SCR-001-View-Error                   partial failure announced without stealing focus

REPORT ON:
1  Does every focusable element have a 2px focus ring at 2px offset?
2  Are disabled controls still focusable so their reason is reachable?
3  Does any status render as colour alone?
4  Do all touch targets meet 44x44 with 8 separation on touch frames?
5  Is any table built from divs rather than real table semantics?
6  Does any accessible name omit its dimension, e.g. "Apex RMC" instead of
   "Company, currently Apex RMC"?
7  Is the timezone spoken in full on every deadline?
8  Does closing any overlay fail to restore focus to its trigger?

COMPONENTS TO INSTANTIATE
No new components. This is an audit.


AUTO LAYOUT
Coverage and catalogue boards: vertical, gap 24, padding 24.

STATES
No new states.

INTERACTIONS
None.

RESPONSIVE
Audit covers all breakpoints.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Everything. This prompt reports; it does not fix.

COMPLETION CHECKLIST
1. Every question above has been answered explicitly.
2. Findings are listed with frame names, not summarised.
3. Nothing has been changed.

STOP CONDITION
Stop after reporting. Do not fix anything until the findings are reviewed.
```

## P31 — Visual consistency audit

*Blueprint reference: Blueprint Sections 5, 6, 7, 10*
*Figma page: `22 — QA Coverage`*

```
OBJECTIVE
Audit the whole file for consistency and report findings.

EXISTING WORK TO REUSE
The complete file as built by P00 to P28.

FIGMA PAGE
22 — QA Coverage

FRAMES TO CREATE
REPORT ON:
1  Any layer using a hard-coded colour instead of a variable. List frame and layer.
2  Any Auto Layout gap or padding not bound to a Spacing variable.
3  Any text layer not using a named text style.
4  Any detached component instance.
5  Any component recreated locally instead of instanced.
6  Any orphan style or variable not referenced by anything.
7  Any frame whose name does not match {Device}-{ScreenID}-{Mode}-{State}.
8  Any duplicate frame name.
9  Any numeric column not using tabular figures, or with a header aligned
   differently from its values.
10 Any Calculation Summary whose line order differs from the fixed order, or
   which hides the round-off row when zero.
11 Any component nested more than six levels deep.
12 Any permission-restricted frame the SAME HEIGHT as its default frame, which would
   indicate the control was greyed rather than removed.

COMPONENTS TO INSTANTIATE
No new components. This is an audit.


AUTO LAYOUT
Coverage and catalogue boards: vertical, gap 24, padding 24.

STATES
No new states.

INTERACTIONS
None.

RESPONSIVE
Audit covers all breakpoints.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Everything. This prompt reports; it does not fix.

COMPLETION CHECKLIST
1. Every question above has been answered explicitly.
2. Findings are listed with frame names, not summarised.
3. Nothing has been changed.

STOP CONDITION
Stop after reporting. Do not fix anything until the findings are reviewed.
```

## P32 — Final coverage audit

*Blueprint reference: Blueprint Sections 23, 24*
*Figma page: `22 — QA Coverage`*

```
OBJECTIVE
Compare the built file against the CSV manifest and report coverage. Change nothing.

EXISTING WORK TO REUSE
The complete file as built by P00 to P28.

FIGMA PAGE
22 — QA Coverage

FRAMES TO CREATE
Build 5 coverage boards on page "22 — QA Coverage":
1 Screen Coverage · 2 State Coverage · 3 Permission Coverage
4 Accessibility QA List · 5 Gap Register

Then report:
1  Are all 62 Screen IDs present as frames? List any missing.
2  Does every row of the CSV manifest have a corresponding frame? List any missing.
3  Does every frame have a manifest row? List any extra.
4  Are there duplicate frame names? List them.
5  Does any frame contain a combined Challan and Invoice approval control, or the
   string "Save and Approve Both"?
6  Does any frame show a live IRN integration, connection status, queue or automatic retry?
7  Does any frame contain a Delete action?
8  Does any audit frame contain an edit or delete control?
9  Does any report show an inventory valuation column?
10 Does any Status Badge render without a text label?
11 Does any mobile frame contain a horizontally scrolling table other than the permitted
   T-RPT-SCR-006 tablet exception?
12 Does any prototype connection point at a frame that does not exist?
13 Are the sample document numbers consistent across connected frames
   (CH-2026-000481, INV-2026-000119, CRN-2026-000031, INW-2026-000212, WST-2026-000067)?
14 Do the reconciliation checks hold: allocation 18.000 + 12.000 = 30.000;
   disposition 3.000 + 7.000 + 2.000 = 12.000; ledger closing 116.000?

Report findings only. Do not fix anything until findings are reviewed.

COMPONENTS TO INSTANTIATE
No new components. This is an audit.


AUTO LAYOUT
Coverage and catalogue boards: vertical, gap 24, padding 24.

STATES
No new states.

INTERACTIONS
None.

RESPONSIVE
Audit covers all breakpoints.

CONSTRAINTS - apply to this prompt without exception:
- Create ONLY the frames named in this prompt. Nothing extra, however reasonable it seems.
- Do NOT recreate any existing component. Instance what already exists.
- Do NOT detach any component instance. Use component properties for variations.
- Do NOT rename any existing layer, frame, component, variable or style.
- Do NOT redesign any frame completed by an earlier prompt.
- Preserve every variable binding and every Auto Layout setting.
- Bind every colour, spacing and type value to a token. No hard-coded values.
- If a dependency this prompt needs does not exist, STOP and report what is missing. Do not invent it.
- STOP when this prompt is complete. Do not continue to the next module.

WHAT MUST NOT CHANGE
Everything. This prompt reports; it does not fix.

COMPLETION CHECKLIST
1. Every question above has been answered explicitly.
2. Findings are listed with frame names, not summarised.
3. Nothing has been changed.

STOP CONDITION
Stop after reporting. Do not fix anything until the findings are reviewed.
```

---

## Prompt to frame coverage

Every frame in the CSV manifest carries a Prompt ID. Filter the CSV to verify a module is complete.

| Prompt | Frames | Screens |
|---|---|---|
| P08 | 5 | 1 |
| P09 | 32 | 4 |
| P10 | 48 | 6 |
| P11 | 41 | 5 |
| P12 | 30 | 4 |
| P13 | 24 | 4 |
| P14 | 34 | 4 |
| P15 | 13 | 1 |
| P16 | 28 | 3 |
| P17 | 25 | 3 |
| P18 | 21 | 2 |
| P19 | 36 | 4 |
| P20 | 10 | 1 |
| P21 | 24 | 2 |
| P22 | 16 | 2 |
| P23 | 78 | 13 |
| P24 | 26 | 2 |
| P25 | 5 | 1 |
| P26 | 107 | 62 |
| P27 | 3 | 3 |
| **Total** | **606** | **62** |

---

## Credit-saving guidance

- Run prompts in order. Re-running an earlier prompt after later work duplicates components.
- If a prompt fails partway, do not re-run it whole. Ask what was completed, then run only the remainder.
- P03, P04 and P06 are the largest component prompts. Split them at component-ID boundaries if they fail.
- Never paste two prompts together. The checkpoint between them is what stops errors compounding.
- If Figma AI proposes a component, colour, field or string not in this pack, reject it. Everything needed is specified; anything extra is invention.
- Lock pages 01 to 04 after P07. It prevents module prompts from silently editing foundations.
