Feat/sealed content manifests - #953
Open
seansica wants to merge 5 commits into
Open
Conversation
Saving a relationship resets its source and target objects to work-in-progress through PUT again instead of creating new revisions. Workflow state is workspace metadata, not STIX content, so the in-place update never touches a sealed revision, and the two extra object revisions (and the snapshot churn they triggered) per relationship save are gone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Align the release-track page with sealed content manifests: every snapshot now seals its content when members are written, so the bundle cache controls, cache status, and cache statistics are removed. Cards show content statistics; released snapshots show their stable bundle id and SHA-256 hashes; notes are editable on drafts only. Add a Publication section to track configuration: the publishing identity and collection markings inherit from organization settings unless overridden, with the resolved value and its source displayed, and collection id and created overrides that lock after the first release. Virtual tracks save publication settings after their composition. Rename the History tab to Releases, drop the per-snapshot Sealed chip, remove the dead Secondary Objects configuration section, and let administrators delete the most recent release from its card with a typed version confirmation. The release preview shows relationships sealed, added, dropped, and authored against other endpoint revisions. Fix Edit Config crashing on virtual tracks: the connector's identity and marking getters return functions that must be invoked as methods. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Release-track bundles only ship a relationship when both endpoints are members of the same track, so a relationship whose objects share no domain can never be published, and nothing in the UI pointed editors at such content. The Data Quality page now lists cross-domain relationships (source, target, their domains, and links to each object) and domain-bearing objects that declare no domain, backed by GET /api/reports/domain-consistency. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The release-track page had three overlapping ways to act on a draft: the header's Preview & Release (tag the latest draft), each draft card's Preview & Tag, and an Export Latest that duplicated the card export and was sending `include=all` to the bundle endpoint, which now rejects it. Track deletion sat beside them in the header. The page now follows one linear flow. The Board tab (formerly Details) manages what the next draft contains; the header keeps only Create Draft for virtual tracks; a draft is previewed and tagged from its card on the Releases tab; and deleting the track moves to a danger zone at the bottom of Config. Bundle exports send only the STIX version. Preview & Tag no longer downloads the whole object catalogue to label tier entries — the workbench snapshot carries each entry's type and version — and the buttons show a "Preparing preview" state while the preview loads. Only the most recent release offers Delete release, since any other card would always be refused. Tracks can carry an alias: the Config tab's Address card edits it (validated slug with a URL preview, saved through the metadata endpoint before the config write), track cards navigate by alias, and the page adopts the canonical id from the loaded snapshot so confirmations never see the alias. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Disabling a button for the duration of a multi-second request (creating a virtual draft, preparing or committing a release, deleting a release or the track, saving the configuration) read as a frozen page rather than work in progress, and the release commit had no indicator at all. A page-level activity bar — an indeterminate progress bar with a message naming what the server is doing — now appears under the header for every such operation, and the triggering button shows a spinner with a "Creating draft" / "Preparing preview" label. One getter derives the message from the existing busy flags so new operations have a single place to plug in. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## beta #953 +/- ##
==========================================
- Coverage 48.05% 46.02% -2.03%
==========================================
Files 205 205
Lines 27110 27168 +58
Branches 2132 1912 -220
==========================================
- Hits 13028 12505 -523
- Misses 14037 14596 +559
- Partials 45 67 +22 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. Saving a relationship no longer spawns endpoint revisions
What was wrong
When a relationship was saved, the page reset its source and target objects to work-in-progress by POSTing them, which created a brand-new revision of each endpoint. Combined with the API's relationship-advancement cascade, one
relationship edit fanned out into new revisions of both endpoints and of every other relationship touching them.
What changed
Relationship.updateSourceTargetObjectnow updates the endpoints in place (PUT), so their workflow state resets without a new revision. The API side of the cascade is removed in the companionbetachange. Exact endpoint pairing nowlives in the snapshot's graph manifest.
2. The track page reflects sealed content and publication settings
What was wrong
The page exposed the old model: a per-snapshot "deterministic graph" that editors could create and delete, top-level marking refs that the API never used, an
include_secondary_objectssetting for a feature that doesn't exist, and no way to see or set the identity and markings that end up in the emittedx-mitre-collectionobject. Editing a virtual track's config crashed (Cannot read properties of undefined (reading 'apiUrl')) because two service getters were referenced instead of called.What changed
bundle_idand copyable SHA-256 hashes for both STIX serializations (equivalent tosha256sumcommand). The graph create/delete actions are gone because every snapshot is sealed.track,global,derived,content). Virtual tracks save it in the same chain as their composition.3. Data Quality page: domain consistency report
What was missing
Bundles now ship a relationship only when both endpoints are members of the same track. A relationship whose objects share no domain, or an object with no domain at all, can never be published, and nothing pointed editors at that content.
What changed
Two sections on the dashboard's Data Quality page:
GET /api/reports/domain-consistency. Fix findings at the source: revise the object with the right domain, or deprecate the relationship.4. The draft-then-tag UX flow
What was wrong
The track page offered too many overlapping ways to act on a draft:
include=all(the workbench tier selector) to the bundle endpoint, which now rejects it. The first tab was called Details although it is where the next draft is assembled.What changed
One linear flow, as decided in review:
Export Latest and the header's Delete and Preview & Release are gone;
app-stix-page-tabsgained adetailsLabelinput so the first tab can be named for what it is.5. Preview & Tag is fast and visibly in progress
What was wrong
Opening a release preview took ten seconds or more with no feedback. The page was downloading the entire object catalogue with every revision (
getAllObjects({ versions: 'all' })) on each preview, only to look up each tier entry's type and version for the dialog.What changed
The workbench snapshot now carries
typeandx_mitre_versionon every tier entry (requires companion backend change), so the catalogue download is gone and only the Workbench attack type is derived locally.Long operations are now visibly working rather than merely disabling a button. A page-level activity bar (indeterminate progress bar plus a message naming what the server is doing) appears under the header for every multi-second operation on the page. Creating a virtual draft, preparing a release preview, committing the tag (which previously had no indicator at all), deleting a release or the track, and saving the configuration. Plus the triggering button (Create Draft, Preview & Tag) shows a spinner with a "Creating draft" / "Preparing preview" label.
6. Track aliases
What was missing
Track pages lived at
/dashboard/release-management/release-track--<uuid>.What changed
The Config tab's Address card edits the track's alias (validated slug, live URL preview). Track cards navigate by alias when one exists, and the route accepts either form. Because the alias is registry metadata rather than snapshot content, the config save first applies an alias change through
POST /:id/metaand then performs the config write; after loading a snapshot the page adopts the canonical id it returns, so deletion confirmations and comparisons never see the alias.