{
  "studyId": "project-brief-structure-rubric",
  "version": "1.0.0",
  "studyDate": "2026-09-16",
  "runId": "d1acf8d76d0cc7c9",
  "question": "Which structural gaps does a disclosed eight-check rubric detect across six deliberately varied fictional project briefs?",
  "fixtureStatus": "fictional-scenarios-not-human-or-production-results",
  "scoringNote": "One point per deterministic structural check. Scores do not measure product quality, user value, test coverage or readiness.",
  "datasetLicense": {
    "name": "CC0 1.0 Universal",
    "url": "https://creativecommons.org/publicdomain/zero/1.0/",
    "scope": "The original fictional fixtures, machine-readable rubric specification, and generated result records are dedicated to the public domain. This dedication does not apply to linked or quoted third-party content or to third-party names, logos, and trademarks."
  },
  "provenance": {
    "fixturesSha256": "eda91f368b1e137d7ec9c2032450eccd42f73aebc586f4f5cbf190361a2fe8b6",
    "rubricSpecificationSha256": "d4232ed83ddffa82254ccf8896969548456910330215eab01434c4c868805044",
    "evaluatorSha256": "c1001c41af64fcd13c0aa3cf9fd2e078dc49eab8d48b4ccd00e14e60ffe6ef99",
    "resultsSha256": "c7f2240ccdcc040e5a59e5dad28ea548476a295b1420abaee179b5f9bdf190f9"
  },
  "rubricSpecification": {
    "schemaVersion": 1,
    "studyId": "project-brief-structure-rubric",
    "version": "1.0.0",
    "license": {
      "name": "CC0 1.0 Universal",
      "url": "https://creativecommons.org/publicdomain/zero/1.0/",
      "scope": "The original fictional fixtures, machine-readable rubric specification, and generated result records are dedicated to the public domain. This dedication does not apply to linked or quoted third-party content or to third-party names, logos, and trademarks."
    },
    "scoring": {
      "aggregation": "sum-passed-rules",
      "pointsPerPassedRule": 1,
      "possiblePoints": 8,
      "weights": "equal"
    },
    "terms": {
      "genericActors": [
        "user",
        "someone",
        "person",
        "people"
      ],
      "observableGoalActionPatterns": [
        "\\b(download|export|open|read|save|retain|remove|restore|share|sort|submit|view)\\b"
      ],
      "explicitBoundaryPatterns": [
        "\\b\\d+\\b",
        "\\b(no limit|none known|unknown|not yet known)\\b"
      ],
      "vagueOutcomePatterns": [
        "\\b(quickly|easy|easily|intuitive|seamless|correctly|properly|user.?friendly|works?|successful(?:ly)?)\\b"
      ]
    },
    "rules": [
      {
        "id": "specific-role",
        "label": "Names a role beyond a generic “user”",
        "semantics": {
          "operator": "normalized-not-in-set",
          "field": "actor",
          "normalization": [
            "trim",
            "lowercase"
          ],
          "set": "genericActors",
          "requireNonEmpty": true
        }
      },
      {
        "id": "observable-goal-action",
        "label": "Goal contains a disclosed observable-action token",
        "semantics": {
          "operator": "matches-any-pattern",
          "field": "goal",
          "patterns": "observableGoalActionPatterns",
          "flags": "i"
        }
      },
      {
        "id": "boundary-recorded",
        "label": "Constraints record a number or explicit uncertainty",
        "semantics": {
          "operator": "matches-any-pattern",
          "field": "constraints",
          "patterns": "explicitBoundaryPatterns",
          "flags": "i"
        }
      },
      {
        "id": "positive-case",
        "label": "Includes a positive case",
        "semantics": {
          "operator": "case-kind-present",
          "kind": "positive"
        }
      },
      {
        "id": "negative-case",
        "label": "Includes a negative case",
        "semantics": {
          "operator": "case-kind-present",
          "kind": "negative"
        }
      },
      {
        "id": "edge-case",
        "label": "Includes an edge case",
        "semantics": {
          "operator": "case-kind-present",
          "kind": "edge"
        }
      },
      {
        "id": "complete-steps",
        "label": "Every case has Given, When and Then text",
        "semantics": {
          "operator": "all-cases-fields-nonempty",
          "fields": [
            "given",
            "when",
            "then"
          ],
          "normalization": [
            "trim"
          ],
          "requireAtLeastOneCase": true
        }
      },
      {
        "id": "specific-outcomes",
        "label": "Non-empty outcomes avoid the disclosed vague-word list",
        "semantics": {
          "operator": "nonempty-case-field-matches-no-pattern",
          "field": "then",
          "normalization": [
            "trim"
          ],
          "patterns": "vagueOutcomePatterns",
          "flags": "i"
        }
      }
    ]
  },
  "fixtures": [
    {
      "id": "complete-mixed-cases",
      "label": "Complete mixed-case brief",
      "fictional": true,
      "actor": "Reader keeping a personal reading list",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Between 1 and 20 entries; plain-text export only; no synchronization.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains two titled entries in a chosen order.",
          "when": "The reader downloads and opens the text file.",
          "then": "Both titles appear once, in the same order."
        },
        {
          "kind": "negative",
          "given": "The list has no entries.",
          "when": "The reader requests a download.",
          "then": "The page says that one entry is required and does not request a file."
        },
        {
          "kind": "edge",
          "given": "The list contains exactly 20 titled entries.",
          "when": "The reader downloads and opens the text file.",
          "then": "All 20 titles appear once, in the displayed order."
        }
      ]
    },
    {
      "id": "happy-path-only",
      "label": "Happy path only",
      "fictional": true,
      "actor": "Reader keeping a personal reading list",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Between 1 and 20 entries; plain-text export only.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains two titled entries in a chosen order.",
          "when": "The reader downloads and opens the text file.",
          "then": "Both titles appear once, in the same order."
        }
      ]
    },
    {
      "id": "generic-role",
      "label": "Generic role",
      "fictional": true,
      "actor": "User",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Between 1 and 20 entries; plain-text export only.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains one titled entry.",
          "when": "The reader downloads and opens the text file.",
          "then": "The title appears once in the file."
        },
        {
          "kind": "negative",
          "given": "The list has no entries.",
          "when": "The reader requests a download.",
          "then": "The page says that one entry is required and does not request a file."
        },
        {
          "kind": "edge",
          "given": "The list contains exactly 20 titled entries.",
          "when": "The reader downloads and opens the text file.",
          "then": "All 20 titles appear once, in the displayed order."
        }
      ]
    },
    {
      "id": "unrecorded-boundary",
      "label": "Unrecorded boundary",
      "fictional": true,
      "actor": "Reader keeping a personal reading list",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Review the limits before implementation.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains one titled entry.",
          "when": "The reader downloads and opens the text file.",
          "then": "The title appears once in the file."
        },
        {
          "kind": "negative",
          "given": "The list has no entries.",
          "when": "The reader requests a download.",
          "then": "The page says that one entry is required and does not request a file."
        },
        {
          "kind": "edge",
          "given": "The list contains the agreed maximum number of entries.",
          "when": "The reader downloads and opens the text file.",
          "then": "Every displayed title appears once in the same order."
        }
      ]
    },
    {
      "id": "vague-outcome",
      "label": "Vague outcome",
      "fictional": true,
      "actor": "Reader keeping a personal reading list",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Between 1 and 20 entries; plain-text export only.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains one titled entry.",
          "when": "The reader requests a download.",
          "then": "The export works correctly."
        },
        {
          "kind": "negative",
          "given": "The list has no entries.",
          "when": "The reader requests a download.",
          "then": "The page says that one entry is required and does not request a file."
        },
        {
          "kind": "edge",
          "given": "The list contains exactly 20 titled entries.",
          "when": "The reader downloads and opens the text file.",
          "then": "All 20 titles appear once, in the displayed order."
        }
      ]
    },
    {
      "id": "unfinished-step",
      "label": "Unfinished step",
      "fictional": true,
      "actor": "Reader keeping a personal reading list",
      "goal": "Download the reading list and open it offline.",
      "constraints": "Between 1 and 20 entries; plain-text export only.",
      "cases": [
        {
          "kind": "positive",
          "given": "The list contains one titled entry.",
          "when": "The reader requests a download.",
          "then": ""
        },
        {
          "kind": "negative",
          "given": "The list has no entries.",
          "when": "The reader requests a download.",
          "then": "The page says that one entry is required and does not request a file."
        },
        {
          "kind": "edge",
          "given": "The list contains exactly 20 titled entries.",
          "when": "The reader downloads and opens the text file.",
          "then": "All 20 titles appear once, in the displayed order."
        }
      ]
    }
  ],
  "results": [
    {
      "fixtureId": "complete-mixed-cases",
      "fixtureLabel": "Complete mixed-case brief",
      "fictional": true,
      "score": 8,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": true
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": true
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": true
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": true
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": true
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": true
        }
      ]
    },
    {
      "fixtureId": "happy-path-only",
      "fixtureLabel": "Happy path only",
      "fictional": true,
      "score": 6,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": true
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": true
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": false
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": false
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": true
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": true
        }
      ]
    },
    {
      "fixtureId": "generic-role",
      "fixtureLabel": "Generic role",
      "fictional": true,
      "score": 7,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": false
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": true
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": true
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": true
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": true
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": true
        }
      ]
    },
    {
      "fixtureId": "unrecorded-boundary",
      "fixtureLabel": "Unrecorded boundary",
      "fictional": true,
      "score": 7,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": true
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": false
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": true
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": true
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": true
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": true
        }
      ]
    },
    {
      "fixtureId": "vague-outcome",
      "fixtureLabel": "Vague outcome",
      "fictional": true,
      "score": 7,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": true
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": true
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": true
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": true
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": true
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": false
        }
      ]
    },
    {
      "fixtureId": "unfinished-step",
      "fixtureLabel": "Unfinished step",
      "fictional": true,
      "score": 7,
      "possible": 8,
      "checks": [
        {
          "id": "specific-role",
          "label": "Names a role beyond a generic “user”",
          "passed": true
        },
        {
          "id": "observable-goal-action",
          "label": "Goal contains a disclosed observable-action token",
          "passed": true
        },
        {
          "id": "boundary-recorded",
          "label": "Constraints record a number or explicit uncertainty",
          "passed": true
        },
        {
          "id": "positive-case",
          "label": "Includes a positive case",
          "passed": true
        },
        {
          "id": "negative-case",
          "label": "Includes a negative case",
          "passed": true
        },
        {
          "id": "edge-case",
          "label": "Includes an edge case",
          "passed": true
        },
        {
          "id": "complete-steps",
          "label": "Every case has Given, When and Then text",
          "passed": false
        },
        {
          "id": "specific-outcomes",
          "label": "Non-empty outcomes avoid the disclosed vague-word list",
          "passed": true
        }
      ]
    }
  ]
}
