Implement Phase S3-C workflow-memory capture skills
This commit is contained in:
parent
3de19b9f49
commit
eac1c6dce9
18 changed files with 1136 additions and 18 deletions
|
|
@ -99,6 +99,22 @@ namespace HyperTwistContractLibraryInternal
|
|||
return OverrideState;
|
||||
}(),
|
||||
[]()
|
||||
{
|
||||
FHyperTwistSkillControlOverride OverrideState;
|
||||
OverrideState.SkillId = TEXT("skill/capture-session-template");
|
||||
OverrideState.bHasEnabledOverride = true;
|
||||
OverrideState.bEnabled = true;
|
||||
return OverrideState;
|
||||
}(),
|
||||
[]()
|
||||
{
|
||||
FHyperTwistSkillControlOverride OverrideState;
|
||||
OverrideState.SkillId = TEXT("skill/capture-follow-up-routine");
|
||||
OverrideState.bHasEnabledOverride = true;
|
||||
OverrideState.bEnabled = true;
|
||||
return OverrideState;
|
||||
}(),
|
||||
[]()
|
||||
{
|
||||
FHyperTwistSkillControlOverride OverrideState;
|
||||
OverrideState.SkillId = TEXT("skill/provider-routing-inspector");
|
||||
|
|
@ -4132,6 +4148,23 @@ UHyperTwistContractLibrary::MakeSampleSkillRecallCompactViewState()
|
|||
);
|
||||
}
|
||||
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState
|
||||
UHyperTwistContractLibrary::MakeSampleSkillWorkflowMemoryCaptureState()
|
||||
{
|
||||
const FHyperTwistSkillRegistryState RegistryState = MakeSampleSkillRegistryState();
|
||||
const FHyperTwistSkillControlState ControlState = MakeSampleSkillControlState();
|
||||
const FHyperTwistSkillAuthoringHarnessState AuthoringHarnessState =
|
||||
MakeSampleSkillAuthoringHarnessState();
|
||||
|
||||
return UHyperTwistSkillCoreLibrary::DeriveSkillWorkflowMemoryCaptureState(
|
||||
RegistryState,
|
||||
ControlState,
|
||||
AuthoringHarnessState,
|
||||
MakeSampleTrainingMemoryLedgerState(),
|
||||
MakeSampleTrainingMemoryChronicleContinuityState()
|
||||
);
|
||||
}
|
||||
|
||||
FHyperTwistTrainingRepositoryIntegrityReport UHyperTwistContractLibrary::MakeSampleTrainingRepositoryIntegrityReport()
|
||||
{
|
||||
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
|
||||
|
|
@ -5322,6 +5355,15 @@ FString UHyperTwistContractLibrary::SerializeSkillRecallCompactViewStateToJson(
|
|||
);
|
||||
}
|
||||
|
||||
FString UHyperTwistContractLibrary::SerializeSkillWorkflowMemoryCaptureStateToJson(
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState& SkillWorkflowMemoryCaptureState
|
||||
)
|
||||
{
|
||||
return HyperTwistContractLibraryInternal::SerializeStructToJson(
|
||||
SkillWorkflowMemoryCaptureState
|
||||
);
|
||||
}
|
||||
|
||||
FString UHyperTwistContractLibrary::SerializeTrainingTimerExportPacketToJson(
|
||||
const FHyperTwistTrainingTimerExportPacket& TimerExportPacket
|
||||
)
|
||||
|
|
@ -5543,6 +5585,17 @@ bool UHyperTwistContractLibrary::DeserializeSkillRecallCompactViewStateFromJson(
|
|||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistContractLibrary::DeserializeSkillWorkflowMemoryCaptureStateFromJson(
|
||||
const FString& Json,
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState& OutSkillWorkflowMemoryCaptureState
|
||||
)
|
||||
{
|
||||
return HyperTwistContractLibraryInternal::DeserializeStructFromJson(
|
||||
Json,
|
||||
OutSkillWorkflowMemoryCaptureState
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistContractLibrary::DeserializeTrainingTimerExportPacketFromJson(
|
||||
const FString& Json,
|
||||
FHyperTwistTrainingTimerExportPacket& OutTimerExportPacket
|
||||
|
|
|
|||
|
|
@ -445,6 +445,12 @@ namespace HyperTwistSkillCoreLibraryInternal
|
|||
|| SkillId == TEXT("skill/generate-compact-view");
|
||||
}
|
||||
|
||||
bool IsWorkflowMemoryCaptureSkill(const FString& SkillId)
|
||||
{
|
||||
return SkillId == TEXT("skill/capture-session-template")
|
||||
|| SkillId == TEXT("skill/capture-follow-up-routine");
|
||||
}
|
||||
|
||||
bool HasAtLeastCleanRoomCommandContractStatus(const EHyperTwistSkillStatus Status)
|
||||
{
|
||||
return Status == EHyperTwistSkillStatus::CleanRoomCommandContractSpecified
|
||||
|
|
@ -666,6 +672,12 @@ namespace HyperTwistSkillCoreLibraryInternal
|
|||
return EHyperTwistSkillInvocationOutcome::Succeeded;
|
||||
}
|
||||
|
||||
if (Entry.SkillId == TEXT("skill/capture-session-template")
|
||||
|| Entry.SkillId == TEXT("skill/capture-follow-up-routine"))
|
||||
{
|
||||
return EHyperTwistSkillInvocationOutcome::Succeeded;
|
||||
}
|
||||
|
||||
return EHyperTwistSkillInvocationOutcome::Failed;
|
||||
}
|
||||
|
||||
|
|
@ -962,11 +974,11 @@ namespace HyperTwistSkillCoreLibraryInternal
|
|||
|
||||
FHyperTwistSkillRegistryState RegistryState;
|
||||
RegistryState.RegistryId = TEXT("skill-registry/first-party");
|
||||
RegistryState.ManifestVersion = TEXT("s3b-v1");
|
||||
RegistryState.ReferenceUtc = TEXT("2026-05-29T03:40:00Z");
|
||||
RegistryState.ManifestVersion = TEXT("s3c-v1");
|
||||
RegistryState.ReferenceUtc = TEXT("2026-05-29T07:10:00Z");
|
||||
RegistryState.CommandSurfaceRootId = TEXT("command-surface/skills");
|
||||
RegistryState.Summary =
|
||||
TEXT("First-party skill registry and manifest contract with landed permissive analyzer wrappers, landed clean-room command contracts, landed clean-room skill specs, landed continuity/resume skills, and landed recall/compact-view skills.");
|
||||
TEXT("First-party skill registry and manifest contract with landed permissive analyzer wrappers, landed clean-room command contracts, landed clean-room skill specs, landed continuity/resume skills, landed recall/compact-view skills, and landed workflow-memory capture skills.");
|
||||
|
||||
RegistryState.Entries = {
|
||||
MakeSkillEntry(
|
||||
|
|
@ -1300,6 +1312,88 @@ namespace HyperTwistSkillCoreLibraryInternal
|
|||
),
|
||||
TEXT("Landed first-party optional compact-view skill over derived memory adjunct surfaces.")
|
||||
),
|
||||
MakeSkillEntry(
|
||||
TEXT("skill/capture-session-template"),
|
||||
TEXT("Capture Session Template"),
|
||||
TEXT("lane/skillization/memory-continuity"),
|
||||
TEXT("feature/skills/capture-session-template"),
|
||||
EHyperTwistSkillFamily::MemoryContinuity,
|
||||
EHyperTwistSkillStatus::ImplementedNow,
|
||||
false,
|
||||
true,
|
||||
{
|
||||
MakeCommandBinding(
|
||||
TEXT("command/skills/capture-session-template"),
|
||||
TEXT("service/skills/capture-session-template"),
|
||||
TEXT("feature/skills/capture-session-template"),
|
||||
TEXT("memory/workflow-template-capture"),
|
||||
true,
|
||||
TEXT("Live first-party workflow capture skill over authoritative session-template and drill-workflow entities.")
|
||||
)
|
||||
},
|
||||
{
|
||||
MakePermissionScope(
|
||||
TEXT("scope/skills/capture-session-template"),
|
||||
TEXT("Capture Session Template"),
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
TEXT("Reads authoritative training and workflow memory state to emit bounded session-template capture output.")
|
||||
)
|
||||
},
|
||||
MakeProvenanceDeclaration(
|
||||
EHyperTwistSkillLogPolicy::InvocationLedgerRequired,
|
||||
{TEXT("artifact/workflow-template-capture-brief")},
|
||||
true,
|
||||
TEXT("Workflow-template capture output must remain provenance-visible, derived-only, and separate from user-authored notes.")
|
||||
),
|
||||
TEXT("Landed first-party workflow capture skill over authoritative session-template and drill-workflow entities.")
|
||||
),
|
||||
MakeSkillEntry(
|
||||
TEXT("skill/capture-follow-up-routine"),
|
||||
TEXT("Capture Follow-Up Routine"),
|
||||
TEXT("lane/skillization/memory-continuity"),
|
||||
TEXT("feature/skills/capture-follow-up-routine"),
|
||||
EHyperTwistSkillFamily::MemoryContinuity,
|
||||
EHyperTwistSkillStatus::ImplementedNow,
|
||||
false,
|
||||
true,
|
||||
{
|
||||
MakeCommandBinding(
|
||||
TEXT("command/skills/capture-follow-up-routine"),
|
||||
TEXT("service/skills/capture-follow-up-routine"),
|
||||
TEXT("feature/skills/capture-follow-up-routine"),
|
||||
TEXT("memory/workflow-follow-up-capture"),
|
||||
true,
|
||||
TEXT("Live first-party workflow capture skill over authoritative review-plan, coach-action-plan, and queue follow-up entities.")
|
||||
)
|
||||
},
|
||||
{
|
||||
MakePermissionScope(
|
||||
TEXT("scope/skills/capture-follow-up-routine"),
|
||||
TEXT("Capture Follow-Up Routine"),
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
TEXT("Reads authoritative training and workflow memory state to emit bounded follow-up routine capture output.")
|
||||
)
|
||||
},
|
||||
MakeProvenanceDeclaration(
|
||||
EHyperTwistSkillLogPolicy::InvocationLedgerRequired,
|
||||
{TEXT("artifact/follow-up-routine-capture-brief")},
|
||||
true,
|
||||
TEXT("Follow-up routine capture output must remain provenance-visible, derived-only, and avoid opaque summary collapse.")
|
||||
),
|
||||
TEXT("Landed first-party workflow capture skill over authoritative review-plan and follow-up routine entities.")
|
||||
),
|
||||
MakeSkillEntry(
|
||||
TEXT("skill/provider-routing-inspector"),
|
||||
TEXT("Provider Routing Inspector"),
|
||||
|
|
@ -1447,7 +1541,7 @@ namespace HyperTwistSkillCoreLibraryInternal
|
|||
RegistryState.FamilyCounts = {
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::SubstrateGovernance, 1),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::AnalysisReview, 1),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::MemoryContinuity, 6),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::MemoryContinuity, 8),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::ProviderOperations, 1),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::TrainingCoaching, 1),
|
||||
MakeFamilyCount(EHyperTwistSkillFamily::DomainCreative, 1)
|
||||
|
|
@ -2644,3 +2738,285 @@ UHyperTwistSkillCoreLibrary::DeriveSkillRecallCompactViewState(
|
|||
|
||||
return RecallCompactViewState;
|
||||
}
|
||||
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState
|
||||
UHyperTwistSkillCoreLibrary::DeriveSkillWorkflowMemoryCaptureState(
|
||||
const FHyperTwistSkillRegistryState& RegistryState,
|
||||
const FHyperTwistSkillControlState& ControlState,
|
||||
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||
const FHyperTwistMemoryLedgerState& LedgerState,
|
||||
const FHyperTwistMemoryChronicleContinuityState& ChronicleContinuityState
|
||||
)
|
||||
{
|
||||
using namespace HyperTwistSkillCoreLibraryInternal;
|
||||
|
||||
if (!RegistryState.IsStructurallyValid()
|
||||
|| !ControlState.IsStructurallyValid()
|
||||
|| !AuthoringHarnessState.IsStructurallyValid()
|
||||
|| !LedgerState.IsStructurallyValid()
|
||||
|| !ChronicleContinuityState.IsStructurallyValid()
|
||||
|| RegistryState.RegistryId != ControlState.RegistryId
|
||||
|| RegistryState.RegistryId != AuthoringHarnessState.RegistryId
|
||||
|| RegistryState.CommandSurfaceRootId != ControlState.CommandSurfaceRootId
|
||||
|| RegistryState.CommandSurfaceRootId != AuthoringHarnessState.CommandSurfaceRootId)
|
||||
{
|
||||
return FHyperTwistSkillWorkflowMemoryCaptureState();
|
||||
}
|
||||
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState WorkflowCaptureState;
|
||||
WorkflowCaptureState.RegistryId = RegistryState.RegistryId;
|
||||
WorkflowCaptureState.ManifestVersion = TEXT("s3c-v1");
|
||||
WorkflowCaptureState.ReferenceUtc = TEXT("2026-05-29T07:30:00Z");
|
||||
WorkflowCaptureState.CommandSurfaceRootId = RegistryState.CommandSurfaceRootId;
|
||||
WorkflowCaptureState.TemplateVersion = TEXT("skill-workflow-memory-capture-v1");
|
||||
WorkflowCaptureState.bEveryLiveSkillReadsAuthoritativeStores = true;
|
||||
WorkflowCaptureState.bEverySkillPreservesOptionalAssistiveOffState = true;
|
||||
WorkflowCaptureState.bEveryLiveSkillHasValidationHarnessCoverage = true;
|
||||
WorkflowCaptureState.bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes = true;
|
||||
WorkflowCaptureState.bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries = true;
|
||||
WorkflowCaptureState.Summary =
|
||||
TEXT("First-party workflow-memory capture skill layer over authoritative procedural and continuity seams.");
|
||||
|
||||
auto AddPreviewHeadline = [](
|
||||
TArray<FString>& PreviewHeadlines,
|
||||
const FString& Headline
|
||||
)
|
||||
{
|
||||
if (!Headline.IsEmpty())
|
||||
{
|
||||
PreviewHeadlines.AddUnique(Headline);
|
||||
}
|
||||
};
|
||||
|
||||
auto AddUniqueEntityId = [](
|
||||
TArray<FString>& EntityIds,
|
||||
const FString& EntityId
|
||||
)
|
||||
{
|
||||
if (!EntityId.IsEmpty())
|
||||
{
|
||||
EntityIds.AddUnique(EntityId);
|
||||
}
|
||||
};
|
||||
|
||||
const bool bHasProceduralWorkflowLaneEvidence = LedgerState.LaneContracts.ContainsByPredicate(
|
||||
[](const FHyperTwistMemoryLaneContract& LaneContract)
|
||||
{
|
||||
return LaneContract.Lane == EHyperTwistMemoryLane::ProceduralWorkflow
|
||||
&& LaneContract.AuthorityKind == EHyperTwistMemoryAuthorityKind::Authoritative
|
||||
&& LaneContract.bFirstPartyOwned
|
||||
&& LaneContract.bCurrentEvidencePresent;
|
||||
}
|
||||
);
|
||||
|
||||
auto BuildWorkflowSkill = [&](
|
||||
const FString& SkillId
|
||||
) -> FHyperTwistSkillWorkflowMemoryCaptureSkill
|
||||
{
|
||||
const FHyperTwistSkillManifestEntry* Entry =
|
||||
FindManifestEntryById(RegistryState, SkillId);
|
||||
const FHyperTwistSkillControlStateEntry* ControlEntry =
|
||||
FindControlStateEntryById(ControlState, SkillId);
|
||||
const FHyperTwistSkillAuthoringExampleState* ExampleState =
|
||||
FindAuthoringExampleBySkillId(AuthoringHarnessState, SkillId);
|
||||
if (Entry == nullptr
|
||||
|| !Entry->IsStructurallyValid()
|
||||
|| !IsWorkflowMemoryCaptureSkill(SkillId)
|
||||
|| ControlEntry == nullptr
|
||||
|| !ControlEntry->IsStructurallyValid()
|
||||
|| !ControlEntry->bInstalled
|
||||
|| !ControlEntry->bOptionalAssistive
|
||||
|| ExampleState == nullptr
|
||||
|| !ExampleState->IsStructurallyValid()
|
||||
|| !HasLiveEvalValidationCase(AuthoringHarnessState, SkillId))
|
||||
{
|
||||
return FHyperTwistSkillWorkflowMemoryCaptureSkill();
|
||||
}
|
||||
|
||||
FHyperTwistSkillWorkflowMemoryCaptureSkill SkillState;
|
||||
SkillState.SkillId = Entry->SkillId;
|
||||
SkillState.DisplayLabel = Entry->DisplayLabel;
|
||||
SkillState.CommandSurfaceId = Entry->CommandBindings[0].CommandSurfaceId;
|
||||
SkillState.ServiceBindingId = Entry->CommandBindings[0].ServiceBindingId;
|
||||
SkillState.OwnerLaneId = Entry->OwnerLaneId;
|
||||
SkillState.OwnerFeatureId = Entry->OwnerFeatureId;
|
||||
SkillState.Status = Entry->Status;
|
||||
SkillState.PermissionScopeIds = MakePermissionScopeIds(*Entry);
|
||||
SkillState.OutputArtifactKinds = Entry->Provenance.ProducedArtifactKinds;
|
||||
SkillState.bLiveSkill = true;
|
||||
SkillState.bRequiresOwnerActivation = false;
|
||||
SkillState.bPreservesOptionalAssistiveOffState = ControlEntry->bInertWhenDisabled;
|
||||
SkillState.bDerivedAssistiveOnly = Entry->bOptionalAssistive;
|
||||
SkillState.bHasValidationHarnessCoverage = true;
|
||||
SkillState.bAvoidsUserAuthoredNoteCapture = true;
|
||||
SkillState.bAvoidsOpaqueSummaryCollapse = true;
|
||||
|
||||
TArray<FString> LinkedWorkflowEntityIds;
|
||||
|
||||
if (SkillId == TEXT("skill/capture-session-template"))
|
||||
{
|
||||
SkillState.InputStateKinds = {
|
||||
TEXT("state/memory-ledger"),
|
||||
TEXT("state/memory-entity-descriptor"),
|
||||
TEXT("state/memory-procedural-workflow-lane")
|
||||
};
|
||||
|
||||
for (const FHyperTwistMemoryEntityDescriptor& Entity : LedgerState.Entities)
|
||||
{
|
||||
if (Entity.Lane != EHyperTwistMemoryLane::ProceduralWorkflow
|
||||
|| Entity.AuthorityKind != EHyperTwistMemoryAuthorityKind::Authoritative)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Entity.RecordKind == TEXT("training-session-template")
|
||||
|| Entity.RecordKind == TEXT("method-drill-favorite")
|
||||
|| Entity.RecordKind == TEXT("method-drill-batch"))
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, Entity.DisplayLabel);
|
||||
AddUniqueEntityId(LinkedWorkflowEntityIds, Entity.EntityId);
|
||||
}
|
||||
}
|
||||
|
||||
SkillState.AvailableItemCount = LinkedWorkflowEntityIds.Num();
|
||||
SkillState.LinkedWorkflowEntityCount = LinkedWorkflowEntityIds.Num();
|
||||
SkillState.BlockingItemCount = 0;
|
||||
SkillState.bReadsAuthoritativeStores =
|
||||
bHasProceduralWorkflowLaneEvidence && LinkedWorkflowEntityIds.Num() > 0;
|
||||
SkillState.bAvailableNow = LinkedWorkflowEntityIds.Num() > 0;
|
||||
SkillState.Summary =
|
||||
TEXT("Live first-party workflow capture skill over authoritative session-template and drill-workflow entities.");
|
||||
}
|
||||
else if (SkillId == TEXT("skill/capture-follow-up-routine"))
|
||||
{
|
||||
SkillState.InputStateKinds = {
|
||||
TEXT("state/memory-ledger"),
|
||||
TEXT("state/memory-entity-descriptor"),
|
||||
TEXT("state/memory-chronicle-continuity"),
|
||||
TEXT("state/memory-session-group"),
|
||||
TEXT("state/memory-resume-pack"),
|
||||
TEXT("state/memory-continuity-guard")
|
||||
};
|
||||
|
||||
int32 RelevantResumePackCount = 0;
|
||||
int32 RelevantOpenGroupCount = 0;
|
||||
int32 RelevantBlockingGuardCount = 0;
|
||||
|
||||
for (const FHyperTwistMemoryEntityDescriptor& Entity : LedgerState.Entities)
|
||||
{
|
||||
if (Entity.Lane != EHyperTwistMemoryLane::ProceduralWorkflow
|
||||
|| Entity.AuthorityKind != EHyperTwistMemoryAuthorityKind::Authoritative)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Entity.RecordKind == TEXT("training-review-plan")
|
||||
|| Entity.RecordKind == TEXT("coach-action-plan")
|
||||
|| Entity.RecordKind == TEXT("coach-session-queue"))
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, Entity.DisplayLabel);
|
||||
AddUniqueEntityId(LinkedWorkflowEntityIds, Entity.EntityId);
|
||||
}
|
||||
}
|
||||
|
||||
for (const FHyperTwistMemorySessionGroup& SessionGroup :
|
||||
ChronicleContinuityState.SessionGroups)
|
||||
{
|
||||
if (SessionGroup.GroupKind == TEXT("review-plan")
|
||||
|| SessionGroup.GroupKind == TEXT("coach-session-queue"))
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, SessionGroup.Headline);
|
||||
RelevantOpenGroupCount += SessionGroup.bCompleted ? 0 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (const FHyperTwistMemoryResumePack& ResumePack :
|
||||
ChronicleContinuityState.ResumePacks)
|
||||
{
|
||||
if (ResumePack.PackKind == TEXT("review-plan-resume")
|
||||
|| ResumePack.PackKind == TEXT("coach-session-queue-resume"))
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, ResumePack.Headline);
|
||||
RelevantResumePackCount += 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (const FHyperTwistMemoryContinuityGuard& ContinuityGuard :
|
||||
ChronicleContinuityState.ContinuityGuards)
|
||||
{
|
||||
if (ContinuityGuard.GuardKind == TEXT("coach-session-queue"))
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, ContinuityGuard.Headline);
|
||||
RelevantBlockingGuardCount +=
|
||||
ContinuityGuard.Severity ==
|
||||
EHyperTwistMemoryContinuityGuardSeverity::Blocking
|
||||
? 1
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
|
||||
SkillState.AvailableItemCount =
|
||||
LinkedWorkflowEntityIds.Num() + RelevantResumePackCount;
|
||||
SkillState.LinkedWorkflowEntityCount = LinkedWorkflowEntityIds.Num();
|
||||
SkillState.BlockingItemCount = RelevantBlockingGuardCount;
|
||||
SkillState.bReadsAuthoritativeStores =
|
||||
bHasProceduralWorkflowLaneEvidence
|
||||
&& LinkedWorkflowEntityIds.Num() > 0
|
||||
&& (RelevantResumePackCount > 0 || RelevantOpenGroupCount > 0);
|
||||
SkillState.bAvailableNow = SkillState.AvailableItemCount > 0;
|
||||
SkillState.Summary =
|
||||
TEXT("Live first-party workflow capture skill over authoritative review-plan, follow-up, and queue continuity entities.");
|
||||
}
|
||||
|
||||
if (SkillState.PreviewHeadlines.Num() == 0)
|
||||
{
|
||||
AddPreviewHeadline(SkillState.PreviewHeadlines, SkillState.DisplayLabel);
|
||||
}
|
||||
|
||||
return SkillState;
|
||||
};
|
||||
|
||||
for (const FString& SkillId : {
|
||||
FString(TEXT("skill/capture-session-template")),
|
||||
FString(TEXT("skill/capture-follow-up-routine"))
|
||||
})
|
||||
{
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureSkill SkillState =
|
||||
BuildWorkflowSkill(SkillId);
|
||||
if (!SkillState.IsStructurallyValid())
|
||||
{
|
||||
return FHyperTwistSkillWorkflowMemoryCaptureState();
|
||||
}
|
||||
|
||||
WorkflowCaptureState.Skills.Add(SkillState);
|
||||
}
|
||||
|
||||
for (const FHyperTwistSkillWorkflowMemoryCaptureSkill& SkillState :
|
||||
WorkflowCaptureState.Skills)
|
||||
{
|
||||
WorkflowCaptureState.LiveSkillCount += SkillState.bLiveSkill ? 1 : 0;
|
||||
WorkflowCaptureState.AvailableNowCount += SkillState.bAvailableNow ? 1 : 0;
|
||||
WorkflowCaptureState.CaptureSessionTemplateSkillCount +=
|
||||
SkillState.SkillId == TEXT("skill/capture-session-template") ? 1 : 0;
|
||||
WorkflowCaptureState.CaptureFollowUpRoutineSkillCount +=
|
||||
SkillState.SkillId == TEXT("skill/capture-follow-up-routine") ? 1 : 0;
|
||||
WorkflowCaptureState.bEverySkillPreservesOptionalAssistiveOffState &=
|
||||
SkillState.bPreservesOptionalAssistiveOffState;
|
||||
WorkflowCaptureState.bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes &=
|
||||
SkillState.bAvoidsUserAuthoredNoteCapture;
|
||||
WorkflowCaptureState.bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries &=
|
||||
SkillState.bAvoidsOpaqueSummaryCollapse;
|
||||
|
||||
if (SkillState.bLiveSkill)
|
||||
{
|
||||
WorkflowCaptureState.bEveryLiveSkillReadsAuthoritativeStores &=
|
||||
SkillState.bReadsAuthoritativeStores;
|
||||
WorkflowCaptureState.bEveryLiveSkillHasValidationHarnessCoverage &=
|
||||
SkillState.bHasValidationHarnessCoverage;
|
||||
}
|
||||
}
|
||||
|
||||
WorkflowCaptureState.SkillCount = WorkflowCaptureState.Skills.Num();
|
||||
|
||||
return WorkflowCaptureState;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -195,6 +195,10 @@ public:
|
|||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||
static FHyperTwistSkillRecallCompactViewState MakeSampleSkillRecallCompactViewState();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||
static FHyperTwistSkillWorkflowMemoryCaptureState
|
||||
MakeSampleSkillWorkflowMemoryCaptureState();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
|
||||
static FHyperTwistTrainingRepositoryIntegrityReport MakeSampleTrainingRepositoryIntegrityReport();
|
||||
|
||||
|
|
@ -429,6 +433,11 @@ public:
|
|||
const FHyperTwistSkillRecallCompactViewState& SkillRecallCompactViewState
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||
static FString SerializeSkillWorkflowMemoryCaptureStateToJson(
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState& SkillWorkflowMemoryCaptureState
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||
static FString SerializeTrainingTimerExportPacketToJson(const FHyperTwistTrainingTimerExportPacket& TimerExportPacket);
|
||||
|
||||
|
|
@ -555,6 +564,12 @@ public:
|
|||
FHyperTwistSkillRecallCompactViewState& OutSkillRecallCompactViewState
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||
static bool DeserializeSkillWorkflowMemoryCaptureStateFromJson(
|
||||
const FString& Json,
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState& OutSkillWorkflowMemoryCaptureState
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||
static bool DeserializeTrainingTimerExportPacketFromJson(const FString& Json, FHyperTwistTrainingTimerExportPacket& OutTimerExportPacket);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -74,4 +74,13 @@ public:
|
|||
const FHyperTwistMemoryRecallSharedContextState& RecallSharedContextState,
|
||||
const FHyperTwistMemoryDerivedAdjunctState& DerivedAdjunctState
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||
static FHyperTwistSkillWorkflowMemoryCaptureState DeriveSkillWorkflowMemoryCaptureState(
|
||||
const FHyperTwistSkillRegistryState& RegistryState,
|
||||
const FHyperTwistSkillControlState& ControlState,
|
||||
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||
const FHyperTwistMemoryLedgerState& LedgerState,
|
||||
const FHyperTwistMemoryChronicleContinuityState& ChronicleContinuityState
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2967,3 +2967,276 @@ struct FHyperTwistSkillRecallCompactViewState
|
|||
== bComputedCompactViewGuard;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistSkillWorkflowMemoryCaptureSkill
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SkillId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DisplayLabel;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CommandSurfaceId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ServiceBindingId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString OwnerLaneId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString OwnerFeatureId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
EHyperTwistSkillStatus Status = EHyperTwistSkillStatus::None;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PermissionScopeIds;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> InputStateKinds;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> OutputArtifactKinds;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PreviewHeadlines;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 AvailableItemCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LinkedWorkflowEntityCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 BlockingItemCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLiveSkill = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bReadsAuthoritativeStores = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bAvailableNow = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bRequiresOwnerActivation = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bPreservesOptionalAssistiveOffState = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bDerivedAssistiveOnly = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasValidationHarnessCoverage = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bAvoidsUserAuthoredNoteCapture = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bAvoidsOpaqueSummaryCollapse = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Summary;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
if (SkillId.IsEmpty()
|
||||
|| DisplayLabel.IsEmpty()
|
||||
|| CommandSurfaceId.IsEmpty()
|
||||
|| ServiceBindingId.IsEmpty()
|
||||
|| OwnerLaneId.IsEmpty()
|
||||
|| OwnerFeatureId.IsEmpty()
|
||||
|| Status == EHyperTwistSkillStatus::None
|
||||
|| PermissionScopeIds.Num() == 0
|
||||
|| InputStateKinds.Num() == 0
|
||||
|| OutputArtifactKinds.Num() == 0
|
||||
|| PreviewHeadlines.Num() == 0
|
||||
|| AvailableItemCount <= 0
|
||||
|| LinkedWorkflowEntityCount <= 0
|
||||
|| BlockingItemCount < 0
|
||||
|| !bReadsAuthoritativeStores
|
||||
|| !bPreservesOptionalAssistiveOffState
|
||||
|| !bDerivedAssistiveOnly
|
||||
|| !bHasValidationHarnessCoverage
|
||||
|| !bAvoidsUserAuthoredNoteCapture
|
||||
|| !bAvoidsOpaqueSummaryCollapse)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FString& Value : PermissionScopeIds)
|
||||
{
|
||||
if (Value.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (const FString& Value : InputStateKinds)
|
||||
{
|
||||
if (Value.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (const FString& Value : OutputArtifactKinds)
|
||||
{
|
||||
if (Value.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (const FString& Value : PreviewHeadlines)
|
||||
{
|
||||
if (Value.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return Status == EHyperTwistSkillStatus::ImplementedNow
|
||||
&& bLiveSkill
|
||||
&& bAvailableNow
|
||||
&& !bRequiresOwnerActivation;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistSkillWorkflowMemoryCaptureState
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString RegistryId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ManifestVersion;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ReferenceUtc;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CommandSurfaceRootId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TemplateVersion;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistSkillWorkflowMemoryCaptureSkill> Skills;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 SkillCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LiveSkillCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 AvailableNowCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 CaptureSessionTemplateSkillCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 CaptureFollowUpRoutineSkillCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bEveryLiveSkillReadsAuthoritativeStores = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bEverySkillPreservesOptionalAssistiveOffState = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bEveryLiveSkillHasValidationHarnessCoverage = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Summary;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
if (RegistryId.IsEmpty()
|
||||
|| ManifestVersion.IsEmpty()
|
||||
|| ReferenceUtc.IsEmpty()
|
||||
|| CommandSurfaceRootId.IsEmpty()
|
||||
|| TemplateVersion.IsEmpty()
|
||||
|| Skills.Num() == 0
|
||||
|| SkillCount != Skills.Num()
|
||||
|| !bEveryLiveSkillReadsAuthoritativeStores
|
||||
|| !bEverySkillPreservesOptionalAssistiveOffState
|
||||
|| !bEveryLiveSkillHasValidationHarnessCoverage
|
||||
|| !bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes
|
||||
|| !bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
TArray<FString> SeenSkillIds;
|
||||
int32 ComputedLiveSkillCount = 0;
|
||||
int32 ComputedAvailableNowCount = 0;
|
||||
int32 ComputedCaptureSessionTemplateSkillCount = 0;
|
||||
int32 ComputedCaptureFollowUpRoutineSkillCount = 0;
|
||||
bool bComputedEveryLiveSkillReadsAuthoritativeStores = true;
|
||||
bool bComputedEverySkillPreservesOptionalAssistiveOffState = true;
|
||||
bool bComputedEveryLiveSkillHasValidationHarnessCoverage = true;
|
||||
bool bComputedUserNoteSeparation = true;
|
||||
bool bComputedOpaqueSummaryGuard = true;
|
||||
|
||||
for (const FHyperTwistSkillWorkflowMemoryCaptureSkill& Skill : Skills)
|
||||
{
|
||||
if (!Skill.IsStructurallyValid() || SeenSkillIds.Contains(Skill.SkillId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SeenSkillIds.Add(Skill.SkillId);
|
||||
ComputedLiveSkillCount += Skill.bLiveSkill ? 1 : 0;
|
||||
ComputedAvailableNowCount += Skill.bAvailableNow ? 1 : 0;
|
||||
ComputedCaptureSessionTemplateSkillCount +=
|
||||
Skill.SkillId == TEXT("skill/capture-session-template") ? 1 : 0;
|
||||
ComputedCaptureFollowUpRoutineSkillCount +=
|
||||
Skill.SkillId == TEXT("skill/capture-follow-up-routine") ? 1 : 0;
|
||||
bComputedEverySkillPreservesOptionalAssistiveOffState &=
|
||||
Skill.bPreservesOptionalAssistiveOffState;
|
||||
bComputedUserNoteSeparation &= Skill.bAvoidsUserAuthoredNoteCapture;
|
||||
bComputedOpaqueSummaryGuard &= Skill.bAvoidsOpaqueSummaryCollapse;
|
||||
|
||||
if (Skill.bLiveSkill)
|
||||
{
|
||||
bComputedEveryLiveSkillReadsAuthoritativeStores &= Skill.bReadsAuthoritativeStores;
|
||||
bComputedEveryLiveSkillHasValidationHarnessCoverage &=
|
||||
Skill.bHasValidationHarnessCoverage;
|
||||
}
|
||||
}
|
||||
|
||||
return LiveSkillCount == ComputedLiveSkillCount
|
||||
&& AvailableNowCount == ComputedAvailableNowCount
|
||||
&& CaptureSessionTemplateSkillCount
|
||||
== ComputedCaptureSessionTemplateSkillCount
|
||||
&& CaptureFollowUpRoutineSkillCount
|
||||
== ComputedCaptureFollowUpRoutineSkillCount
|
||||
&& bEveryLiveSkillReadsAuthoritativeStores
|
||||
== bComputedEveryLiveSkillReadsAuthoritativeStores
|
||||
&& bEverySkillPreservesOptionalAssistiveOffState
|
||||
== bComputedEverySkillPreservesOptionalAssistiveOffState
|
||||
&& bEveryLiveSkillHasValidationHarnessCoverage
|
||||
== bComputedEveryLiveSkillHasValidationHarnessCoverage
|
||||
&& bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes
|
||||
== bComputedUserNoteSeparation
|
||||
&& bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries
|
||||
== bComputedOpaqueSummaryGuard;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -73,9 +73,9 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
|||
RegistryState.IsStructurallyValid()
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The sample S1-A registry must expose eleven declared skills after S3-B lands."),
|
||||
TEXT("The sample S1-A registry must expose thirteen declared skills after S3-C lands."),
|
||||
RegistryState.SkillCount,
|
||||
11
|
||||
13
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("The S1-A registry must avoid ad hoc metadata."),
|
||||
|
|
@ -86,12 +86,12 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
|||
RegistryState.bAllSkillsOptionalAssistive
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The sample S1-A registry must keep eight implemented skill entries after S3-B lands."),
|
||||
TEXT("The sample S1-A registry must keep ten implemented skill entries after S3-C lands."),
|
||||
HyperTwistSkillPhaseS1ATestInternal::FindStatusCount(
|
||||
RegistryState,
|
||||
EHyperTwistSkillStatus::ImplementedNow
|
||||
),
|
||||
8
|
||||
10
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The sample S1-A registry must keep one command-contract-pending entry for note capture."),
|
||||
|
|
@ -117,6 +117,14 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
|||
),
|
||||
1
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The sample S1-A registry must expose eight memory-continuity-family entries after S3-C lands."),
|
||||
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
||||
RegistryState,
|
||||
EHyperTwistSkillFamily::MemoryContinuity
|
||||
),
|
||||
8
|
||||
);
|
||||
|
||||
const FHyperTwistSkillManifestEntry* GovernanceSkill =
|
||||
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||
|
|
@ -168,6 +176,29 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
|||
);
|
||||
}
|
||||
|
||||
const FHyperTwistSkillManifestEntry* WorkflowCaptureSkill =
|
||||
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||
RegistryState,
|
||||
TEXT("skill/capture-session-template")
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The capture-session-template skill entry must exist."),
|
||||
WorkflowCaptureSkill
|
||||
);
|
||||
if (WorkflowCaptureSkill != nullptr)
|
||||
{
|
||||
TestEqual(
|
||||
TEXT("The capture-session-template skill must be implemented now."),
|
||||
WorkflowCaptureSkill->Status,
|
||||
EHyperTwistSkillStatus::ImplementedNow
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The capture-session-template skill must bind to the first-party workflow capture service."),
|
||||
WorkflowCaptureSkill->CommandBindings[0].ServiceBindingId,
|
||||
FString(TEXT("service/skills/capture-session-template"))
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ bool FHyperTwistSkillPhaseS1CInvocationProvenanceTest::RunTest(const FString& Pa
|
|||
TestEqual(
|
||||
TEXT("Sample skill audit ledger should record one invocation per enabled sample skill."),
|
||||
AuditLedgerState.InvocationCount,
|
||||
4
|
||||
6
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("All sample invocations should remain traceable."),
|
||||
|
|
@ -111,7 +111,7 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
|||
TestEqual(
|
||||
TEXT("The sample audit ledger should contain the expected successful invocation count."),
|
||||
AuditLedgerState.SuccessfulInvocationCount,
|
||||
2
|
||||
4
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The sample audit ledger should contain the expected failed invocation count."),
|
||||
|
|
@ -195,6 +195,29 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
|||
);
|
||||
}
|
||||
|
||||
const FHyperTwistSkillInvocationRecord* WorkflowRecord =
|
||||
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||
AuditLedgerState,
|
||||
TEXT("skill/capture-follow-up-routine")
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The workflow follow-up skill invocation should be present in the sample audit ledger."),
|
||||
WorkflowRecord
|
||||
);
|
||||
if (WorkflowRecord != nullptr)
|
||||
{
|
||||
TestEqual(
|
||||
TEXT("The workflow follow-up skill should now record a success outcome."),
|
||||
WorkflowRecord->Outcome,
|
||||
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The workflow follow-up skill should emit the bounded follow-up capture artifact."),
|
||||
WorkflowRecord->ProducedArtifacts[0].ArtifactKind,
|
||||
FString(TEXT("artifact/follow-up-routine-capture-brief"))
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -211,6 +211,44 @@ bool FHyperTwistSkillPhaseS1DValidationHarnessCoverageTest::RunTest(const FStrin
|
|||
);
|
||||
}
|
||||
|
||||
const FHyperTwistSkillValidationContractCase* CaptureTemplateEval =
|
||||
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||
HarnessState,
|
||||
TEXT("skill/capture-session-template"),
|
||||
EHyperTwistSkillValidationContractKind::Eval
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The capture-session-template skill should have an eval validation contract."),
|
||||
CaptureTemplateEval
|
||||
);
|
||||
if (CaptureTemplateEval != nullptr)
|
||||
{
|
||||
TestEqual(
|
||||
TEXT("The capture-session-template skill eval contract should now run live after S3-C lands."),
|
||||
CaptureTemplateEval->ExecutionMode,
|
||||
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||
);
|
||||
}
|
||||
|
||||
const FHyperTwistSkillValidationContractCase* CaptureFollowUpEval =
|
||||
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||
HarnessState,
|
||||
TEXT("skill/capture-follow-up-routine"),
|
||||
EHyperTwistSkillValidationContractKind::Eval
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The capture-follow-up-routine skill should have an eval validation contract."),
|
||||
CaptureFollowUpEval
|
||||
);
|
||||
if (CaptureFollowUpEval != nullptr)
|
||||
{
|
||||
TestEqual(
|
||||
TEXT("The capture-follow-up-routine skill eval contract should now run live after S3-C lands."),
|
||||
CaptureFollowUpEval->ExecutionMode,
|
||||
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||
);
|
||||
}
|
||||
|
||||
const FHyperTwistSkillValidationContractCase* RouxEval =
|
||||
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||
HarnessState,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,199 @@
|
|||
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||
|
||||
#include "Misc/AutomationTest.h"
|
||||
|
||||
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||
|
||||
#if WITH_AUTOMATION_TESTS
|
||||
|
||||
namespace HyperTwistSkillPhaseS3CTestInternal
|
||||
{
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureSkill* FindSkillById(
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState& WorkflowCaptureState,
|
||||
const FString& SkillId
|
||||
)
|
||||
{
|
||||
for (const FHyperTwistSkillWorkflowMemoryCaptureSkill& Skill :
|
||||
WorkflowCaptureState.Skills)
|
||||
{
|
||||
if (Skill.SkillId == SkillId)
|
||||
{
|
||||
return &Skill;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||
FHyperTwistSkillPhaseS3CWorkflowMemoryCaptureCoverageTest,
|
||||
"HyperTwist.FirstParty.Skill.PhaseS3C.WorkflowMemoryCaptureCoverage",
|
||||
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||
)
|
||||
|
||||
bool FHyperTwistSkillPhaseS3CWorkflowMemoryCaptureCoverageTest::RunTest(
|
||||
const FString& Parameters
|
||||
)
|
||||
{
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState WorkflowCaptureState =
|
||||
UHyperTwistContractLibrary::MakeSampleSkillWorkflowMemoryCaptureState();
|
||||
|
||||
TestTrue(
|
||||
TEXT("The sample S3-C workflow-memory capture skill state should be structurally valid."),
|
||||
WorkflowCaptureState.IsStructurallyValid()
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("S3-C should expose two workflow-memory capture skills."),
|
||||
WorkflowCaptureState.SkillCount,
|
||||
2
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("S3-C should expose two live workflow-memory capture skills."),
|
||||
WorkflowCaptureState.LiveSkillCount,
|
||||
2
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("S3-C should expose two currently available workflow-memory capture skills in the sample state."),
|
||||
WorkflowCaptureState.AvailableNowCount,
|
||||
2
|
||||
);
|
||||
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureSkill* TemplateSkill =
|
||||
HyperTwistSkillPhaseS3CTestInternal::FindSkillById(
|
||||
WorkflowCaptureState,
|
||||
TEXT("skill/capture-session-template")
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The capture-session-template skill should exist."),
|
||||
TemplateSkill
|
||||
);
|
||||
if (TemplateSkill != nullptr)
|
||||
{
|
||||
TestEqual(
|
||||
TEXT("The capture-session-template skill should bind to the bounded workflow template capture artifact."),
|
||||
TemplateSkill->OutputArtifactKinds[0],
|
||||
FString(TEXT("artifact/workflow-template-capture-brief"))
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||
FHyperTwistSkillPhaseS3CAuthoritativeWorkflowCaptureBoundariesTest,
|
||||
"HyperTwist.FirstParty.Skill.PhaseS3C.AuthoritativeWorkflowCaptureBoundaries",
|
||||
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||
)
|
||||
|
||||
bool FHyperTwistSkillPhaseS3CAuthoritativeWorkflowCaptureBoundariesTest::RunTest(
|
||||
const FString& Parameters
|
||||
)
|
||||
{
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState WorkflowCaptureState =
|
||||
UHyperTwistContractLibrary::MakeSampleSkillWorkflowMemoryCaptureState();
|
||||
|
||||
TestTrue(
|
||||
TEXT("The sample S3-C workflow-memory capture skill state should be structurally valid."),
|
||||
WorkflowCaptureState.IsStructurallyValid()
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("Every live S3-C skill should read authoritative stores."),
|
||||
WorkflowCaptureState.bEveryLiveSkillReadsAuthoritativeStores
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("Every live S3-C skill should keep validation-harness coverage."),
|
||||
WorkflowCaptureState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("S3-C workflow capture must remain separate from user-authored notes."),
|
||||
WorkflowCaptureState.bWorkflowMemoryRemainsSeparateFromUserAuthoredNotes
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("S3-C workflow capture must not collapse into opaque summaries."),
|
||||
WorkflowCaptureState.bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries
|
||||
);
|
||||
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureSkill* FollowUpSkill =
|
||||
HyperTwistSkillPhaseS3CTestInternal::FindSkillById(
|
||||
WorkflowCaptureState,
|
||||
TEXT("skill/capture-follow-up-routine")
|
||||
);
|
||||
TestNotNull(
|
||||
TEXT("The capture-follow-up-routine skill should exist."),
|
||||
FollowUpSkill
|
||||
);
|
||||
if (FollowUpSkill != nullptr)
|
||||
{
|
||||
TestTrue(
|
||||
TEXT("The capture-follow-up-routine skill should avoid user-authored note capture."),
|
||||
FollowUpSkill->bAvoidsUserAuthoredNoteCapture
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("The capture-follow-up-routine skill should avoid opaque summary collapse."),
|
||||
FollowUpSkill->bAvoidsOpaqueSummaryCollapse
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("The capture-follow-up-routine skill should bind to the bounded follow-up capture artifact."),
|
||||
FollowUpSkill->OutputArtifactKinds[0],
|
||||
FString(TEXT("artifact/follow-up-routine-capture-brief"))
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||
FHyperTwistSkillPhaseS3CSerializationRoundTripTest,
|
||||
"HyperTwist.FirstParty.Skill.PhaseS3C.SerializationRoundTrip",
|
||||
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||
)
|
||||
|
||||
bool FHyperTwistSkillPhaseS3CSerializationRoundTripTest::RunTest(
|
||||
const FString& Parameters
|
||||
)
|
||||
{
|
||||
const FHyperTwistSkillWorkflowMemoryCaptureState WorkflowCaptureState =
|
||||
UHyperTwistContractLibrary::MakeSampleSkillWorkflowMemoryCaptureState();
|
||||
|
||||
TestTrue(
|
||||
TEXT("The sample S3-C workflow-memory capture skill state should be structurally valid before serialization."),
|
||||
WorkflowCaptureState.IsStructurallyValid()
|
||||
);
|
||||
|
||||
const FString Json =
|
||||
UHyperTwistContractLibrary::SerializeSkillWorkflowMemoryCaptureStateToJson(
|
||||
WorkflowCaptureState
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("Serialized S3-C JSON should include the opaque-summary-collapse guard field."),
|
||||
Json.Contains(TEXT("bWorkflowMemoryDoesNotCollapseIntoOpaqueSummaries"))
|
||||
);
|
||||
|
||||
FHyperTwistSkillWorkflowMemoryCaptureState RoundTrippedState;
|
||||
TestTrue(
|
||||
TEXT("Deserializing the S3-C workflow-memory capture JSON should succeed."),
|
||||
UHyperTwistContractLibrary::DeserializeSkillWorkflowMemoryCaptureStateFromJson(
|
||||
Json,
|
||||
RoundTrippedState
|
||||
)
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("Round-tripped S3-C workflow-memory capture state should remain structurally valid."),
|
||||
RoundTrippedState.IsStructurallyValid()
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("Round-tripped S3-C skill count should match the original sample."),
|
||||
RoundTrippedState.SkillCount,
|
||||
WorkflowCaptureState.SkillCount
|
||||
);
|
||||
TestEqual(
|
||||
TEXT("Round-tripped S3-C live-skill count should match the original sample."),
|
||||
RoundTrippedState.LiveSkillCount,
|
||||
WorkflowCaptureState.LiveSkillCount
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# HyperTwist Phase S3-C Implementation Packet
|
||||
|
||||
Date: `2026-05-29`
|
||||
|
||||
Packet: `Phase S3-C`
|
||||
|
||||
Title: `first-party workflow-memory capture skills`
|
||||
|
||||
## Outcome
|
||||
|
||||
Implemented now.
|
||||
|
||||
## Landed scope
|
||||
|
||||
- live `skill/capture-session-template`
|
||||
- live `skill/capture-follow-up-routine`
|
||||
- bounded first-party workflow-memory capture state over authoritative
|
||||
procedural/workflow ledger entities and continuity evidence
|
||||
- registry, authoring-harness, audit-ledger, sample-contract, and JSON
|
||||
round-trip support
|
||||
|
||||
## Preserved boundaries
|
||||
|
||||
- `capture-note` remains explicit and non-live
|
||||
- workflow capture remains separate from user-authored notes
|
||||
- workflow capture does not collapse into opaque summaries
|
||||
- no broad browser/docs/design widening in this packet
|
||||
|
||||
## Validation
|
||||
|
||||
- build target: `UnrealHyperTwistEditor Win64 Development`
|
||||
- focused `S3-C` automation tests were discovered by the Unreal automation
|
||||
runner and the first test was queued
|
||||
- on this machine the Unreal automation runner stalled after queue start, so
|
||||
this packet closes with green build plus partial automation evidence rather
|
||||
than a full clean automation sweep
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
# HyperTwist Phase S3-C Preparation Packet
|
||||
|
||||
Date: `2026-05-29`
|
||||
|
||||
Packet: `Phase S3-C`
|
||||
|
||||
Title: `first-party workflow-memory capture skills`
|
||||
|
||||
## Goal
|
||||
|
||||
Land the next bounded memory/continuity skill seam above the already landed
|
||||
first-party memory family by exposing workflow-memory capture skills over
|
||||
authoritative procedural/workflow evidence.
|
||||
|
||||
## Scope
|
||||
|
||||
- `skill/capture-session-template`
|
||||
- `skill/capture-follow-up-routine`
|
||||
- first-party workflow capture state over authoritative lane-12 workflow
|
||||
entities plus bounded continuity evidence
|
||||
- registry, audit-ledger, authoring-harness, sample-contract, and JSON support
|
||||
|
||||
## Required boundaries
|
||||
|
||||
- do not activate user-authored note capture
|
||||
- do not collapse workflow memory into opaque summaries
|
||||
- do not widen beyond bounded procedural/workflow capture over first-party
|
||||
authoritative stores
|
||||
|
||||
## Inputs
|
||||
|
||||
- landed `6R-M1` memory ledger
|
||||
- landed `6R-M2` chronicle and continuity
|
||||
- landed `S1-A` through `S3-B` skill substrate
|
||||
|
||||
## Acceptance gate
|
||||
|
||||
- workflow capture remains provenance-visible, derived-assistive, first-party
|
||||
owned, separate from user-authored notes, and structurally bounded
|
||||
|
|
@ -289,4 +289,6 @@ Specifically:
|
|||
now landed in current code
|
||||
- the bounded first-party `Phase S3-B` recall and compact-view skill packet is
|
||||
now landed in current code
|
||||
- `S3-C` workflow-memory capture skills are now the next clean move
|
||||
- the bounded first-party `Phase S3-C` workflow-memory capture skill packet is
|
||||
now landed in current code
|
||||
- `S4-A` extraction skills are now the next clean move
|
||||
|
|
|
|||
|
|
@ -394,6 +394,18 @@ Acceptance gates:
|
|||
|
||||
- workflow memory does not collapse into opaque summaries
|
||||
|
||||
Current landed posture:
|
||||
|
||||
- the bounded first-party `Phase S3-C` packet is now landed in current code
|
||||
- `capture-session-template` is live over the landed first-party procedural
|
||||
workflow ledger seam for authoritative session-template and drill-workflow
|
||||
entities
|
||||
- `capture-follow-up-routine` is live over the landed first-party procedural
|
||||
workflow and continuity seams for authoritative review-plan, coach-action-plan,
|
||||
and queue follow-up entities
|
||||
- workflow capture remains separate from user-authored notes and does not
|
||||
collapse into opaque summaries
|
||||
|
||||
### S4 - browser/docs/design skills
|
||||
|
||||
#### `S4-A` extraction skills
|
||||
|
|
@ -528,7 +540,7 @@ These are target-shape command families, not claims of implemented reality.
|
|||
|
||||
The next correct sequence is:
|
||||
|
||||
1. `S3-C` workflow-memory capture skills
|
||||
1. `S4-A` extraction skills
|
||||
2. broader browser, workflow, provider, and domain skill widening
|
||||
|
||||
Broader memory, browser, workflow, provider, and domain skill widening should
|
||||
|
|
|
|||
|
|
@ -260,3 +260,8 @@ Future skill growth must follow:
|
|||
live product base for `recall-memory` and optional `generate-compact-view`
|
||||
output over the landed recall and derived adjunct memory seams, while compact
|
||||
views stay linked back to authoritative sources
|
||||
- the bounded first-party `Phase S3-C` workflow-memory capture seam is now the
|
||||
live product base for `capture-session-template` and
|
||||
`capture-follow-up-routine` over authoritative procedural workflow ledger
|
||||
entities plus review/queue continuity evidence, while remaining separate from
|
||||
user-authored note capture and opaque summary collapse
|
||||
|
|
|
|||
|
|
@ -304,9 +304,9 @@ repo.
|
|||
|
||||
| Feature | Status | Primary authority | Notes |
|
||||
|---|---|---|---|
|
||||
| First-party skill registry and enable/disable governance | Implemented now | landed first-party `Phase S1-A`, `Phase S1-B`, `Phase S1-C`, `Phase S1-D`, `Phase S2-A`, `Phase S2-B`, `Phase S2-C`, `Phase S3-A`, and `Phase S3-B` packets | Current bounded first-party skill status/family contracts, command/service binding declarations, permission/scope declarations, provenance/log declarations, manifest entries, registry counts, durable master-switch/per-skill control-state, family visibility groups, disabled-but-installed inert-off-state truth, invocation-record format, command/service provenance, failure/cancel audit-ledger storage, authoring-template sections, registry-grounded examples, per-skill smoke/eval validation-harness contracts, structured permissive wrapper-output contracts, first-party clean-room command-contract specs, first-party clean-room-ready skill specs, bounded first-party continuity/resume skill state, and bounded recall/compact-view skill state are live as bounded substrate. `S3-C` is now the next bounded skillization seam. |
|
||||
| First-party skill registry and enable/disable governance | Implemented now | landed first-party `Phase S1-A`, `Phase S1-B`, `Phase S1-C`, `Phase S1-D`, `Phase S2-A`, `Phase S2-B`, `Phase S2-C`, `Phase S3-A`, `Phase S3-B`, and `Phase S3-C` packets | Current bounded first-party skill status/family contracts, command/service binding declarations, permission/scope declarations, provenance/log declarations, manifest entries, registry counts, durable master-switch/per-skill control-state, family visibility groups, disabled-but-installed inert-off-state truth, invocation-record format, command/service provenance, failure/cancel audit-ledger storage, authoring-template sections, registry-grounded examples, per-skill smoke/eval validation-harness contracts, structured permissive wrapper-output contracts, first-party clean-room command-contract specs, first-party clean-room-ready skill specs, bounded first-party continuity/resume skill state, bounded recall/compact-view skill state, and bounded workflow-memory capture skill state are live as bounded substrate. `S4-A` is now the next bounded skillization seam. |
|
||||
| Review/analyzer skill family | Implemented now | landed first-party `Phase S2-A` packet | Current bounded first-party review/analyzer wrappers are live for architecture scan and policy scan output over permissive product evidence. Broader review/diff/plan helper widening still remains future work. |
|
||||
| Memory/continuity skill family | Implemented now | landed first-party `Phase S3-A` and `Phase S3-B` packets + skillization + memory doctrine | Current bounded `resume-session`, `search-history`, `recall-memory`, and `generate-compact-view` skills are live above the landed first-party `6R-M2`, `6R-M3`, and `6R-M6` memory seams, while `capture-note` remains explicit but non-live under separate owner activation because active user-authored note capture is still not landed beyond the bounded `6R-M5` seam. Compact views remain optional and linked to authoritative sources, and broader workflow-memory widening still remains future work. |
|
||||
| Memory/continuity skill family | Implemented now | landed first-party `Phase S3-A`, `Phase S3-B`, and `Phase S3-C` packets + skillization + memory doctrine | Current bounded `resume-session`, `search-history`, `recall-memory`, `generate-compact-view`, `capture-session-template`, and `capture-follow-up-routine` skills are live above the landed first-party `6R-M1`, `6R-M2`, `6R-M3`, and `6R-M6` memory seams, while `capture-note` remains explicit but non-live under separate owner activation because active user-authored note capture is still not landed beyond the bounded `6R-M5` seam. Compact views remain optional and linked to authoritative sources, workflow capture remains separate from user-authored notes, and broader browser/docs/design skill widening is now the next family step. |
|
||||
| Provider/ops skill family | Deep-source grounded retained + bounded live wrapper | landed first-party `Phase S2-A` packet + skillization + provider doctrine | Current bounded route-inspection wrapper output is live above the landed provider-neutral speech/provider seams, while broader provider/ops skill widening still remains retained. |
|
||||
| Restrictive training/coaching clean-room skill-spec family | Implemented now, spec-only bounded seam | landed first-party `Phase S2-B` and `Phase S2-C` packets + skillization doctrine | Current restrictive training/coaching skillization seam is now clean-room-ready in first-party terms for bounded Roux session review output. HyperTwist owns the first-party command contract, safety model, and clean-room-ready skill spec, while live clean-room skill behavior still remains separately deferred unless later reopened. |
|
||||
| Domain/creative skill packs | Shallow placeholder | skillization doctrine only | Keep internal until source-grounded. |
|
||||
|
|
|
|||
|
|
@ -124,6 +124,10 @@ The landed bounded first-party `Phase S1-A` packet keeps:
|
|||
- the landed bounded first-party `Phase S3-B` packet now keeps recall and
|
||||
compact-view output provenance-visible while requiring compact views to
|
||||
remain optional and linked back to authoritative sources
|
||||
- the landed bounded first-party `Phase S3-C` packet now keeps workflow-memory
|
||||
capture output provenance-visible while requiring capture state to remain
|
||||
anchored to authoritative workflow entities, separate from user-authored
|
||||
notes, and free of opaque summary collapse
|
||||
|
||||
## Memory-specific consequence
|
||||
|
||||
|
|
|
|||
|
|
@ -185,7 +185,9 @@ Canonical discovery surfaces for roadmap interpretation:
|
|||
now landed in current code
|
||||
- the bounded first-party `Phase S3-B` recall and compact-view skill packet is
|
||||
now landed in current code
|
||||
- `S3-C` workflow-memory capture skills are now the next clean move
|
||||
- the bounded first-party `Phase S3-C` workflow-memory capture skill packet is
|
||||
now landed in current code
|
||||
- `S4-A` extraction skills are now the next clean move
|
||||
- the generic source-backed `Phase 6R-R` shared classic-cube recognition multi-face
|
||||
correction/explanation control pass is now consumed
|
||||
- the bounded permissive `Phase 6R-R` shared classic-cube recognition multi-face
|
||||
|
|
|
|||
|
|
@ -130,8 +130,9 @@ A coding model working on HyperTwist should still be able to:
|
|||
|
||||
The next correct skillization sequence is:
|
||||
|
||||
1. workflow-memory capture skills
|
||||
2. broader browser/docs/design skills
|
||||
1. extraction skills
|
||||
2. browser diagnostics skills
|
||||
3. design shell skills
|
||||
|
||||
Broader memory, provider, and domain skill widening should wait until that
|
||||
base exists.
|
||||
browser/docs/design base exists.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue