fix(spec): reconcile the api and platform skill indexes with what their bodies teach - #15424
Conversation
…ir bodies teach `SKILL_MAP['objectstack-api']` advertised `api/rest-server.zod.ts`, which the skill's authored markdown never teaches: nothing there names the file, `RestServerConfig` or any of its sub-configs, or the words "rest server", while every other core entry is reachable from the body by at least one exported name. An index entry is a POINTER, so that row sent an agent into `node_modules` for a lesson that does not exist. The schema keeps existing and stays importable. The other direction, same rule: `SKILL_MAP['objectstack-platform']` had no pointer to `stack.zod.ts`, the file declaring the body's main subject — it teaches `defineStack()` and names `ObjectStackDefinitionSchema`, `ObjectStackDefinition`, `ObjectStackDefinitionInput` and `ObjectStack` in its own prose. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
…ill-map-api-platform-pointers
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…ill-map-api-platform-pointers
… teaches `objectstack-platform` declared no `TRANSITIVE_ALLOWLIST`, so its index published the whole import closure of its core entries — 73 transitive pointers once `stack.zod.ts` joined the map. Most of them are shapes the SKILL.md never teaches, and two are shapes the platform retired from its surface, so the catalogue routed an authoring agent at lessons the body cannot give. Declare the list, populated by one mechanical rule and nothing else: a closure member stays only if `skills/objectstack-platform/SKILL.md` names one of that module's exported names, as an exact word-bounded identifier. Five of the 73 survive. The retired shapes fall out by the rule, not by hand. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT (patch round, ruling D) — governed in-seat review of PR #15424, head Implemented-by: Verified in a detached compare worktree at the PR head against merge-base One standing consequence, recorded not reopened: four of the five kept rows are kept by a name the platform Landing regime: governed ( Generated by Claude Code |
Fixes #15361
Fixes #15264
Executes maintainer decision batch #36 (1 A · 2 A) and, on the patch round,
maintainer decision batch #39 (ruling D). One rule throughout — the index
advertises what the SKILL.md teaches — applied in three directions: drop a
pointer the body never teaches, add a pointer the body teaches, and constrain
the transitive closure to the members the body names.
What changed
objectstack-apiapi/rest-server.zod.tsRestServerConfig, not one of its sub-configs, not the words "rest server" — while every other core entry is reachable from the body by at least one exported name. An index entry is a POINTER; pointing at a schema the body cannot help with sends an agent intonode_modulesfor a lesson that does not exist. The schema keeps existing and stays importable.objectstack-platformstack.zod.ts(root-level inpackages/spec/src)defineStack(), and it namesObjectStackDefinitionSchema,ObjectStackDefinition,ObjectStackDefinitionInputandObjectStackin its own prose, while the catalogue had no pointer to the file declaring them.objectstack-platformTRANSITIVE_ALLOWLIST(5 of 73 closure members)objectstack-platformdeclared no allowlist, so it published its whole import closure; the added core pointer took that closure to 73 transitive rows, most of them shapes the body never teaches. The allowlist is populated by one mechanical rule and nothing else — see the census below.The map spells the added entry
'stack.zod.ts'with no directory segment: the generator resolves every core entry withpath.resolve(SPEC_SRC, rel)againstpackages/spec/src, so a root-level file is spelled bare, askernel/...ones carry their directory.The item-2 fork — resolved by ruling D
The fork this PR raised for the approvers (one core pointer publishing 46 further
transitive ones) was ruled in decision batch #39: declare
TRANSITIVE_ALLOWLIST['objectstack-platform'], populated by a mechanical censusand nothing else, then regenerate. That is what this round does.
The rule, and nothing else. A member of
objectstack-platform's importclosure stays only if
skills/objectstack-platform/SKILL.mdnames at leastone of that module's exported names, as an exact word-bounded identifier
(backticked or bare). No judgement rows, no hand-picked keeps or drops.
Where the entry lives. The ruling names
packages/spec/scripts/build-skill-references.ts.TRANSITIVE_ALLOWLISTis notdeclared there — it is declared in
packages/spec/scripts/lib/skill-map-guards.tsand imported by the generator, next to
checkTransitiveAllowlist, the guard thatconstrains it. The entry was therefore added at that declaration; the ruling's
substance is unchanged and no second surface was created. This is the one
mechanism assumption in the ruling that did not hold, and it is reported rather
than worked around.
How the census was taken, reproducibly.
skills/objectstack-platform/references/_index.mdat the pre-allowlist head,not re-derived by hand: 10 core entries + 73 transitive members.
export const|let|var,export function|class|type|interface|enum|namespace, and the names inexport { … }/export type { … }clauses, alias targets included. 1,244exported names were read across the 73 modules. No module in the closure uses
export *, so nothing is reachable that this extraction cannot see.The extraction was cross-checked against the repo's own TypeScript-derived
packages/spec/export-origins/*.json(which records the declaring file of everyname each public entry point exports): for all 73 modules, every name that
artifact attributes to the module is in the extracted set — 0 missing.
skills/objectstack-platform/SKILL.mdonly —never over
references/**, which this generator writes.Result: 5 of 73 kept. Both shapes the fork named fall out by the rule, not by
hand:
automation/state-machine.zod.ts(retired by ADR-0020 as a record-lifecycledeclaration) and
data/date-macros.zod.ts(moved to one owning package) are gonefrom the index, and neither was touched by hand.
The census
Every closure member, its exported names, the name the SKILL.md carries, and the
verdict. The census read all 1,244 names; the middle column shows the first
six per module so the table stays readable — the cap is a display cap, not a
census cap.
ai/agent.zod.tsAIModelConfigSchema,Agent,AgentParsed,AgentSchema,StructuredOutputConfig,StructuredOutputConfigParsed… +6 more (12 total)ai/skill.zod.tsSKILL_TRIGGER_LIST_VALUE_OPERATORS,SKILL_TRIGGER_SCALAR_VALUE_OPERATORS,Skill,SkillParsed,SkillSchema,SkillTriggerCondition… +2 more (8 total)ai/tool.zod.tsTool,ToolSchema,defineTool(3 total)api/endpoint.zod.tsApiEndpoint,ApiEndpointParsed,ApiEndpointSchema,ApiMapping,ApiMappingSchema,normalizeEndpointPath(6 total)api/errors.zod.tsEnhancedApiError,EnhancedApiErrorParsed,EnhancedApiErrorSchema,ErrorCategory,ErrorHttpStatusMap,ErrorResponse… +9 more (15 total)automation/control-flow.zod.tsFlowGraph,FlowRegion,FlowRegionParsed,FlowRegionSchema,LOOP_MAX_ITERATIONS_CEILING,LOOP_NODE_TYPE… +26 more (32 total)automation/flow-function.zod.tsDEFAULT_FLOW_FUNCTION_EFFECT,FlowFunctionCallable,FlowFunctionDeclaration,FlowFunctionDeclarationParsed,FlowFunctionDeclarationSchema,FlowFunctionEffect… +7 more (13 total)automation/flow.zod.tsFLOW_BUILTIN_NODE_TYPES,FLOW_STRUCTURAL_NODE_TYPES,Flow,FlowEdge,FlowEdgeParsed,FlowEdgeSchema… +11 more (17 total)automation/state-machine.zod.tsActionRef,ActionRefSchema,GuardRef,GuardRefSchema,StateMachineConfig,StateMachineSchema… +5 more (11 total)automation/webhook.zod.tsWebhook,WebhookParsed,WebhookSchema,WebhookTriggerType,defineWebhook(5 total)data/analytics.zod.tsAggregationMetricType,AnalyticsQuery,AnalyticsQuerySchema,Cube,CubeJoin,CubeJoinParsed… +10 more (16 total)data/date-macros.zod.tsDATE_MACRO_ALIAS_TOKENS,DATE_MACRO_DESCRIPTIONS,DATE_MACRO_INSTANT_TOKENS,DATE_MACRO_PARAM_RE,DATE_MACRO_PERIOD_TOKENS,DATE_MACRO_TOKENS… +11 more (17 total)data/driver-sql.zod.tsDataTypeMapping,DataTypeMappingSchema,SQLDialect,SQLDialectSchema,SQLDriverConfig,SQLDriverConfigParsed… +6 more (12 total)data/driver.zod.tsDriverCapabilities,DriverCapabilitiesSchema,DriverConfig,DriverConfigParsed,DriverConfigSchema,DriverInterface… +7 more (13 total)data/driver/common.zod.tsCANONICAL_CREDENTIAL_KEYS,CREDENTIAL_KEY_SPELLINGS,CREDENTIAL_URL_QUERY_PARAMS,CREDENTIAL_URL_QUERY_PARAM_NAMES,DriverSslToggle,DriverSslToggleSchema… +24 more (30 total)data/driver/config-registry.zod.tsBUILTIN_DRIVER_IDS,BuiltinDriverId,DATABASE_DRIVER_SELECTION_ALIASES,DATABASE_DRIVER_SELECTION_IDS,DRIVER_CONFIG_SCHEMAS,DRIVER_ID_ALIASES… +8 more (14 total)data/driver/memory.zod.tsAutoPersistenceConfig,AutoPersistenceConfigSchema,CustomPersistenceConfig,CustomPersistenceConfigSchema,FilePersistenceConfig,FilePersistenceConfigParsed… +15 more (21 total)data/driver/mongo.zod.tsMongoConfig,MongoConfigParsed,MongoConfigSchema,MongoDriverSpec,getMongoConfigJsonSchema(5 total)data/driver/mysql.zod.tsMysqlConfig,MysqlConfigParsed,MysqlConfigSchema,getMysqlConfigJsonSchema(4 total)data/driver/postgres.zod.tsPostgresConfig,PostgresConfigParsed,PostgresConfigSchema,getPostgresConfigJsonSchema(4 total)data/driver/sqlite.zod.tsSqliteConfig,SqliteConfigParsed,SqliteConfigSchema,SqliteWasmConfig,SqliteWasmConfigParsed,SqliteWasmConfigSchema… +4 more (10 total)data/driver/turso.zod.tsTursoConfig,TursoConfigParsed,TursoConfigSchema,TursoDriverSpec,TursoTransportMode,TursoTransportModeSchema… +1 more (7 total)data/field-value.zod.tsAddressSchema,AddressValue,AddressValueSchema,BOOLEAN_VALUE_TYPES,CALENDAR_DATE_TYPES,CLOCK_TIME_TYPES… +33 more (39 total)data/field.zod.tsAddress,AddressSchema,BOUNDED_STRING_FIELD_TYPES,CurrencyConfig,CurrencyConfigParsed,CurrencyConfigSchema… +28 more (34 total)Field,FieldSchemadata/filter.zod.tsALL_OPERATORS,ComparisonOperatorSchema,EqualityOperatorSchema,FILTER_ARRAY_LOGIC_KEYWORDS,FILTER_OPERATORS,FieldOperators… +39 more (45 total)data/hook-body.zod.tsExpressionBody,ExpressionBodySchema,HookBody,HookBodyCapability,HookBodyParsed,HookBodySchema… +3 more (9 total)data/hook.zod.tsHook,HookContext,HookContextSchema,HookDispatch,HookEvent,HookEventType… +4 more (10 total)Hookdata/mapping.zod.tsImportFieldMapping,ImportFieldMappingParsed,ImportFieldMappingSchema,Mapping,MappingParsed,MappingSchema… +2 more (8 total)data/object.zod.tsAPI_OPERATION_ORDER,ApiMethod,ApiOperation,ApiOperationSchema,CrudAffordances,IndexSchema… +43 more (49 total)Lifecycle,ObjectSchemadata/query.zod.tsAggregationFunction,AggregationNode,AggregationNodeSchema,DateGranularity,DateGranularityValue,FieldNode… +14 more (20 total)data/validation.zod.tsBaseValidationRuleShape,ConditionalValidation,ConditionalValidationParsed,ConditionalValidationSchema,CrossFieldValidation,CrossFieldValidationParsed… +15 more (21 total)identity/position.zod.tsAUDIENCE_ANCHOR_POSITIONS,EVERYONE_POSITION,GUEST_POSITION,Position,PositionParsed,PositionSchema… +1 more (7 total)integration/connector.zod.tsCircuitBreakerConfig,CircuitBreakerConfigParsed,CircuitBreakerConfigSchema,Connector,ConnectorAction,ConnectorActionEffect… +52 more (58 total)kernel/cluster.zod.tsClusterCapabilityConfig,ClusterCapabilityConfigParsed,ClusterCapabilityConfigSchema,ClusterDriver,ClusterDriverSchema,ClusterTenantIsolation… +15 more (21 total)kernel/metadata-loader.zod.tsMetadataFallbackStrategy,MetadataFallbackStrategySchema,MetadataManagerConfig,MetadataManagerConfigParsed,MetadataManagerConfigSchema(5 total)kernel/metadata-protection.zod.tsMetadataLock,MetadataLockSchema,MetadataLockSource,MetadataLockSourceSchema,MetadataProtectionFields,MetadataProvenance… +5 more (11 total)security/permission.zod.tsAdminScope,AdminScopeParsed,AdminScopeSchema,EffectiveObjectPermission,EffectiveObjectPermissionSchema,FieldPermission… +11 more (17 total)security/rls.zod.tsRLS,RLSEvaluationResult,RLSEvaluationResultSchema,RLSOperation,RLSUserContext,RLSUserContextSchema… +3 more (9 total)RLSsecurity/sharing.zod.tsCriteriaSharingRule,CriteriaSharingRuleParsed,CriteriaSharingRuleSchema,OWDModel,ShareRecipientType,SharingLevel… +5 more (11 total)shared/connector-auth.zod.tsConnectorAPIKeySchema,ConnectorAuthConfig,ConnectorAuthConfigParsed,ConnectorAuthConfigSchema,ConnectorBasicAuthSchema,ConnectorBearerAuthSchema… +13 more (19 total)shared/enums.zod.tsIsolationLevel,IsolationLevelEnum,MutationEvent,MutationEventEnum,SortDirection,SortDirectionEnum… +2 more (8 total)shared/error-map.zod.tsObjectStackRawIssue,formatZodError,formatZodIssue,objectStackErrorMap,safeParsePretty(5 total)shared/expression.zod.tsCronExpressionInput,CronExpressionInputSchema,Expression,ExpressionDialect,ExpressionInput,ExpressionInputSchema… +15 more (21 total)shared/http.zod.tsCorsConfig,CorsConfigParsed,CorsConfigSchema,HttpMethod,HttpMethodSubset,HttpMethodSubsetSchema… +8 more (14 total)shared/identifiers.zod.tsMETADATA_ITEM_NAME_PATTERN,MetadataItemName,MetadataItemNameSchema,QUALIFIED_ITEM_NAME_PATTERN,SnakeCaseIdentifier,SnakeCaseIdentifierSchema… +2 more (8 total)shared/mapping.zod.tsFieldMapping,FieldMappingSchema(2 total)shared/metadata-collection.zod.tsMAP_SUPPORTED_FIELDS,METADATA_ALIASES,MapSupportedField,MetadataCollectionInput,NormalizeStackInputOptions,PLURAL_TO_SINGULAR… +6 more (12 total)shared/metadata-types.zod.tsBaseMetadataRecord,BaseMetadataRecordSchema,MetadataFormat,MetadataFormatSchema(4 total)shared/protection.zod.tsApplyProtectionContext,Protection,ProtectionSchema,applyProtection(4 total)shared/retry-policy.zod.tsRetryPolicy,RetryPolicyParsed,RetryPolicySchema,retryPolicyShape(4 total)shared/suggestions.zod.tsKeySetGuidance,StrictUnknownKeyErrorOptions,findClosestMatches,formatSuggestion,keySetMatches,levenshteinDistance… +2 more (8 total)shared/value-domain.zod.tsISO_3166_ALPHA2_CODES,ValueDomain,ValueDomainSchema,isValueDomainMember(4 total)system/book.zod.tsAudienceBook,AudienceCaller,Book,BookAudience,BookAudienceSchema,BookGroup… +21 more (27 total)system/deploy-bundle.zod.tsDeployBundle,DeployBundleParsed,DeployBundleSchema,DeployDiff,DeployDiffParsed,DeployDiffSchema… +18 more (24 total)system/doc.zod.tsDoc,DocSchema,DocTranslation,resolveDocLocale(4 total)system/email-template.zod.tsEmailTemplateDefinition,EmailTemplateDefinitionCategory,EmailTemplateDefinitionCategorySchema,EmailTemplateDefinitionParsed,EmailTemplateDefinitionSchema,EmailTemplateDefinitionVariable… +3 more (9 total)system/job.zod.tsCronSchedule,CronScheduleParsed,CronScheduleSchema,IntervalSchedule,IntervalScheduleSchema,Job… +14 more (20 total)system/stack-server.zod.tsServerRateLimitConfig,ServerRateLimitConfigParsed,ServerRateLimitConfigSchema,StackServerConfig,StackServerConfigParsed,StackServerConfigSchema… +3 more (9 total)system/tenant.zod.tsDatabaseLevelIsolationStrategy,DatabaseLevelIsolationStrategyParsed,DatabaseLevelIsolationStrategySchema,DatabaseProvider,DatabaseProviderSchema,QuotaEnforcementResult… +23 more (29 total)system/translation.zod.tsActionResultDialogTranslation,ActionResultDialogTranslationSchema,CoverageBreakdownEntry,CoverageBreakdownEntrySchema,FieldTranslation,FieldTranslationSchema… +22 more (28 total)ui/action-params.zod.tsACTION_PARAM_BUILTIN_KEYS,ActionEngineFacade,ActionHandler,ActionHandlerContext,ActionParamIssue,ActionSession… +4 more (10 total)ui/action.zod.tsACTION_LOCATIONS,Action,ActionAi,ActionAiParsed,ActionAiSchema,ActionLocation… +12 more (18 total)ui/app.zod.tsActionNavItem,ActionNavItemParsed,ActionNavItemSchema,App,AppBranding,AppBrandingSchema… +35 more (41 total)Appui/bulk-action.zod.tsBulkActionDef,BulkActionDefParsed,BulkActionDefSchema,BulkActionExecution,BulkActionExecutionSchema,BulkActionOperation… +3 more (9 total)ui/chart.zod.tsChartAggregate,ChartAggregateFunction,ChartAggregateFunctionSchema,ChartAggregateSchema,ChartAnnotation,ChartAnnotationParsed… +19 more (25 total)ui/dashboard.zod.tsDATE_RANGE_DEFAULT_RANGES,DATE_RANGE_PRESETS,Dashboard,DashboardHeader,DashboardHeaderAction,DashboardHeaderActionSchema… +20 more (26 total)ui/dataset.zod.tsDataset,DatasetDimension,DatasetDimensionSchema,DatasetMeasure,DatasetMeasureSchema,DatasetSchema… +3 more (9 total)ui/i18n.zod.tsAriaProps,AriaPropsSchema,I18nLabel,I18nLabelSchema,InlineLocaleMap,InlineLocaleMapSchema(6 total)ui/page.zod.tsElementDataSource,ElementDataSourceSchema,InterfacePageConfig,InterfacePageConfigParsed,InterfacePageConfigSchema,PAGE_TYPE_ROADMAP… +17 more (23 total)ui/report.zod.tsJoinedReportBlock,JoinedReportBlockSchema,Report,ReportChart,ReportChartParsed,ReportChartSchema… +8 more (14 total)ui/responsive.zod.tsResponsiveStyles,ResponsiveStylesSchema,StyleMap,StyleMapSchema(4 total)ui/sharing.zod.tsSharingConfig,SharingConfigParsed,SharingConfigSchema(3 total)ui/view.zod.tsAddRecordConfig,AddRecordConfigParsed,AddRecordConfigSchema,AppearanceConfig,AppearanceConfigParsed,AppearanceConfigSchema… +138 more (144 total)What the constraint costs and saves — measured
skills/objectstack-platform/references/_index.md, by the skills token ratchet'sown counting convention (
ceil(utf8 bytes / 4)):origin/main(before this PR)So the patch round is −68 lines / −2,173 tokens against the head the fork
reported, and the index now sits −21 lines / −631 tokens below
origin/main—the ruled
stack.zod.tspointer ships, and the catalogue gets smaller than it wasbefore the PR.
skills/objectstack-api/references/_index.mdis untouched by thisround (919 tokens, the batch-#36 value). Whole shipped bundle total: 150,816
tokens.
The ratchet does not object, and says why in its own words —
_index.mdisgenerator-owned, so it is measured, not ratcheted:
Exactly the ruled files, and nothing else
Regenerating on the merged tree rewrote one
_index.md— the platform one.The stop condition in the ruling (any other index moving) did not trigger. The
regeneration that preceded the allowlist, run on the merged tree with the ruled
1A/2A content already in place, produced no change at all, so the index diff
below is exactly the allowlist's effect.
Premise re-takes, on this branch's
origin/mainbaseBoth premises carried into batch #36 were re-measured before the edit, and both hold.
1 —
objectstack-apidoes not teach the pointer.grep -rn "rest-server\|RestServerConfig\|RestApiConfig\|rest server" skills/objectstack-api/returns exactly one line, and it is the generated index row this PR removes:Over the skill's authored markdown alone (the same grep with
--exclude=_index.md, and the skill directory holds onlySKILL.mdand that index) the count is 0. The wider name sweep —CrudEndpointsConfig,MetadataEndpointsConfig,BatchEndpointsConfig,RouteGenerationConfig— is also 0. The premise holds; the earlier reading's "0 hits" was over authored content, and the one hit here is the artifact being corrected.2 —
objectstack-platformteaches the schema, and nothing advertised it.grep -c "ObjectStackDefinition\|defineStack" skills/objectstack-platform/SKILL.mdreturns 27.grep -rn "stack.zod" skills/*/references/_index.md packages/spec/scripts/build-skill-references.tsreturned no match (exit 1) — the file was in no package's core list and in no index's closure. Both hold.stack.zod.tscarries no module doc block, so the generator takes its designed fallback and emits the export list rather than refusing: the row readsExports: DatasourceMappingRuleSchema, ArtifactPackageEntrySchema, AssembledPackageBodySchema, ArtifactPackageSchema, ObjectStackDefinitionSchema. No module header was written into the schema source — that is spec-lane content, out of scope here.Verification
All of it on the final head
3e9e1eae0, working tree clean. Every exit code wascaptured by redirect before any pipe, and each gate is quoted from the verdict
line it prints itself.
The gates the ruling names.
checkTransitiveAllowlist— its verdict, and a probe that it is really theguard speaking. The guard has no success line to quote: it contributes to the
generator's
problemslist, and a non-empty list refuses the run in bothmodes. A clean
gen:skill-refs/check:skill-refsis therefore its verdict, andon its own that is an argument from silence. So the guard was ablated against the
row this PR adds, with the implementation committed first:
never reaches. Confirmed on disk before running anything (injected-marker count
1, not the editor's exit code). Generator exit 1:objectstack-platform → shared/does-not-reach-this.zod.ts is in TRANSITIVE_ALLOWLIST but nothing in the package's core closure imports it — this row keeps a pointer that does not exist.git checkout HEAD --on the absolute path, then proved: restoredblob hash
77a5524028a5d7242253c6052b643af076421ea0equals the HEAD blob,git diff HEADempty, marker count back to0. The script carried atrap … EXIT INT TERMon an absolute path throughout.✅ 9 generated files in sync.No rebuild is involved on either leg: the generator and its guards run from
source through
tsx, so there is nodist/for a stale artifact to hide in.The generator's own test suite — owed because this diff edits tooling
scripts, over and above any derived family. Run through
scripts/pm/os-verify-lock.sh:(
skill-map-guards.test.ts,file-description.test.ts,protocol-map.test.ts,query-pointer-row.test.ts— every test file in the repo naming either script.)The derived family.
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsreads the merge base itself rather than a hand-built diff: 4 paths vs merge
base
a55efc6c1, 56 commands. All 56 ran.pnpm check:dual-build-cjs-loadsexit 3 — it reads builtoutput for the whole workspace and no package is built in this worktree. It says
so itself:
Run pnpm build first. ⛔ This is NOT a pass: nothing was measured.Recorded as not measured, not as a pass. This diff ships no package source.
Named verdicts from that run:
pnpm lint— the whole repo, not a narrowed scan, through the same lockwrapper:
eslint . --no-inline-config, exit 0, no findings printed.node scripts/pm/check-governed-merges.mjs --teston the four paths returnsGOVERNED, exit 3, and still reports that the generated-surface exception does
not lift either index, because this PR co-edits the generator that exception
would trust:
No changeset: this ships no package source. The generator and its guard library are
build scripts and the two indexes are skill markdown, so
skip-changesetis thecorrect label, and it is on the PR.
This PR stays a draft: governed surface, human merge, two approvers.
Generated by Claude Code