mirror-mind 0.0.1 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/log-assistant-reply.sh +85 -0
- package/.claude/hooks/log-session-end.sh +85 -0
- package/.claude/hooks/log-user-prompt.sh +85 -0
- package/.claude/hooks/mirror-inject.sh +85 -0
- package/.claude/hooks/session-start.sh +85 -0
- package/.gemini/hooks/log-assistant.sh +85 -0
- package/.gemini/hooks/log-user.sh +85 -0
- package/.gemini/hooks/session-end.sh +85 -0
- package/.gemini/hooks/session-start.sh +85 -0
- package/.pi/extensions/mirror-logger.ts +646 -0
- package/.pi/skills/mm-backup/SKILL.md +21 -0
- package/.pi/skills/mm-build/SKILL.md +1206 -0
- package/.pi/skills/mm-consolidate/SKILL.md +112 -0
- package/.pi/skills/mm-consult/SKILL.md +70 -0
- package/.pi/skills/mm-conversations/SKILL.md +16 -0
- package/.pi/skills/mm-discard/SKILL.md +39 -0
- package/.pi/skills/mm-explore/SKILL.md +255 -0
- package/.pi/skills/mm-help/SKILL.md +74 -0
- package/.pi/skills/mm-identity/SKILL.md +96 -0
- package/.pi/skills/mm-journal/SKILL.md +16 -0
- package/.pi/skills/mm-journey/SKILL.md +23 -0
- package/.pi/skills/mm-journeys/SKILL.md +15 -0
- package/.pi/skills/mm-memories/SKILL.md +17 -0
- package/.pi/skills/mm-mirror/SKILL.md +98 -0
- package/.pi/skills/mm-mute/SKILL.md +18 -0
- package/.pi/skills/mm-new/SKILL.md +18 -0
- package/.pi/skills/mm-recall/SKILL.md +17 -0
- package/.pi/skills/mm-release-notes/SKILL.md +52 -0
- package/.pi/skills/mm-seed/SKILL.md +19 -0
- package/.pi/skills/mm-shadow/SKILL.md +117 -0
- package/.pi/skills/mm-soul/SKILL.md +502 -0
- package/.pi/skills/mm-tasks/SKILL.md +24 -0
- package/.pi/skills/mm-update/SKILL.md +32 -0
- package/.pi/skills/mm-week/SKILL.md +28 -0
- package/.pi/skills/mm-welcome/SKILL.md +24 -0
- package/AGENTS.md +188 -0
- package/README.md +126 -9
- package/bin/loader.js +67 -0
- package/bin/mirror-hook.js +7 -0
- package/bin/mirror.js +7 -0
- package/docs/releases/index.md +100 -0
- package/docs/releases/pending-cutoffs.md +510 -0
- package/docs/releases/v0.10.0.md +123 -0
- package/docs/releases/v0.10.1.md +66 -0
- package/docs/releases/v0.10.10.md +51 -0
- package/docs/releases/v0.10.11.md +39 -0
- package/docs/releases/v0.10.12.md +57 -0
- package/docs/releases/v0.10.13.md +35 -0
- package/docs/releases/v0.10.14.md +42 -0
- package/docs/releases/v0.10.15.md +53 -0
- package/docs/releases/v0.10.16.md +35 -0
- package/docs/releases/v0.10.17.md +43 -0
- package/docs/releases/v0.10.2.md +64 -0
- package/docs/releases/v0.10.3.md +78 -0
- package/docs/releases/v0.10.4.md +42 -0
- package/docs/releases/v0.10.5.md +57 -0
- package/docs/releases/v0.10.6.md +47 -0
- package/docs/releases/v0.10.7.md +53 -0
- package/docs/releases/v0.10.8.md +49 -0
- package/docs/releases/v0.10.9.md +37 -0
- package/docs/releases/v0.11.0.md +86 -0
- package/docs/releases/v0.12.0.md +67 -0
- package/docs/releases/v0.13.0.md +64 -0
- package/docs/releases/v0.14.0.md +68 -0
- package/docs/releases/v0.15.0.md +48 -0
- package/docs/releases/v0.16.0.md +50 -0
- package/docs/releases/v0.16.1.md +55 -0
- package/docs/releases/v0.16.2.md +36 -0
- package/docs/releases/v0.17.0.md +50 -0
- package/docs/releases/v0.17.1.md +58 -0
- package/docs/releases/v0.17.2.md +42 -0
- package/docs/releases/v0.17.3.md +58 -0
- package/docs/releases/v0.18.0.md +84 -0
- package/docs/releases/v0.18.1.md +51 -0
- package/docs/releases/v0.18.2.md +69 -0
- package/docs/releases/v0.19.0.md +85 -0
- package/docs/releases/v0.19.1.md +46 -0
- package/docs/releases/v0.20.0.md +85 -0
- package/docs/releases/v0.21.0.md +61 -0
- package/docs/releases/v0.21.1.md +47 -0
- package/docs/releases/v0.22.0.md +77 -0
- package/docs/releases/v0.22.1.md +42 -0
- package/docs/releases/v0.23.0.md +105 -0
- package/docs/releases/v0.24.0.md +125 -0
- package/docs/releases/v0.25.0.md +107 -0
- package/docs/releases/v0.26.0.md +139 -0
- package/docs/releases/v0.26.1.md +65 -0
- package/docs/releases/v0.26.2.md +43 -0
- package/docs/releases/v0.27.0.md +63 -0
- package/docs/releases/v0.28.0.md +59 -0
- package/docs/releases/v0.29.0.md +61 -0
- package/docs/releases/v0.29.1.md +59 -0
- package/docs/releases/v0.29.2.md +59 -0
- package/docs/releases/v0.29.3.md +93 -0
- package/docs/releases/v0.30.0.md +75 -0
- package/docs/releases/v0.30.1.md +93 -0
- package/docs/releases/v0.30.2.md +66 -0
- package/docs/releases/v0.31.0.md +122 -0
- package/docs/releases/v0.31.1.md +142 -0
- package/docs/releases/v0.31.10.md +118 -0
- package/docs/releases/v0.31.11.md +88 -0
- package/docs/releases/v0.31.12.md +105 -0
- package/docs/releases/v0.31.13.md +99 -0
- package/docs/releases/v0.31.14.md +97 -0
- package/docs/releases/v0.31.2.md +115 -0
- package/docs/releases/v0.31.3.md +142 -0
- package/docs/releases/v0.31.4.md +117 -0
- package/docs/releases/v0.31.5.md +155 -0
- package/docs/releases/v0.31.6.md +132 -0
- package/docs/releases/v0.31.7.md +132 -0
- package/docs/releases/v0.31.8.md +120 -0
- package/docs/releases/v0.31.9.md +120 -0
- package/docs/releases/v0.32.0.md +261 -0
- package/docs/releases/v0.32.1.md +59 -0
- package/docs/releases/v0.33.0.md +164 -0
- package/docs/releases/v0.8.0.md +118 -0
- package/docs/releases/v0.9.0.md +98 -0
- package/docs/releases/v0.9.1.md +83 -0
- package/package.json +102 -6
- package/plugins/mirror-mind/.claude-plugin/plugin.json +17 -0
- package/plugins/mirror-mind/hooks/hooks.json +62 -0
- package/plugins/mirror-mind/hooks/log-assistant-reply.sh +98 -0
- package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
- package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
- package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
- package/plugins/mirror-mind/hooks/session-start.sh +98 -0
- package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
- package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
- package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
- package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
- package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
- package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
- package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
- package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
- package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
- package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
- package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
- package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +67 -0
- package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
- package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
- package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
- package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
- package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
- package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
- package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
- package/scripts/codex-hooks/session-end.sh +85 -0
- package/scripts/codex-hooks/session-start.sh +85 -0
- package/scripts/codex-mirror.sh +48 -0
- package/templates/identity/README.md +119 -0
- package/templates/identity/ego/behavior.yaml +52 -0
- package/templates/identity/ego/constraints.yaml +15 -0
- package/templates/identity/ego/identity.yaml +43 -0
- package/templates/identity/journeys/personal-growth.yaml +39 -0
- package/templates/identity/organization/identity.yaml +24 -0
- package/templates/identity/organization/principles.yaml +17 -0
- package/templates/identity/personas/coach.yaml +94 -0
- package/templates/identity/personas/designer.yaml +93 -0
- package/templates/identity/personas/doctor.yaml +96 -0
- package/templates/identity/personas/engineer.yaml +77 -0
- package/templates/identity/personas/financial.yaml +97 -0
- package/templates/identity/personas/prompt-engineer.yaml +122 -0
- package/templates/identity/personas/researcher.yaml +88 -0
- package/templates/identity/personas/strategist.yaml +91 -0
- package/templates/identity/personas/teacher.yaml +95 -0
- package/templates/identity/personas/therapist.yaml +91 -0
- package/templates/identity/personas/thinker.yaml +74 -0
- package/templates/identity/personas/writer.yaml +76 -0
- package/templates/identity/self/config.yaml +16 -0
- package/templates/identity/self/soul.yaml +105 -0
- package/templates/identity/user/identity.yaml +30 -0
- package/ts/src/backup/staging.ts +62 -0
- package/ts/src/backup/zipBackup.ts +267 -0
- package/ts/src/backup/zipReader.ts +109 -0
- package/ts/src/backup/zipWriter.ts +148 -0
- package/ts/src/builder/activeCheckpoint.ts +134 -0
- package/ts/src/builder/aggregateStatus.ts +34 -0
- package/ts/src/builder/approve.ts +149 -0
- package/ts/src/builder/argv.ts +292 -0
- package/ts/src/builder/ariadMethod.ts +536 -0
- package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
- package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
- package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
- package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
- package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
- package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
- package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
- package/ts/src/builder/artifacts/storyFiles.ts +61 -0
- package/ts/src/builder/artifacts/storyIndex.ts +166 -0
- package/ts/src/builder/cadence.ts +59 -0
- package/ts/src/builder/card.ts +192 -0
- package/ts/src/builder/checkpointRefused.ts +66 -0
- package/ts/src/builder/closure.ts +964 -0
- package/ts/src/builder/commands.ts +2053 -0
- package/ts/src/builder/cursorPosition.ts +176 -0
- package/ts/src/builder/cursorTransitions.ts +77 -0
- package/ts/src/builder/deliveryCursor.ts +577 -0
- package/ts/src/builder/deliveryStoryClosure.ts +521 -0
- package/ts/src/builder/deliveryStoryPlan.ts +536 -0
- package/ts/src/builder/deliveryStoryReady.ts +160 -0
- package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
- package/ts/src/builder/expand.ts +336 -0
- package/ts/src/builder/flowUnit.ts +339 -0
- package/ts/src/builder/homeSurface.ts +122 -0
- package/ts/src/builder/implementationGuard.ts +125 -0
- package/ts/src/builder/index.ts +11 -0
- package/ts/src/builder/lifecycleRefusal.ts +92 -0
- package/ts/src/builder/lifecycleRibbon.ts +159 -0
- package/ts/src/builder/load.ts +313 -0
- package/ts/src/builder/methodAdoption.ts +113 -0
- package/ts/src/builder/methodDefinition.ts +429 -0
- package/ts/src/builder/methodInspection.ts +371 -0
- package/ts/src/builder/plan.ts +408 -0
- package/ts/src/builder/planPreauthorization.ts +265 -0
- package/ts/src/builder/prepare.ts +225 -0
- package/ts/src/builder/projectPaths.ts +64 -0
- package/ts/src/builder/pull.ts +356 -0
- package/ts/src/builder/pullCandidates.ts +463 -0
- package/ts/src/builder/pullCandidatesRender.ts +238 -0
- package/ts/src/builder/refinementField.ts +93 -0
- package/ts/src/builder/releaseIntent.ts +173 -0
- package/ts/src/builder/resumeState.ts +84 -0
- package/ts/src/builder/resumeSurface.ts +149 -0
- package/ts/src/builder/roadmapGrammar.ts +300 -0
- package/ts/src/builder/roadmapScan.ts +97 -0
- package/ts/src/builder/roadmapScope.ts +210 -0
- package/ts/src/builder/scopePhrases.ts +146 -0
- package/ts/src/builder/storyPaths.ts +196 -0
- package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
- package/ts/src/builder/surfaceProtocol.ts +42 -0
- package/ts/src/builder/templateGeneration.ts +148 -0
- package/ts/src/builder/transition.ts +178 -0
- package/ts/src/consult/args.ts +99 -0
- package/ts/src/consult/core.ts +122 -0
- package/ts/src/consult/modelCatalog.ts +55 -0
- package/ts/src/consult/render.ts +47 -0
- package/ts/src/conversation/append.ts +414 -0
- package/ts/src/conversation/backfill.ts +387 -0
- package/ts/src/conversation/closeTail.ts +467 -0
- package/ts/src/conversation/extraction.ts +333 -0
- package/ts/src/conversation/extractionDriver.ts +130 -0
- package/ts/src/conversation/extractionRun.ts +70 -0
- package/ts/src/conversation/hookPayload.ts +51 -0
- package/ts/src/conversation/journeyInference.ts +165 -0
- package/ts/src/conversation/journeyRepair.ts +114 -0
- package/ts/src/conversation/lifecycleFaces.ts +197 -0
- package/ts/src/conversation/lifecycleWrites.ts +313 -0
- package/ts/src/conversation/listing.ts +77 -0
- package/ts/src/conversation/logger.ts +851 -0
- package/ts/src/conversation/loggerCli.ts +321 -0
- package/ts/src/conversation/loggerRuntime.ts +259 -0
- package/ts/src/conversation/metadataLifecycle.ts +443 -0
- package/ts/src/conversation/recall.ts +66 -0
- package/ts/src/conversation/sessionComposites.ts +258 -0
- package/ts/src/conversation/sessionImport.ts +90 -0
- package/ts/src/conversation/transcriptBackfill.ts +141 -0
- package/ts/src/cultivation/applyActions.ts +241 -0
- package/ts/src/cultivation/cluster.ts +86 -0
- package/ts/src/cultivation/consolidationStore.ts +281 -0
- package/ts/src/cultivation/promptContext.ts +62 -0
- package/ts/src/cultivation/propose.ts +305 -0
- package/ts/src/cultivation/scan.ts +155 -0
- package/ts/src/db/backupGate.ts +47 -0
- package/ts/src/db/bootstrap.ts +108 -0
- package/ts/src/db/bootstrapLock.ts +223 -0
- package/ts/src/db/copyGuard.ts +60 -0
- package/ts/src/db/database.ts +397 -0
- package/ts/src/db/decode.ts +66 -0
- package/ts/src/db/ftsIntegrity.ts +41 -0
- package/ts/src/db/migrateOnOpen.ts +214 -0
- package/ts/src/db/migrations.ts +576 -0
- package/ts/src/db/readyOnOpen.ts +35 -0
- package/ts/src/db/rowDecode.ts +42 -0
- package/ts/src/db/schema.ts +432 -0
- package/ts/src/db/schemaInventory.ts +225 -0
- package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
- package/ts/src/db/schemaState.ts +91 -0
- package/ts/src/db/schemaTsDivergence.ts +114 -0
- package/ts/src/descriptor/descriptorRead.ts +49 -0
- package/ts/src/docs/docsLint.ts +265 -0
- package/ts/src/explorer/handoff.ts +522 -0
- package/ts/src/explorer/render.ts +335 -0
- package/ts/src/explorer/story.ts +769 -0
- package/ts/src/explorer/transition.ts +72 -0
- package/ts/src/extensions/bindings.ts +170 -0
- package/ts/src/extensions/catalog.ts +249 -0
- package/ts/src/extensions/catalogCommands.ts +513 -0
- package/ts/src/extensions/catalogWrites.ts +652 -0
- package/ts/src/extensions/contextRuntime.ts +325 -0
- package/ts/src/extensions/dispatch.ts +374 -0
- package/ts/src/extensions/errors.ts +24 -0
- package/ts/src/extensions/manifest.ts +356 -0
- package/ts/src/extensions/migrations.ts +350 -0
- package/ts/src/extraction/conversation.ts +304 -0
- package/ts/src/extraction/conversationMetadata.ts +206 -0
- package/ts/src/extraction/fencing.ts +106 -0
- package/ts/src/extraction/json.ts +17 -0
- package/ts/src/extraction/prompts.ts +470 -0
- package/ts/src/frontDoor/args.ts +30 -0
- package/ts/src/frontDoor/argvShape.ts +106 -0
- package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
- package/ts/src/frontDoor/buildRoute.ts +398 -0
- package/ts/src/frontDoor/cli.ts +1872 -0
- package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
- package/ts/src/frontDoor/consultRoute.ts +50 -0
- package/ts/src/frontDoor/contentTailRoute.ts +239 -0
- package/ts/src/frontDoor/conversationLoggerRoute.ts +83 -0
- package/ts/src/frontDoor/cultivationRoute.ts +210 -0
- package/ts/src/frontDoor/dbPath.ts +131 -0
- package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
- package/ts/src/frontDoor/exploreRoute.ts +572 -0
- package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
- package/ts/src/frontDoor/frontDoorLog.ts +57 -0
- package/ts/src/frontDoor/identityWrite.ts +36 -0
- package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
- package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
- package/ts/src/frontDoor/liveBackup.ts +100 -0
- package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
- package/ts/src/frontDoor/namedRefusal.ts +35 -0
- package/ts/src/frontDoor/nodeSupport.ts +24 -0
- package/ts/src/frontDoor/render/consolidate.ts +199 -0
- package/ts/src/frontDoor/render/conversations.ts +33 -0
- package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
- package/ts/src/frontDoor/render/descriptor.ts +20 -0
- package/ts/src/frontDoor/render/detectPersona.ts +50 -0
- package/ts/src/frontDoor/render/icons.ts +13 -0
- package/ts/src/frontDoor/render/identity.ts +59 -0
- package/ts/src/frontDoor/render/identityRows.ts +17 -0
- package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
- package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
- package/ts/src/frontDoor/render/journeys.ts +79 -0
- package/ts/src/frontDoor/render/list.ts +41 -0
- package/ts/src/frontDoor/render/memories.ts +67 -0
- package/ts/src/frontDoor/render/recall.ts +49 -0
- package/ts/src/frontDoor/render/shadow.ts +155 -0
- package/ts/src/frontDoor/render/tasks.ts +99 -0
- package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
- package/ts/src/frontDoor/render/week.ts +113 -0
- package/ts/src/frontDoor/routing.ts +1001 -0
- package/ts/src/frontDoor/runtimeRoute.ts +623 -0
- package/ts/src/frontDoor/searchRoute.ts +166 -0
- package/ts/src/frontDoor/seedPaths.ts +98 -0
- package/ts/src/frontDoor/sessionStartWelcomeRoute.ts +166 -0
- package/ts/src/frontDoor/soulRoute.ts +433 -0
- package/ts/src/frontDoor/stdinSource.ts +37 -0
- package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
- package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
- package/ts/src/frontDoor/usage.ts +176 -0
- package/ts/src/guards/claudePlugin.ts +298 -0
- package/ts/src/guards/packContents.ts +306 -0
- package/ts/src/guards/piSourcedSkills.ts +70 -0
- package/ts/src/guards/retiredRouteShadows.ts +57 -0
- package/ts/src/guards/retiredSurfaces.ts +564 -0
- package/ts/src/hooks/claude.ts +214 -0
- package/ts/src/hooks/codex.ts +45 -0
- package/ts/src/hooks/gemini.ts +126 -0
- package/ts/src/hooks/main.ts +109 -0
- package/ts/src/hooks/mirrorState.ts +71 -0
- package/ts/src/hooks/payload.ts +73 -0
- package/ts/src/hooks/runtime.ts +179 -0
- package/ts/src/hooks/runtimeDetection.ts +34 -0
- package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
- package/ts/src/identity/descriptorGenerate.ts +162 -0
- package/ts/src/identity/identityEdit.ts +143 -0
- package/ts/src/identity/identityKey.ts +77 -0
- package/ts/src/identity/identityRead.ts +69 -0
- package/ts/src/identity/identityStore.ts +80 -0
- package/ts/src/identity/journeyListing.ts +53 -0
- package/ts/src/identity/personaInspect.ts +44 -0
- package/ts/src/identity/personaListing.ts +37 -0
- package/ts/src/identity/setIdentity.ts +64 -0
- package/ts/src/index.ts +231 -0
- package/ts/src/init/init.ts +111 -0
- package/ts/src/journey/journeyOptions.ts +131 -0
- package/ts/src/journey/journeyRemoval.ts +158 -0
- package/ts/src/journey/journeyStatus.ts +149 -0
- package/ts/src/journey/journeySyncFile.ts +87 -0
- package/ts/src/journey/journeyWrite.ts +203 -0
- package/ts/src/journey/parentJourney.ts +41 -0
- package/ts/src/journey/validateParentJourney.ts +55 -0
- package/ts/src/mcp/boundary.ts +151 -0
- package/ts/src/mcp/guards.ts +244 -0
- package/ts/src/mcp/main.ts +121 -0
- package/ts/src/mcp/payload.ts +141 -0
- package/ts/src/mcp/protocol.ts +141 -0
- package/ts/src/mcp/readModels.ts +241 -0
- package/ts/src/mcp/registry.ts +201 -0
- package/ts/src/mcp/serve.ts +120 -0
- package/ts/src/mcp/tools/deterministic.ts +137 -0
- package/ts/src/mcp/tools/providerCrossing.ts +187 -0
- package/ts/src/mcp/wire.ts +8 -0
- package/ts/src/memory/journal.ts +180 -0
- package/ts/src/memory/listing.ts +107 -0
- package/ts/src/memory/memoryWrite.ts +88 -0
- package/ts/src/memory/reinforcement.ts +35 -0
- package/ts/src/mirror/context.ts +161 -0
- package/ts/src/mirror/defaultResolution.ts +199 -0
- package/ts/src/mirror/mirrorForm.ts +43 -0
- package/ts/src/mirror/orchestration.ts +364 -0
- package/ts/src/mirror/reception.ts +194 -0
- package/ts/src/mirror/render.ts +75 -0
- package/ts/src/mirror/runtimeSession.ts +205 -0
- package/ts/src/mode/operatingMode.ts +148 -0
- package/ts/src/observability/callOutcome.ts +115 -0
- package/ts/src/observability/inspectLedger.ts +329 -0
- package/ts/src/observability/ledgerHooks.ts +126 -0
- package/ts/src/observability/llmCalls.ts +154 -0
- package/ts/src/persona/detectPersona.ts +81 -0
- package/ts/src/planning/promptAssembly.ts +111 -0
- package/ts/src/planning/weekPending.ts +81 -0
- package/ts/src/planning/weekPlan.ts +183 -0
- package/ts/src/planning/weekSave.ts +117 -0
- package/ts/src/providers/config.ts +189 -0
- package/ts/src/providers/cost.ts +64 -0
- package/ts/src/providers/credits.ts +204 -0
- package/ts/src/providers/embedding.ts +321 -0
- package/ts/src/providers/familyProviders.ts +147 -0
- package/ts/src/providers/llm.ts +334 -0
- package/ts/src/providers/openrouter.ts +244 -0
- package/ts/src/providers/redaction.ts +110 -0
- package/ts/src/providers/replay.ts +15 -0
- package/ts/src/providers/transport.ts +410 -0
- package/ts/src/repair/encodingRepair.ts +253 -0
- package/ts/src/runtime/backup.ts +151 -0
- package/ts/src/runtime/channel.ts +146 -0
- package/ts/src/runtime/config.ts +168 -0
- package/ts/src/runtime/diagnose.ts +686 -0
- package/ts/src/runtime/git.ts +510 -0
- package/ts/src/runtime/installKind.ts +220 -0
- package/ts/src/runtime/migrate.ts +154 -0
- package/ts/src/runtime/packageIdentity.ts +102 -0
- package/ts/src/runtime/releaseNotes.ts +244 -0
- package/ts/src/runtime/status.ts +557 -0
- package/ts/src/runtime/strategies/clone.ts +200 -0
- package/ts/src/runtime/strategies/package.ts +328 -0
- package/ts/src/runtime/treeRoot.ts +30 -0
- package/ts/src/runtime/update.ts +445 -0
- package/ts/src/runtime/updateGate.ts +40 -0
- package/ts/src/runtime/updatePipeline.ts +159 -0
- package/ts/src/runtime/version.ts +36 -0
- package/ts/src/runtime/wiring.ts +130 -0
- package/ts/src/search/memorySearch.ts +338 -0
- package/ts/src/search/ranker.ts +154 -0
- package/ts/src/seed/seed.ts +256 -0
- package/ts/src/seed/seedYaml.ts +133 -0
- package/ts/src/soul/apply.ts +218 -0
- package/ts/src/soul/harvest.ts +267 -0
- package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
- package/ts/src/soul/prompts/soul_self_voice.md +219 -0
- package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
- package/ts/src/soul/prompts.ts +85 -0
- package/ts/src/soul/render.ts +358 -0
- package/ts/src/soul/state.ts +212 -0
- package/ts/src/soul/transition.ts +37 -0
- package/ts/src/tasks/journeyPathParse.ts +113 -0
- package/ts/src/tasks/taskImportSync.ts +142 -0
- package/ts/src/tasks/taskStore.ts +312 -0
- package/ts/src/tasks/weekView.ts +120 -0
- package/ts/src/util/clipCodePoints.ts +26 -0
- package/ts/src/util/paths.ts +63 -0
- package/ts/src/util/program.ts +9 -0
- package/ts/src/util/pyGenerators.ts +144 -0
- package/ts/src/util/pythonText.ts +317 -0
- package/ts/src/util/semver.ts +45 -0
- package/ts/src/util/shellWord.ts +25 -0
- package/ts/src/util/slug.ts +64 -0
- package/ts/src/welcome/card.ts +339 -0
- package/ts/src/welcome/statusLine.ts +101 -0
- package/ts/src/welcome/updateCache.ts +129 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
// Fail CI when a surface CV22.DS10 retired comes back, or never fully left.
|
|
2
|
+
//
|
|
3
|
+
// The Node port of `scripts/check_retired_surfaces.py` (CV22.DS10.TS5, slice
|
|
4
|
+
// B). The Zero Python gate assigns that file here with a one-line reason that
|
|
5
|
+
// is the whole argument: **it must outlive the deletion it proves.** A guard
|
|
6
|
+
// written in the language it forbids cannot run on the day the language is
|
|
7
|
+
// gone.
|
|
8
|
+
//
|
|
9
|
+
// DS10 removes surfaces rather than porting them. Each deletion is large,
|
|
10
|
+
// touches many files, and is easy to leave half-done -- a dangling import, a
|
|
11
|
+
// `--help` row, a skill still naming the command, a test patching a module
|
|
12
|
+
// nobody has anymore. A deletion has no test of its own. This is that test:
|
|
13
|
+
// one table, one sweep, and a row added by each retiring story. Per surface:
|
|
14
|
+
//
|
|
15
|
+
// * ABSENCE -- every path the story deleted is still gone.
|
|
16
|
+
// * NO RESIDUE -- no tracked file mentions the surface, except where the
|
|
17
|
+
// mention is the point: the roadmap, decisions, debt, refinement, and
|
|
18
|
+
// release notes, which exist to record that it was retired and why.
|
|
19
|
+
//
|
|
20
|
+
// What it deliberately does NOT do: prove the deletion was correct. The suites
|
|
21
|
+
// do that. This proves it was COMPLETE, and stays complete.
|
|
22
|
+
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
import { readFileSync } from "node:fs";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Mentions are expected -- and required -- in the documents whose job is to
|
|
29
|
+
* record the retirement. Everything else is residue.
|
|
30
|
+
*/
|
|
31
|
+
export const HISTORY_PREFIXES: readonly string[] = [
|
|
32
|
+
// Everything under `docs/project/` is the project's record of itself --
|
|
33
|
+
// roadmap, decisions, debt, refinement, audits, briefing. A retired surface
|
|
34
|
+
// is supposed to be named there.
|
|
35
|
+
"docs/project/",
|
|
36
|
+
"docs/process/worklog.md",
|
|
37
|
+
"docs/releases/",
|
|
38
|
+
// A guard's own table is the one file that must name every retired surface:
|
|
39
|
+
// the patterns ARE the data, so the table and its self-test exempt
|
|
40
|
+
// themselves, as the Python original (deleted at TS5 plateau 3) always did.
|
|
41
|
+
//
|
|
42
|
+
// Both guards learned this the same way, in CI rather than locally, because
|
|
43
|
+
// the sweep reads `git ls-files` -- so a file that is written but not yet
|
|
44
|
+
// COMMITTED is invisible to it. Local green on new files is not evidence.
|
|
45
|
+
"ts/src/guards/retiredSurfaces.ts",
|
|
46
|
+
"ts/test/scripts/retiredSurfaces.test.ts",
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
export interface RetiredSurface {
|
|
50
|
+
readonly surfaceId: string;
|
|
51
|
+
readonly story: string;
|
|
52
|
+
/** Paths that must not exist. Directories end with `/`. */
|
|
53
|
+
readonly absentPaths: readonly string[];
|
|
54
|
+
/**
|
|
55
|
+
* File suffixes that must not be tracked ANYWHERE -- `.py`, for the claim
|
|
56
|
+
* that the repository holds no Python at all rather than none in the paths
|
|
57
|
+
* someone thought to list (CV22.DS10.TS5).
|
|
58
|
+
*/
|
|
59
|
+
readonly absentSuffixes?: readonly string[];
|
|
60
|
+
/** Regexes that must not appear in tracked files outside HISTORY_PREFIXES. */
|
|
61
|
+
readonly forbiddenPatterns: readonly string[];
|
|
62
|
+
/** Paths allowed to mention the surface beyond the history prefixes, with why. */
|
|
63
|
+
readonly exemptions: Readonly<Record<string, string>>;
|
|
64
|
+
/**
|
|
65
|
+
* When present, the residue sweep reads ONLY tracked files under these
|
|
66
|
+
* prefixes. For a claim about one kind of file -- "no workflow installs an
|
|
67
|
+
* interpreter" -- where the same words elsewhere (a guide explaining what
|
|
68
|
+
* CI used to do) are not residue.
|
|
69
|
+
*/
|
|
70
|
+
readonly residueScope?: readonly string[];
|
|
71
|
+
/**
|
|
72
|
+
* A row that is DEFINED but not yet ENFORCED, with the reason and the moment
|
|
73
|
+
* it goes live.
|
|
74
|
+
*
|
|
75
|
+
* A staged row is not a disabled one. `python-core` below is proven to fire
|
|
76
|
+
* against today's tree by `retiredSurfaces.test.ts` -- it must report the
|
|
77
|
+
* live interpreter, or the test fails. So the row is graded now and enforced
|
|
78
|
+
* later, and going live at plateau 3 is a one-word edit rather than new,
|
|
79
|
+
* unexercised code written on the day the safety net is already gone.
|
|
80
|
+
*/
|
|
81
|
+
readonly stagedUntil?: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Every shape in which a line of text can tell someone to run the deleted
|
|
86
|
+
* Python core: the interpreter by any name it was invoked under, `uv` itself,
|
|
87
|
+
* and the core as an importable package -- the shape the runtime hooks used,
|
|
88
|
+
* which no command-level pattern can see.
|
|
89
|
+
*
|
|
90
|
+
* Exported because two things need the same list: the `python-core-mentions`
|
|
91
|
+
* row below, which reads the TRACKED FILES, and the tests that grade what the
|
|
92
|
+
* product PRINTS -- an updater recommendation or a recovery route that sends a
|
|
93
|
+
* user back to the interpreter is the same residue, one step later, and no
|
|
94
|
+
* file scan can see a string the code assembles at runtime.
|
|
95
|
+
*/
|
|
96
|
+
export const INTERPRETER_INVOCATIONS: readonly string[] = [
|
|
97
|
+
// The interpreter, by any name it is invoked under.
|
|
98
|
+
"uv run python",
|
|
99
|
+
"python3? -m memory\\b",
|
|
100
|
+
"python3? -c ",
|
|
101
|
+
"\\buv (run|sync)\\b",
|
|
102
|
+
// The core as an importable Python package.
|
|
103
|
+
"from memory\\.",
|
|
104
|
+
"from memory import",
|
|
105
|
+
"import memory\\b",
|
|
106
|
+
"memory\\.hooks",
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
export const RETIRED: readonly RetiredSurface[] = [
|
|
110
|
+
{
|
|
111
|
+
surfaceId: "journey-projections",
|
|
112
|
+
story: "CV22.DS10.TS1",
|
|
113
|
+
absentPaths: [
|
|
114
|
+
"src/memory/journey_projections/",
|
|
115
|
+
"src/memory/cli/journey_projection.py",
|
|
116
|
+
"ts/src/explorer/projectionRefresh.ts",
|
|
117
|
+
"tests/unit/memory/journey_projections/",
|
|
118
|
+
"tests/integration/memory/journey_projections/",
|
|
119
|
+
"tests/fixtures/journey_projections/",
|
|
120
|
+
],
|
|
121
|
+
forbiddenPatterns: [
|
|
122
|
+
"journey_projections",
|
|
123
|
+
"journey-projection\\b",
|
|
124
|
+
"createPythonProjectionRefresh",
|
|
125
|
+
"requestProjectionRefresh",
|
|
126
|
+
// The API names, not just the module names. CI found
|
|
127
|
+
// `configure_projection_refresh` surviving in `ts/parity/` after the
|
|
128
|
+
// first version of this table missed it: the patterns were written from
|
|
129
|
+
// the files the deletion touched, which is the one place residue cannot
|
|
130
|
+
// be.
|
|
131
|
+
"configure_projection_refresh",
|
|
132
|
+
"request_projection_refresh",
|
|
133
|
+
],
|
|
134
|
+
exemptions: {
|
|
135
|
+
"docs/product/extensions/api-reference.md":
|
|
136
|
+
"documents the removal for an extension author reading an older copy",
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
surfaceId: "web-console",
|
|
141
|
+
story: "CV22.DS10.US1",
|
|
142
|
+
absentPaths: [
|
|
143
|
+
"src/memory/web/",
|
|
144
|
+
"src/memory/surfaces/atlas.py",
|
|
145
|
+
"src/memory/surfaces/workspace.py",
|
|
146
|
+
"src/memory/surfaces/evidence.py",
|
|
147
|
+
"src/memory/surfaces/objects.py",
|
|
148
|
+
"src/memory/surfaces/models.py",
|
|
149
|
+
"src/memory/surfaces/search.py",
|
|
150
|
+
"src/memory/intelligence/scene.py",
|
|
151
|
+
"evals/scene.py",
|
|
152
|
+
"tests/unit/memory/web/",
|
|
153
|
+
"tests/unit/memory/evals/test_scene_fixture_contract.py",
|
|
154
|
+
"tests/unit/memory/intelligence/test_scene.py",
|
|
155
|
+
],
|
|
156
|
+
forbiddenPatterns: [
|
|
157
|
+
"memory\\.web\\b",
|
|
158
|
+
"memory web\\b",
|
|
159
|
+
"SurfaceService",
|
|
160
|
+
"intelligence\\.scene\\b",
|
|
161
|
+
"WorkspaceSurface|AtlasSurface|EvidenceSurface|SearchSurface|ObjectDetailSurface",
|
|
162
|
+
],
|
|
163
|
+
exemptions: {},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
surfaceId: "compat-host",
|
|
167
|
+
story: "CV22.DS10.TS2",
|
|
168
|
+
// Gate items 2 and 5 in one mechanical place: item 2 asks that the packaged
|
|
169
|
+
// artifact carry no core-owned Python extension bridge, and item 5 that
|
|
170
|
+
// every retained provider and command enter through a declared
|
|
171
|
+
// language-neutral runtime. Both reduce to the same claim -- the host and
|
|
172
|
+
// every launcher branch for it are gone -- and this check runs over the
|
|
173
|
+
// tracked file set the package is built from.
|
|
174
|
+
absentPaths: [
|
|
175
|
+
"src/memory/extensions/compat_host.py",
|
|
176
|
+
"tests/unit/memory/extensions/test_compat_host.py",
|
|
177
|
+
"ts/parity/generate_ext_dispatch_golden.py",
|
|
178
|
+
"ts/test/fixtures/ext-dispatch.golden.json",
|
|
179
|
+
],
|
|
180
|
+
forbiddenPatterns: [
|
|
181
|
+
"compat_host",
|
|
182
|
+
"compat-host",
|
|
183
|
+
// The launcher seams, not only the module. The TS1 lesson: residue hides
|
|
184
|
+
// in the names of the things that CALLED the deleted code, which is the
|
|
185
|
+
// one place the deletion diff cannot show it.
|
|
186
|
+
"validate_register",
|
|
187
|
+
"validateExtensionRegister",
|
|
188
|
+
"legacyCommand",
|
|
189
|
+
"legacyCwd",
|
|
190
|
+
"hostCommand",
|
|
191
|
+
"spawnHost",
|
|
192
|
+
// The generator and the corpus it recorded. `absentPaths` proves the
|
|
193
|
+
// FILES are gone; these prove nothing still CALLS them. CI found the gap
|
|
194
|
+
// the hard way on 2026-09-22: the determinism step kept invoking the
|
|
195
|
+
// deleted generator and failed on Python 3.10 and 3.12 after the files
|
|
196
|
+
// had been removed for four commits.
|
|
197
|
+
"generate_ext_dispatch_golden",
|
|
198
|
+
"ext-dispatch\\.golden",
|
|
199
|
+
],
|
|
200
|
+
exemptions: {
|
|
201
|
+
"ts/test/extensions/dispatch.test.ts":
|
|
202
|
+
"the file that REPLACED the host's parity corpus, and whose header records what each retired group of cases proved -- the disposition itself",
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
surfaceId: "eval-harness",
|
|
207
|
+
story: "CV22.DS10.TS3",
|
|
208
|
+
// The model-behavior release gate moved to ts/evals/ and the Python harness
|
|
209
|
+
// was deleted with its tests, its entry point, and the three helpers that
|
|
210
|
+
// existed only to feed the port. Each of those imported what this story
|
|
211
|
+
// removed, so they die with it -- the fixture and its oracle die together,
|
|
212
|
+
// as in TS2.
|
|
213
|
+
absentPaths: ["evals/", "tests/unit/memory/evals/"],
|
|
214
|
+
forbiddenPatterns: [
|
|
215
|
+
"from evals\\b",
|
|
216
|
+
"import evals\\b",
|
|
217
|
+
"memory eval\\b",
|
|
218
|
+
"evals\\.runner",
|
|
219
|
+
"evals\\._support",
|
|
220
|
+
// The helpers by name: absentPaths proves the FILES are gone, these prove
|
|
221
|
+
// nothing still calls them -- the TS2 lesson, where a CI step kept
|
|
222
|
+
// invoking a deleted generator for four commits.
|
|
223
|
+
"_capture_probe_inputs",
|
|
224
|
+
"_check_fixture_equality",
|
|
225
|
+
"_generate_support_golden",
|
|
226
|
+
],
|
|
227
|
+
exemptions: {},
|
|
228
|
+
},
|
|
229
|
+
// CV22.DS10.TS4 retired five surfaces, so it contributes five rows rather
|
|
230
|
+
// than one. They are separate because they fail separately: a resurrected
|
|
231
|
+
// `migrate-legacy` and a resurrected Workbench verb are different mistakes
|
|
232
|
+
// with different fixes, and one row naming both would report the wrong one.
|
|
233
|
+
//
|
|
234
|
+
// Every pattern below is a COMMAND SHAPE or a MODULE NAME, never bare
|
|
235
|
+
// vocabulary. `mutate`, `change-request`, and `refinement-story` are living
|
|
236
|
+
// Ariad words, so a guard matching the words alone would be red on the day it
|
|
237
|
+
// landed and would then be weakened with exemptions until it meant nothing.
|
|
238
|
+
{
|
|
239
|
+
surfaceId: "legacy-migration",
|
|
240
|
+
story: "CV22.DS10.TS4",
|
|
241
|
+
absentPaths: [
|
|
242
|
+
"src/memory/cli/migrate_legacy.py",
|
|
243
|
+
"src/memory/cli/migration_rehearsal.py",
|
|
244
|
+
"tests/unit/memory/cli/test_migrate_legacy.py",
|
|
245
|
+
"tests/unit/memory/cli/test_migration_rehearsal.py",
|
|
246
|
+
],
|
|
247
|
+
forbiddenPatterns: [
|
|
248
|
+
"migrate_legacy",
|
|
249
|
+
"migration_rehearsal",
|
|
250
|
+
"memory-rehearse-migration",
|
|
251
|
+
"memory migrate-legacy",
|
|
252
|
+
],
|
|
253
|
+
exemptions: {},
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
surfaceId: "journey-admin-verbs",
|
|
257
|
+
story: "CV22.DS10.TS4",
|
|
258
|
+
absentPaths: [
|
|
259
|
+
"src/memory/services/journey_admin.py",
|
|
260
|
+
"src/memory/storage/journey_admin.py",
|
|
261
|
+
"tests/unit/memory/services/test_journey_admin.py",
|
|
262
|
+
],
|
|
263
|
+
forbiddenPatterns: [
|
|
264
|
+
"journey_admin",
|
|
265
|
+
"JourneyAdmin",
|
|
266
|
+
"journey export-registry",
|
|
267
|
+
"journey mutate\\b",
|
|
268
|
+
"mirror\\.journey-mutation@",
|
|
269
|
+
],
|
|
270
|
+
exemptions: {
|
|
271
|
+
"ts/src/frontDoor/routing.ts": "the retired entries that answer the two verbs",
|
|
272
|
+
"ts/src/frontDoor/cli.ts":
|
|
273
|
+
"the refusal itself; the comment names the write verb to explain why it must answer BEFORE stdin is read, which is the property under test",
|
|
274
|
+
"ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
surfaceId: "conversation-metadata-backfill",
|
|
279
|
+
story: "CV22.DS10.TS4",
|
|
280
|
+
absentPaths: [],
|
|
281
|
+
forbiddenPatterns: [
|
|
282
|
+
// The flags and the two service methods. NOT the bare word `backfill`:
|
|
283
|
+
// `conversation-logger backfill-pi-sessions` and
|
|
284
|
+
// `ts/src/conversation/backfill.ts` are the TRANSCRIPT backfills, a
|
|
285
|
+
// different feature that is ported and staying.
|
|
286
|
+
"--metadata-backfill-",
|
|
287
|
+
"metadata_backfill",
|
|
288
|
+
"preview_metadata_backfill",
|
|
289
|
+
"apply_metadata_backfill",
|
|
290
|
+
],
|
|
291
|
+
exemptions: {
|
|
292
|
+
"ts/src/frontDoor/routing.ts": "the retired entries that answer the two flags",
|
|
293
|
+
"ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
|
|
294
|
+
"ts/test/frontDoor/routing.test.ts":
|
|
295
|
+
"asserts the flags are retired whatever the lifecycle gate says",
|
|
296
|
+
"scripts/capture_family_outputs.sh":
|
|
297
|
+
"CV22.DS10.TS5 captures the refusal itself as a command family: the cutoff answer is a user-visible surface, so it is hashed before the deletion and replayed after it",
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
surfaceId: "sqlite-refinement-workbench",
|
|
302
|
+
story: "CV22.DS10.TS4",
|
|
303
|
+
absentPaths: [
|
|
304
|
+
"src/memory/builder/workbench.py",
|
|
305
|
+
"src/memory/builder/workbench_surfaces.py",
|
|
306
|
+
"src/memory/storage/builder_workbench.py",
|
|
307
|
+
"ts/src/builder/workbenchSnapshot.ts",
|
|
308
|
+
"tests/unit/memory/builder/test_workbench.py",
|
|
309
|
+
"tests/unit/memory/storage/test_builder_workbench_store.py",
|
|
310
|
+
],
|
|
311
|
+
forbiddenPatterns: [
|
|
312
|
+
"workbench_surfaces",
|
|
313
|
+
"BuilderWorkbenchStore",
|
|
314
|
+
"get_workbench_snapshot",
|
|
315
|
+
"getWorkbenchSnapshot",
|
|
316
|
+
"safeWorkbenchSnapshot",
|
|
317
|
+
"_safe_workbench_snapshot",
|
|
318
|
+
"workbenchSnapshot",
|
|
319
|
+
"build refinement-story ",
|
|
320
|
+
"build change-request ",
|
|
321
|
+
// The surfaces those twenty commands rendered.
|
|
322
|
+
"CHANGE_REQUEST_CAPTURED",
|
|
323
|
+
"REFINEMENT_STORY_OVERVIEW",
|
|
324
|
+
"REFINEMENT_STORY_PULLED",
|
|
325
|
+
],
|
|
326
|
+
exemptions: {
|
|
327
|
+
"ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
|
|
328
|
+
"scripts/capture_family_outputs.sh":
|
|
329
|
+
"CV22.DS10.TS5 captures the refusal itself as a command family: the cutoff answer is a user-visible surface, so it is hashed before the deletion and replayed after it",
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
surfaceId: "python-core",
|
|
334
|
+
story: "CV22.DS10.TS5",
|
|
335
|
+
// The row DS10's Zero Python gate asks for, written at plateau 0 and split
|
|
336
|
+
// in two at plateau 3 (decision D12). This half is the STRUCTURAL claim,
|
|
337
|
+
// live since plateau 3: nothing the Python core consisted of is tracked, no
|
|
338
|
+
// file anywhere is Python, and no workflow installs an interpreter. The
|
|
339
|
+
// other half -- what the tree still SAYS about Python -- is
|
|
340
|
+
// `python-core-mentions` below, live since plateau 4, once slice H had
|
|
341
|
+
// rewritten the documentation that held most of it.
|
|
342
|
+
//
|
|
343
|
+
// `absentSuffixes` is the part a path list could not express. The Plan's
|
|
344
|
+
// own inventory listed where the Python lived; it was the six fixture
|
|
345
|
+
// bodies nobody listed that proved the list could be short.
|
|
346
|
+
absentPaths: [
|
|
347
|
+
"src/memory/",
|
|
348
|
+
"tests/",
|
|
349
|
+
"pyproject.toml",
|
|
350
|
+
"uv.lock",
|
|
351
|
+
"spikes/ts-search-parity/",
|
|
352
|
+
"scripts/check_doc_links.py",
|
|
353
|
+
"scripts/check_retired_surfaces.py",
|
|
354
|
+
"scripts/check_oracle_drift.py",
|
|
355
|
+
"scripts/build_claude_plugin.py",
|
|
356
|
+
"scripts/reset_sandbox_pet_store.py",
|
|
357
|
+
"ts/parity/",
|
|
358
|
+
],
|
|
359
|
+
absentSuffixes: [".py"],
|
|
360
|
+
// CI installing an interpreter is the same claim at the workflow level, and
|
|
361
|
+
// it is scoped to the workflows: a guide may still explain what CI did.
|
|
362
|
+
forbiddenPatterns: ["setup-python", "astral-sh/setup-uv", "\\buv (run|sync)\\b"],
|
|
363
|
+
residueScope: [".github/workflows/"],
|
|
364
|
+
exemptions: {},
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
surfaceId: "python-core-mentions",
|
|
368
|
+
story: "CV22.DS10.TS5",
|
|
369
|
+
// The second half of the Zero Python row (D12): no tracked file outside
|
|
370
|
+
// the project's record INVOKES the interpreter or imports the core. Staged
|
|
371
|
+
// from plateau 0 -- graded against the live tree, never enforced -- and
|
|
372
|
+
// enforced since plateau 4, when the last of 79 mentions was rewritten or
|
|
373
|
+
// exempted with its reason.
|
|
374
|
+
//
|
|
375
|
+
// It is deliberately WIDER than the guard it replaces. US2's Skill
|
|
376
|
+
// Invocation Gate was satisfied by a check whose pattern was
|
|
377
|
+
// `uv run python -m memory`, scanning skills. TS5's inventory then found
|
|
378
|
+
// TWELVE runtime hook files invoking `python3 -m memory` -- and reaching
|
|
379
|
+
// into `memory.hooks.*` and `memory.cli.*` internals that were never
|
|
380
|
+
// commands at all. The narrow pattern was true and the conclusion it
|
|
381
|
+
// supported was false. So the patterns below cover the interpreter by any
|
|
382
|
+
// name, the module by any import shape, and `uv` itself.
|
|
383
|
+
absentPaths: [],
|
|
384
|
+
forbiddenPatterns: INTERPRETER_INVOCATIONS,
|
|
385
|
+
// Until US3 plateau 5 this table also exempted eleven files of the Windows
|
|
386
|
+
// product -- `installer/`, `frame/`, `docs/installer/`, and the installer's
|
|
387
|
+
// CI smoke -- "until US3 re-homes them": the interpreter spawns that kept
|
|
388
|
+
// TS5 from claiming zero Python for the shipped artifact. US3 retired the
|
|
389
|
+
// product instead (decision D4; the `frame-installer` row below), and the
|
|
390
|
+
// exemptions expired with the files.
|
|
391
|
+
exemptions: {
|
|
392
|
+
// Checks whose job is to name what they forbid. The table's own file is
|
|
393
|
+
// history for the same reason (HISTORY_PREFIXES).
|
|
394
|
+
"ts/scripts/checkSkillCommandParity.ts":
|
|
395
|
+
"a guard: its pattern IS the retired invocation it forbids in the skills, as this table's own patterns are here",
|
|
396
|
+
"ts/test/scripts/packContents.test.ts":
|
|
397
|
+
"the test of the pack guard's content rule (US3 plateau 5): it seeds the retired invocation into a synthetic shipped file to prove the artifact half of the Zero Python gate fires",
|
|
398
|
+
"scripts/smoke_runtime_update.sh":
|
|
399
|
+
"a negative check: the smoke FAILS if the updater's output still tells a user to run the interpreter",
|
|
400
|
+
// A Done user story is a record of what was run, when. Rewriting its
|
|
401
|
+
// commands would make its evidence describe a run that never happened.
|
|
402
|
+
"docs/product/extensions/user-stories/US-00-infra-de-command-skill.md":
|
|
403
|
+
"a Done user story (2026-05-11): its commands and evidence are the record of what was run on the Python core, under a banner naming today's contract",
|
|
404
|
+
// Frozen fixtures. Their bytes are the record; see ts/test/goldens/README.md.
|
|
405
|
+
"ts/test/goldens/README.md":
|
|
406
|
+
"the frozen goldens' changelog: its D12 row names the retired invocation that substitution replaced",
|
|
407
|
+
"ts/test/goldens/builder-command.golden.json":
|
|
408
|
+
"recorded fixture INPUT, not product output: a scenario passes `validate-item --check` a caller's own check command, and the golden records the argv and the validation artifact that echoes it",
|
|
409
|
+
"ts/test/goldens/builder-lifecycle.golden.json":
|
|
410
|
+
"the same caller-supplied check command, recorded as `automated_checks` input across the lifecycle scenarios",
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
surfaceId: "frame-installer",
|
|
415
|
+
story: "CV22.DS10.US3",
|
|
416
|
+
// The Windows Frame (an Electron shell over Pi) and the Inno Setup
|
|
417
|
+
// installer, retired at US3 plateau 5 by decision D4 rather than re-homed
|
|
418
|
+
// onto the npm package. Their premise was a `uv`-bearing git clone: the
|
|
419
|
+
// installer cloned the repository and ran `uv sync`, the Frame spawned the
|
|
420
|
+
// interpreter for eight commands, and both found their root by the
|
|
421
|
+
// `pyproject.toml` TS5 deleted. Three downloads of the artifact ever, none
|
|
422
|
+
// since August, no known user. They still work at the last Python-bearing
|
|
423
|
+
// release, `cv22-last-python-bearing`, which is what the cutoff says.
|
|
424
|
+
//
|
|
425
|
+
// The row is what lets the DS10 Zero Python gate close for the shipped
|
|
426
|
+
// artifact: with these gone, no tracked file spawns the interpreter from
|
|
427
|
+
// JavaScript or PowerShell, where neither the skill guard nor the
|
|
428
|
+
// `python-core-mentions` patterns could see it (the Frame built each argv
|
|
429
|
+
// as an array).
|
|
430
|
+
absentPaths: [
|
|
431
|
+
"frame/",
|
|
432
|
+
"installer/",
|
|
433
|
+
"docs/installer/",
|
|
434
|
+
"spikes/windows-frame-mockup/",
|
|
435
|
+
".github/workflows/windows-installer.yml",
|
|
436
|
+
"scripts/ci-nonascii-profile-smoke.ps1",
|
|
437
|
+
],
|
|
438
|
+
// The product was PowerShell and Inno Setup, and nothing else in the tree
|
|
439
|
+
// is. A Windows story that adds either amends this row on purpose.
|
|
440
|
+
absentSuffixes: [".ps1", ".psm1", ".iss", ".cmd"],
|
|
441
|
+
// File names, never vocabulary: "Windows" and "installer" are living words
|
|
442
|
+
// (the npm install, the per-runtime wiring); these are the scripts a
|
|
443
|
+
// document could still tell someone to run.
|
|
444
|
+
forbiddenPatterns: [
|
|
445
|
+
"windows-installer\\.yml",
|
|
446
|
+
"bootstrap\\.ps1",
|
|
447
|
+
"configure\\.ps1",
|
|
448
|
+
"health-check\\.ps1",
|
|
449
|
+
"MirrorInstall\\.psm1",
|
|
450
|
+
"mirror\\.iss",
|
|
451
|
+
"MirrorMind-Setup",
|
|
452
|
+
"launcher/mirror\\.cmd",
|
|
453
|
+
"command-registry\\.js",
|
|
454
|
+
"root-resolve\\.js",
|
|
455
|
+
"smoke-electron",
|
|
456
|
+
"ci-nonascii-profile-smoke",
|
|
457
|
+
],
|
|
458
|
+
// ES-004 Experiment 1's static mockup (`spikes/windows-frame-mockup/`)
|
|
459
|
+
// went with the Frame it was drawn for, at the Navigator's direction; the
|
|
460
|
+
// exploration's record is `docs/project/exploration/es-004-*.md`.
|
|
461
|
+
exemptions: {},
|
|
462
|
+
},
|
|
463
|
+
];
|
|
464
|
+
|
|
465
|
+
export interface SurfaceProblem {
|
|
466
|
+
readonly surfaceId: string;
|
|
467
|
+
readonly message: string;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export function isHistory(path: string): boolean {
|
|
471
|
+
return HISTORY_PREFIXES.some((prefix) => path.startsWith(prefix));
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** Tracked paths only -- `git ls-files`, in repository order. */
|
|
475
|
+
export function trackedFiles(repoRoot: string): string[] {
|
|
476
|
+
const stdout = execFileSync("git", ["ls-files"], {
|
|
477
|
+
cwd: repoRoot,
|
|
478
|
+
encoding: "utf8",
|
|
479
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
480
|
+
});
|
|
481
|
+
return stdout.split("\n").filter((line) => line.length > 0);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Tracked paths only.
|
|
486
|
+
*
|
|
487
|
+
* Git is the authority on what the repository contains. A leftover
|
|
488
|
+
* `__pycache__` beside a deleted module is a stale build artifact on one
|
|
489
|
+
* machine, not a surface that came back -- failing on it would teach the reader
|
|
490
|
+
* to distrust this check.
|
|
491
|
+
*/
|
|
492
|
+
export function checkAbsent(surface: RetiredSurface, files: readonly string[]): SurfaceProblem[] {
|
|
493
|
+
const retired = (path: string): boolean =>
|
|
494
|
+
surface.absentPaths.some((relPath) =>
|
|
495
|
+
relPath.endsWith("/") ? path.startsWith(relPath) : path === relPath,
|
|
496
|
+
) || (surface.absentSuffixes ?? []).some((suffix) => path.endsWith(suffix));
|
|
497
|
+
// One problem per file, however many of the row's rules it breaks: a
|
|
498
|
+
// re-added `src/memory/__init__.py` is one regression, not two.
|
|
499
|
+
return files.filter(retired).map((path) => ({
|
|
500
|
+
surfaceId: surface.surfaceId,
|
|
501
|
+
message: ` ${surface.surfaceId}: ${path} is tracked but was retired by ${surface.story}`,
|
|
502
|
+
}));
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export function checkResidue(
|
|
506
|
+
surface: RetiredSurface,
|
|
507
|
+
files: readonly string[],
|
|
508
|
+
repoRoot: string,
|
|
509
|
+
): SurfaceProblem[] {
|
|
510
|
+
const problems: SurfaceProblem[] = [];
|
|
511
|
+
const patterns = surface.forbiddenPatterns.map((pattern) => new RegExp(pattern));
|
|
512
|
+
for (const path of files) {
|
|
513
|
+
if (isHistory(path) || path in surface.exemptions) continue;
|
|
514
|
+
if (surface.residueScope && !surface.residueScope.some((prefix) => path.startsWith(prefix))) {
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
let content: string;
|
|
518
|
+
try {
|
|
519
|
+
content = readFileSync(join(repoRoot, path), "utf8");
|
|
520
|
+
} catch {
|
|
521
|
+
continue; // binaries and unreadable files carry no residue worth reading
|
|
522
|
+
}
|
|
523
|
+
// A NUL byte means a binary git happens to have tracked as readable text.
|
|
524
|
+
if (content.includes("\0")) continue;
|
|
525
|
+
for (const pattern of patterns) {
|
|
526
|
+
const match = pattern.exec(content);
|
|
527
|
+
if (match) {
|
|
528
|
+
const line = (content.slice(0, match.index).match(/\n/g) ?? []).length + 1;
|
|
529
|
+
problems.push({
|
|
530
|
+
surfaceId: surface.surfaceId,
|
|
531
|
+
message: ` ${surface.surfaceId}: ${path}:${line} mentions \`${match[0]}\`, retired by ${surface.story}`,
|
|
532
|
+
});
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return problems;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
export interface SweepOptions {
|
|
541
|
+
/** Grade staged rows too, without enforcing them. Used by the self-test. */
|
|
542
|
+
readonly includeStaged?: boolean;
|
|
543
|
+
/** Restrict the sweep to one surface id. Used by the self-test. */
|
|
544
|
+
readonly only?: string;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
export function sweep(
|
|
548
|
+
repoRoot: string,
|
|
549
|
+
surfaces: readonly RetiredSurface[] = RETIRED,
|
|
550
|
+
options: SweepOptions = {},
|
|
551
|
+
): SurfaceProblem[] {
|
|
552
|
+
const files = trackedFiles(repoRoot);
|
|
553
|
+
const problems: SurfaceProblem[] = [];
|
|
554
|
+
for (const surface of surfaces) {
|
|
555
|
+
if (options.only && surface.surfaceId !== options.only) continue;
|
|
556
|
+
if (surface.stagedUntil && !options.includeStaged && !options.only) continue;
|
|
557
|
+
problems.push(...checkAbsent(surface, files));
|
|
558
|
+
problems.push(...checkResidue(surface, files, repoRoot));
|
|
559
|
+
}
|
|
560
|
+
return problems;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
export const ENFORCED: readonly RetiredSurface[] = RETIRED.filter((s) => !s.stagedUntil);
|
|
564
|
+
export const STAGED: readonly RetiredSurface[] = RETIRED.filter((s) => s.stagedUntil);
|