The project-level MDL/RSK rollup specs lose `addable: false` and gain
a sibling form schema (default-project-{mdl,rsk}.form.yaml) that
makes `party` a required field. + Add row on the rollup view is now
live: the user types the party name in the Package column, the
server reads `party` from the body, validates that
<project>/archive/<party>/ exists on disk, strips the field, and
writes the row into archive/<party>/<slot>/<date>-<email>.yaml. The
response Location is the synthetic <project>/<slot>/<party>__<file>.yaml
URL so the rollup table client swaps the draft URL cleanly.
Wrong party = 422 with a clear error pointing at the SSR view as the
place to create the folder first. No auto-creation here — the rollup
is for filing deliverables/risks against existing packages, not for
spinning up new ones.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
2.1 KiB
YAML
82 lines
2.1 KiB
YAML
# Default project-rollup RSK row schema, served by zddc-server when
|
|
# no operator-supplied form.yaml exists at <project>/rsk/.
|
|
#
|
|
# Identical to the per-party RSK schema (default-rsk.form.yaml)
|
|
# except for one extra required field: `party`. The server reads it
|
|
# on POST <project>/rsk/form.html and routes the row to the matching
|
|
# <project>/archive/<party>/rsk/ folder. The `party` value is
|
|
# stripped from the YAML on write (folder name IS the identity); on
|
|
# read the dispatcher injects it back.
|
|
#
|
|
# To customize: drop your own form.yaml at <project>/rsk/form.yaml.
|
|
# Keep the `party` field shape unless you also customize the rollup
|
|
# create handler.
|
|
|
|
title: Risk (project rollup)
|
|
description: One risk across all parties. The first field (Package) routes the row to the matching archive/<party>/rsk/ folder; the rest mirrors the per-party RSK schema.
|
|
|
|
schema:
|
|
type: object
|
|
required: [party, id, title]
|
|
additionalProperties: false
|
|
properties:
|
|
party:
|
|
type: string
|
|
title: Package (party folder)
|
|
description: Routing key — must match an existing <project>/archive/<party>/ folder.
|
|
pattern: "^[A-Za-z0-9][A-Za-z0-9.-]*$"
|
|
minLength: 1
|
|
id:
|
|
type: string
|
|
title: ID
|
|
description: Stable identifier, e.g. R-001.
|
|
minLength: 1
|
|
title:
|
|
type: string
|
|
title: Risk
|
|
minLength: 1
|
|
category:
|
|
type: string
|
|
title: Category
|
|
description:
|
|
type: string
|
|
title: Description
|
|
likelihood:
|
|
type: integer
|
|
title: Likelihood
|
|
minimum: 1
|
|
maximum: 5
|
|
impact:
|
|
type: integer
|
|
title: Impact
|
|
minimum: 1
|
|
maximum: 5
|
|
severity:
|
|
type: integer
|
|
title: Severity
|
|
minimum: 1
|
|
maximum: 25
|
|
mitigation:
|
|
type: string
|
|
title: Mitigation
|
|
owner:
|
|
type: string
|
|
title: Owner
|
|
status:
|
|
type: string
|
|
title: Status
|
|
enum: [open, mitigated, accepted, closed]
|
|
dueDate:
|
|
type: string
|
|
title: Due date
|
|
format: date
|
|
notes:
|
|
type: string
|
|
title: Notes
|
|
ui:
|
|
description:
|
|
ui:widget: textarea
|
|
mitigation:
|
|
ui:widget: textarea
|
|
notes:
|
|
ui:widget: textarea
|