Samples
Catalog and matrix samples
Three artifacts as they ship: a behavior-catalog excerpt with its migration decisions, an enforcement-matrix excerpt with its three cell classes, and the coverage boundary. The rows come from the Bugzilla teardown, so the cited source is public and checkable.
Artifact · Behavior catalog
Catalog excerpt, with migration decisions
Each behavior carries typed semantics, a provenance citation into Bugzilla's source, its epistemic tier, and the decision made when the system was rebuilt. On a rebuild engagement, the migration column is part of what you approve before construction starts.
| ID | Behavior | Kind | Semantics | Provenance | Tier | Migration decision |
|---|---|---|---|---|---|---|
| bug.create-bug.missing-summary | A bug cannot be filed with an empty summary. | validation | cmd create-bug · require summary ≠ '' | Bugzilla/Bug.pm:1163 | Proven An artifact is on disk or a test ran green. | Port as-is |
| bug.mark-bug-duplicate.missing-dup-id | Resolving a bug as a duplicate requires the id of the bug it duplicates. | validation | cmd mark-bug-duplicate · require dupId present | Bugzilla/Bug.pm:1488 | Proven An artifact is on disk or a test ran green. | Port as-is |
| bug.assign-bug.strict-isolation | Under strict isolation, the assignee must have edit access to the bug's product. | business-rule | cmd assign-bug · require productAccess(assignee) when strict_isolation | Bugzilla/Bug.pm:2241 | Traced in source Read from code, not yet run against a live system. | Port as-is |
| bug.update-bug-status.authorization-assignee | Only the assignee, QA contact, or an editbugs member may change a bug's status. | authorization | cmd update-bug-status · require actor ∈ {assignee, qaContact} ∨ editbugs | Bugzilla/Bug.pm:1377 | Traced in source Read from code, not yet run against a live system. | Port as-is |
| bug.add-comment.body-max-length | A comment body may not exceed 65,535 characters. | validation | cmd add-comment · require len(body) ≤ 65535 | Bugzilla/Bug.pm:2840 | Proven An artifact is on disk or a test ran green. | Port as-is |
| bug.mark-bug-duplicate.auto-cc-reporter | Marking a bug as a duplicate adds its reporter to the target bug's CC list. | business-rule | on mark-bug-duplicate · effect target.cc += reporter | Bugzilla/Bug.pm:1530 | Traced in source Read from code, not yet run against a live system. | Port as-is |
| user.create-user.invalid-email-regexp | A login name must match the system's email pattern. | validation | cmd create-user · require login ~ emailregexp | Bugzilla/User.pm:1684 | Proven An artifact is on disk or a test ran green. | Port as-is |
| product.create-component.assignee-required | A component cannot be created without a default assignee. | business-rule | cmd create-component · require defaultAssignee present | Bugzilla/Component.pm:142 | Proven An artifact is on disk or a test ran green. | Port as-is |
| attachment.create-attachment.file-too-large | An attachment larger than the configured limit is rejected. | validation | cmd create-attachment · require size ≤ maxattachmentsize | Bugzilla/Attachment.pm:512 | Proven An artifact is on disk or a test ran green. | Port as-is; the limit moves to service configuration |
| attachment.request-flag.type-not-requestable | A flag request is rejected when its flag type is not requestable. | validation | cmd request-flag · require flagType.isRequestable | Bugzilla/Flag.pm:388 | Traced in source Read from code, not yet run against a live system. | Port as-is |
| notification.get-notification-preferences.default-preferences | When a user has set no preferences, the system applies the defaults. | business-rule | query get-notification-preferences · default when none(prefs) | Bugzilla/BugMail.pm:204 | Traced in source Read from code, not yet run against a live system. | Port: preferences move behind the notification service |
| notification.send-test-notification.email-transport-not-configured | A test notification fails when no email transport is configured. | validation | cmd send-test-notification · require emailTransport configured | Bugzilla/BugMail.pm:331 | Probe candidate Needs a live environment to settle. Never presented as a confirmed defect. | Port: delivery moves behind the notification service |
Artifact · Enforcement matrix
Enforcement-matrix excerpt
The matrix crosses every frontend gate against every backend guard and classes each rule. Most rules land in both layers, which is the point: the control group is what makes the exceptions findings rather than noise. These rows come from the rebuilt Bugzilla stack.
- Both layers
- The control group: the rule holds wherever you hit it.
- UI only
- The finding class: the frontend promises what the backend never checks.
- Backend only
- The inverse: the server refuses what the UI lets you attempt.
| Rule | Frontend gate | Backend guard | Class |
|---|---|---|---|
| Summary required to file a bug | frontend/src/views/BugCreate/BugCreate.tsx:88 | services/service-bug/service/src/commands/create-bugHandler.ts:24 | Both layers |
| Attachment size limit | frontend/src/views/BugDetail/BugDetail.tsx:214 | services/service-attachment/service/src/commands/create-attachment-Handler.ts:33 | Both layers |
| Comment length capped at 65,535 characters | frontend/src/views/BugDetail/BugDetail.tsx:147 | services/service-bug/service/src/commands/add-commentHandler.ts:29 | Both layers |
| Duplicate id must reference a different, existing bug No backend guard found at generation time; flagged, then fixed in the same run. | frontend/src/views/BugDetail/BugDetail.tsx:302 | none found | UI only |
| Target milestone limited to the product's milestones The select constrains the value; the command accepted any string. | frontend/src/views/BugDetail/BugDetail.tsx:219 | none found | UI only |
| Reassignment restricted to editbugs members The UI shows the assignee field to every signed-in user; the server refuses. | none found | services/service-bug/service/src/commands/assign-bug-Handler.ts:57 | Backend only |
| Security-group changes restricted to members of the group The checkboxes render for everyone; the command rejects non-members. | none found | services/service-bug/service/src/commands/add-bug-groupHandler.ts:31 | Backend only |
The finding class on a client estate, redacted
Probe candidate Needs a live environment to settle. Never presented as a confirmed defect.
The same UI-only class as it appears in practice: a rule the frontend promises at
serverless-████-service/███Form.tsx:59Path partially redacted. with no corresponding
backend guard found. It stays a probe candidate, with the exact API call that settles it,
until it's run against a live environment.
Artifact · Coverage boundary
The boundary, as it ships
Every catalog ends with this block: what was read, what wasn't, and what that means for the findings. It's rendered below exactly as a client receives it, populated from the Bugzilla teardown.