diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.Recompile.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.Recompile.cs
index fb7b3b30..f0ea4323 100644
--- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.Recompile.cs
+++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.Recompile.cs
@@ -231,7 +231,7 @@ internal sealed partial class VisualBriefingBuildOrchestrator
var commitStage = GetStage(build, VisualBriefingBuildStage.COMMIT);
if (!revision.Success || revision.Version is null)
- throw new VisualBriefingBuildException(VisualBriefingFailureCode.STORE_FAILED, VisualBriefingBuildStage.COMMIT, revision.Issue, "The immutable recompiled revision commit was rejected.");
+ throw new VisualBriefingBuildException(VisualBriefingFailureCode.STORE_FAILED, VisualBriefingBuildStage.COMMIT, revision.Issue, $"The immutable recompiled revision commit was rejected. StoreIssue={revision.Issue}");
assemblyStage.Status = VisualBriefingBuildStageStatus.COMPLETED;
assemblyStage.FinishedAtUtc = DateTimeOffset.UtcNow;
diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.cs
index b91bdfc7..a036f34f 100644
--- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.cs
+++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildOrchestrator.cs
@@ -389,7 +389,7 @@ internal sealed partial class VisualBriefingBuildOrchestrator
if (!revision.Success || revision.Version is null)
{
var code = revision.Issue.Contains("did not change", StringComparison.OrdinalIgnoreCase) ? VisualBriefingFailureCode.NO_CHANGES : VisualBriefingFailureCode.STORE_FAILED;
- throw new VisualBriefingBuildException(code, VisualBriefingBuildStage.COMMIT, revision.Issue, "The immutable revision commit was rejected.");
+ throw new VisualBriefingBuildException(code, VisualBriefingBuildStage.COMMIT, revision.Issue, $"The immutable revision commit was rejected. StoreIssue={revision.Issue}");
}
assemblyStage.Status = VisualBriefingBuildStageStatus.COMPLETED;
diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingStore.Versions.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingStore.Versions.cs
index 1be0b6a5..beb678b3 100644
--- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingStore.Versions.cs
+++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingStore.Versions.cs
@@ -38,9 +38,12 @@ public sealed partial class VisualBriefingStore
VisualBriefingArtifactParts? parentParts = null;
if (parent is not null)
{
- parentParts = request.EditMode is VisualBriefingEditMode.RECOMPILE
- ? await this.ReadVersionPartsForRecompileAsync(manifest.BriefingId, parent.RevisionId, token)
- : await this.ReadVersionPartsAsync(manifest.BriefingId, parent.RevisionId, token);
+ parentParts = request.EditMode switch
+ {
+ VisualBriefingEditMode.RECOMPILE => await this.ReadVersionPartsForRecompileAsync(manifest.BriefingId, parent.RevisionId, token),
+ VisualBriefingEditMode.REBUILD => await this.ReadVersionPartsForRebuildAsync(manifest.BriefingId, parent.RevisionId, token),
+ _ => await this.ReadVersionPartsAsync(manifest.BriefingId, parent.RevisionId, token),
+ };
if (parentParts is null)
return VisualBriefingRevisionResult.Failure("The selected parent revision is invalid or damaged.");
@@ -172,9 +175,31 @@ public sealed partial class VisualBriefingStore
}
///
- /// Defines ReadVersionPartsAsync for the visual briefing feature.
+ /// Reads a local immutable version that is compatible with the current semantic schema.
///
- public async Task ReadVersionPartsAsync(Guid briefingId, Guid revisionId, CancellationToken token = default)
+ public Task ReadVersionPartsAsync(Guid briefingId, Guid revisionId, CancellationToken token = default) =>
+ this.ReadVersionPartsCoreAsync(briefingId, revisionId, requireCurrentSchema: true, token: token);
+
+ ///
+ /// Reads an intact historical parent for rebuild lineage without requiring its semantic schema
+ /// to match the newly generated revision.
+ ///
+ /// The briefing identifier.
+ /// The historical parent revision identifier.
+ /// The cancellation token.
+ /// The verified parent artifact parts, or .
+ private Task ReadVersionPartsForRebuildAsync(Guid briefingId, Guid revisionId, CancellationToken token) =>
+ this.ReadVersionPartsCoreAsync(briefingId, revisionId, requireCurrentSchema: false, token: token);
+
+ ///
+ /// Reads and integrity-checks one local immutable version with the requested schema policy.
+ ///
+ /// The briefing identifier.
+ /// The revision identifier.
+ /// Whether the current semantic schema is required.
+ /// The cancellation token.
+ /// The verified artifact parts, or .
+ private async Task ReadVersionPartsCoreAsync(Guid briefingId, Guid revisionId, bool requireCurrentSchema, CancellationToken token)
{
var manifest = await this.LoadAsync(briefingId, token);
var version = manifest?.Versions.FirstOrDefault(candidate => candidate.RevisionId == revisionId);
@@ -186,10 +211,11 @@ public sealed partial class VisualBriefingStore
return null;
var html = await File.ReadAllTextAsync(path, token);
- if (!VisualBriefingArtifactService.TryParseForRecompile(html, out var parts, out _) ||
- parts.ExportManifest.BriefingId != briefingId ||
- parts.ExportManifest.RevisionId != revisionId ||
- !string.Equals(parts.DocumentHash, version.DocumentHash, StringComparison.OrdinalIgnoreCase))
+ var parsed = requireCurrentSchema
+ ? VisualBriefingArtifactService.TryParseForRecompile(html, out var parts, out _)
+ : VisualBriefingArtifactService.TryParse(html, out parts, out _);
+
+ if (!parsed || parts.ExportManifest.BriefingId != briefingId || parts.ExportManifest.RevisionId != revisionId || !string.Equals(parts.DocumentHash, version.DocumentHash, StringComparison.OrdinalIgnoreCase))
return null;
return parts;