Skip to content

Merge beta into next - #496

Merged
seansica merged 16 commits into
nextfrom
beta
Sep 10, 2026
Merged

Merge beta into next#496
seansica merged 16 commits into
nextfrom
beta

Conversation

@seansica

Copy link
Copy Markdown
Contributor

Features

• Release Track tabs changed to "Board", "Releases", and "Config".
• The ability to delete release tracks is moved to the bottom of the Config tab.
• Metadata for the x-mitre-collection object emitted in STIX 2.1 bundles is now more steerable. Users can select the publishing identity (created_by_ref), collection markings (which appears in the collection's object_marking_refs list), collection ID, and the collection's created timestamp. The latter two cannot be changed after the first snapshot is persisted because it would break the provenance/lineage of snapshots. We hope this will make the x-mitre-collection object less opaque to Workbench editors..
• The publishing identity can optionally be set to inherit from the organization/global identity. Otherwise, users can select from any available STIX identity in the object library..
• Similarly, the collection marking can be set to inherit from the organization/global marking definition. Otherwise, users can select from any available marking definition in the object library..
• Users can now configure custom aliases for their release track ID which maps to a valid URL slug. For example, rather than reach the release track via /api/release-tracks/release-track-${uuid}, users can set alias to something like defense-team and route to the track via /api/release-tracks/defense-team..
• The snapshot cards visible on the Releases tab have been visually overhauled..
• The user workflows for creating snapshots is more simpler and more intuitive. For standard tracks, the "preview and release" button as well as the "create draft" button have been removed. We realized that these were unnecessary because the Workbench automatically creates a new draft whenever a change occurs — now, that draft is always shown at the top of the Releases tab, and it's marked accordingly with a label that says "latest". Thus, users need not think about creating standard track snapshots. Instead, they just need to think about whether and when the latest (draft) snapshot is ready to be tagged and released. For virtual tracks, the "create draft" button still exists..
• Each snapshot card now shows which user identity was causally associated with its creation..
• Each snapshot card now shows the causal operation that triggered the snapshot to be created. For example, "candidates added" indicates that a draft was created as a result of a new candidate being added; "scheduled snapshot" indicates that a snapshot was created through the track's cron-based scheduling mechanism; etc..
• The frontend now fully supports configuring virtual track cron schedules..
• Users can now convert snapshots between tagged and draft status..
• Users can delete draft snapshots. Guardrails exist to ensure that delete operations do not result in fragmented snapshot lineages..
• Users can now change the semver release value of a tagged snapshot after the tagging operation..
• In all such cases where the x-mitre-collection object may be effected, the STIX 2.1 SHA-256 hash will be recomputed..
• Two new data quality dashboards have been added: "Cross-Domain Relationships" and "Objects Without Domains"..

Bugs

• Various bugs were resolved effecting the accuracy of snapshot graph provenance. In some cases, data leaks were occurring whereby unreleased objects in the staged tier were being observed in emitted STIX bundles. These issues have been resolved..
• Fixed an issue with the "Duplicate Relationships" dashboard function that was causing the backend to crash when the Data Quality page was opened.

seansica and others added 16 commits August 18, 2026 16:14
Remove tests, correction logic, and documentation tied to retired alpha/beta migrations. Document that prerelease databases must be recreated and reserve migrations for stable release upgrade paths.
Make every snapshot deterministic from birth. A content manifest is
sealed whenever a snapshot's members are written (track creation,
release commit, virtual materialization, bundle import, quarantine
promotion, track clone) and inherited by reference by every other
clone; it is discarded only when no snapshot references it. One
closed-member algorithm selects relationships whose source and target
IDs are both members and pins them to the member revisions; supporting
identities and marking definitions and non-emitted LinkById targets are
recorded as dependencies. No secondary SDO is ever discovered through a
relationship, and bundle export has exactly one path: replay the
manifest. The opt-in graph cache and its create/delete endpoints are
removed; the admin-only source-attested reconstruction remains and
requires replace_manifest_id.

Stop cloning relationships when an endpoint revision advances. Exact
pairing for a release lives in the sealed manifest; the create-time
endpoint pins stay as authoring context and the release preview reports
relationships added, removed, and authored against other revisions.

Project the x-mitre-collection object from the snapshot and a new
config.publication rule instead of storing it: identity and markings
inherit the organization settings unless overridden, collection id and
created default to track-derived values and lock after the first
release, modified is the snapshot timestamp, and drafts omit
x_mitre_version. Release commit freezes the resolved values, assigns a
stable bundle id, and stores SHA-256 hashes of both serializations;
include is a draft-only preview and includeToc is gone. Notes are
immutable once released.

Name storage for what it holds: releaseTrackContentManifests and
releaseTrackContentManifestEntries with release-track-content-manifest
ids, a required seal_reason instead of resolver_version and
baseline_reconstruction, outstanding-work-only releaseTrackReconciliations,
and no config.include_secondary_objects. The 20260902120000 migration
upgrades existing databases in place (dry run:
npm run preview:content-manifests), skips unregistered release-track
collections, and names the failing snapshot and missing references on
any integrity error; the 20260730180000 migration no longer creates
manifests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Restore the ability to remove a tagged snapshot, which the sealed-manifest
work had closed off entirely. Only the track's most recent release may be
deleted, so the version order of the remaining releases and the provenance
of any later release are never disturbed.

Deleting a release requires the administrator role (403 otherwise, via the
new InsufficientRoleError) and a `confirm_version` query parameter equal to
the release version (400 otherwise). The release's ledger entry is retracted
from every remaining snapshot so the version becomes available again, its
content manifest is discarded when nothing else references it, the registry
catalogue is reconciled, later drafts are kept, and a `delete_release` audit
event is recorded. Deleting an older release, or one followed by a later
release, returns 409.

Drafts keep the ordinary editor deletion path; the release branch shares the
snapshot deletion route, so the service checks the role itself.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bundle exports replay the sealed content manifest and nothing else. The
draft-only `include=staged,candidates` / `state` bundle preview is removed:
it produced bundles that matched no manifest, duplicated the release preview
(`.../release/preview?format=bundle`, which stays the one live path), and the
frontend's Export Latest was sending `include=all` and getting 400.
`format=bundle` now rejects `include` explicitly so a caller who asked for
workflow tiers never mistakes a members-only bundle for the preview they
requested; `state` is gone from the OpenAPI spec.

Workbench tier entries now carry `type` and `x_mitre_version`, and the
relationship-change preview resolves relationships only (no supporting
objects or LinkById targets). This lets the frontend stop downloading the
entire object catalogue on every release preview.

Tracks gain an optional alias: a URL-safe slug stored on the registry under
a partial unique index and accepted on every `:id` route. An Express
`router.param('id')` resolver rewrites an alias to the canonical track ID
before any handler runs, so services only ever see canonical IDs and an
unknown alias is a 404 rather than a stray collection name. Aliases are set
at creation or through `POST /:id/meta` (`null` clears); an alias-only
update does not clone a snapshot. Workbench snapshot responses and registry
entries carry `alias`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Release-track bundles no longer discover objects through relationships: a
relationship ships only when both of its endpoints are members of the same
track. Content whose endpoints can never share a domain track is therefore
unpublishable, and nothing surfaced it.

`GET /api/reports/domain-consistency` lists the latest revisions of active
relationships whose source and target objects share no `x_mitre_domains`
value (with the latest endpoint objects and their domains) and the latest
revisions of active domain-bearing objects that declare no domain, plus
counts. Endpoints are evaluated at their latest revision, so adding the
missing domain in a new revision clears the finding.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…etagging

Protect virtual dependencies, publish retag hashes atomically, recover interrupted updates, and validate destructive confirmation under the release lock.
Persist validated schedule replacements without cloning snapshots and expose active schedules to configuration clients.
…ng-ui

feat(release-tracks): support virtual schedule updates
Include recorded component snapshot metadata in virtual snapshot history summaries. Document exact source versions, creation timestamps, filters, and contribution counts in OpenAPI and user documentation, with regression coverage.
Merge feat/rollback-tagged-snapshot while preserving virtual scheduling and
snapshot composition provenance already present on beta. Resolve the TODO
conflict by retaining both implementation records and record merge checks.

Validation: 84 focused tests; full suite passes (2 OpenAPI, 22 config,
1037 API, 29 middleware, 10 scheduler); lint passes. An intermittent HTTP
404 passed in isolation and on the complete rerun.
Add confirmed release-to-draft conversion and restore guarded draft deletion. Preserve source drafts, composition provenance, dependency checks, and release serialization.
Record the approved responsive header layout, timestamp metadata treatment, and regression verification while preserving unrelated provenance work.
Persist creation causes and invoking users, distinguish standard release creation, and expose safe creator metadata through snapshot GETs.
Normalize Markdown table padding and separator widths without changing content.
Filter duplicate groups in MongoDB before fetching full relationships, limit endpoint lookups to their latest revisions, and consume results through a batched cursor. Add history and lifecycle regressions and document remaining response-size limits.
@seansica seansica self-assigned this Sep 10, 2026
@codecov-commenter

codecov-commenter commented Sep 10, 2026

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 90.11023% with 323 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.12%. Comparing base (b2ea605) to head (65ebb4e).
⚠️ Report is 18 commits behind head on next.

Files with missing lines Patch % Lines
...ervices/release-tracks/content-manifest-service.js 83.55% 156 Missing and 4 partials ⚠️
app/services/release-tracks/snapshot-service.js 89.94% 40 Missing ⚠️
app/services/release-tracks/versioning-service.js 85.31% 26 Missing ⚠️
...release-tracks/release-track-dynamic.repository.js 86.58% 22 Missing ⚠️
app/controllers/release-tracks-controller.js 86.02% 19 Missing ⚠️
...elease-tracks/release-track-registry.repository.js 67.79% 19 Missing ⚠️
app/services/release-tracks/publication-service.js 93.88% 8 Missing and 3 partials ⚠️
...p/services/release-tracks/virtual-track-service.js 91.30% 9 Missing and 1 partial ⚠️
app/lib/release-tracks/export-schemas.js 92.30% 5 Missing ⚠️
app/controllers/reports-controller.js 80.00% 4 Missing ⚠️
... and 4 more
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@            Coverage Diff             @@
##             next     #496      +/-   ##
==========================================
+ Coverage   80.16%   81.12%   +0.95%     
==========================================
  Files         242      245       +3     
  Lines       38167    39356    +1189     
  Branches     4646     4820     +174     
==========================================
+ Hits        30597    31926    +1329     
+ Misses       7483     7342     -141     
- Partials       87       88       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 4.20.0-beta.30 🎉

The release is available on:

Your semantic-release bot 📦🚀

@seansica
seansica changed the base branch from main to next September 10, 2026 15:49
@seansica
seansica merged commit b47065b into next Sep 10, 2026
8 checks passed
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 4.21.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants