feat: 기능 추가 과정중

This commit is contained in:
donghyeon-ka
2026-07-30 15:58:20 +09:00
parent d3ef801fe6
commit 6c52cdb916
648 changed files with 126325 additions and 6680 deletions
@@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"snapshotDigest": "e8448e46bc65326e9b2eb23cdce0870242faedb7a354942389c4a95b0e392d90",
"snapshotDigest": "67f1ad2bf35d04470a7fba1a5ae8f98608b5d70b70887e383692b1e2d6127752",
"owner": "frontend-platform",
"reason": "RP-10 initial approved executable registry baseline",
"approvedAt": "2026-07-26T07:53:45.969Z"
"reason": "Typed Web Storage codecs and query invalidation topic protocol",
"approvedAt": "2026-07-27T16:41:15.888Z"
}
+43 -17
View File
@@ -4,7 +4,7 @@
{
"registryId": "FE-REG-ROUTE",
"owner": "feature-frontend-routing-release-recovery-runtime",
"source": "src/features/installed-feature-contracts.js",
"source": "src/features/installed-feature-contracts.ts",
"rowCount": 9,
"contract": {
"requiredFields": [
@@ -218,7 +218,7 @@
{
"registryId": "FE-REG-ROUTE-RUNTIME",
"owner": "feature-frontend-routing-release-recovery-runtime",
"source": "src/features/installed-feature-contracts.js",
"source": "src/features/installed-feature-contracts.ts",
"rowCount": 9,
"contract": {
"requiredFields": [
@@ -323,7 +323,7 @@
{
"registryId": "FE-REG-API",
"owner": "feature-frontend-api-client-response-envelope-contract",
"source": "src/features/installed-feature-contracts.js",
"source": "src/features/installed-feature-contracts.ts",
"rowCount": 3,
"contract": {
"requiredFields": [
@@ -451,7 +451,7 @@
{
"registryId": "FE-REG-SCHEMA",
"owner": "feature-frontend-contract-schema-registry",
"source": "src/features/installed-feature-contracts.js",
"source": "src/features/installed-feature-contracts.ts",
"rowCount": 8,
"contract": {
"requiredFields": [
@@ -543,7 +543,7 @@
{
"registryId": "FE-REG-ENV",
"owner": "feature-frontend-env-runtime-config-contract",
"source": "src/contracts/env.js",
"source": "src/contracts/env.ts",
"rowCount": 14,
"contract": {
"requiredFields": [
@@ -669,7 +669,7 @@
{
"registryId": "FE-REG-STORAGE",
"owner": "feature-frontend-storage-registry-contract",
"source": "src/contracts/storage-keys.js",
"source": "src/contracts/storage-keys.ts",
"rowCount": 4,
"contract": {
"requiredFields": [
@@ -678,6 +678,7 @@
"backend",
"classification",
"schemaVersion",
"valueCodec",
"ttl",
"migration",
"quotaFallback"
@@ -688,8 +689,9 @@
"backend": "string",
"classification": "string",
"schemaVersion": "integer",
"valueCodec": "string",
"ttl": "integer|string|null",
"migration": "string|function",
"migration": "string",
"quotaFallback": "string"
},
"uniqueFields": [
@@ -701,7 +703,6 @@
"memory",
"sessionStorage",
"localStorage",
"indexedDB",
"disabled",
"forbidden"
],
@@ -710,6 +711,14 @@
"opaque-cache",
"sensitive-forbidden"
],
"valueCodec": [
"color-scheme-v1",
"opaque-string-v1",
"none"
],
"migration": [
"discard"
],
"quotaFallback": [
"memory",
"no-persist",
@@ -724,6 +733,7 @@
"backend",
"classification",
"schemaVersion",
"valueCodec",
"migration"
]
},
@@ -738,7 +748,8 @@
"quotaFallback": "feature-disable",
"schemaVersion": 1,
"scope": "auth",
"ttl": null
"ttl": null,
"valueCodec": "none"
},
"CHUNK_RELOAD_GUARD": {
"backend": "sessionStorage",
@@ -750,7 +761,8 @@
"quotaFallback": "no-persist",
"schemaVersion": 1,
"scope": "release",
"ttl": "session"
"ttl": "session",
"valueCodec": "opaque-string-v1"
},
"COLOR_SCHEME": {
"backend": "localStorage",
@@ -762,7 +774,8 @@
"quotaFallback": "memory",
"schemaVersion": 1,
"scope": "preference",
"ttl": null
"ttl": null,
"valueCodec": "color-scheme-v1"
},
"QUERY_PERSISTENCE": {
"backend": "disabled",
@@ -774,14 +787,15 @@
"quotaFallback": "feature-disable",
"schemaVersion": 1,
"scope": "cache",
"ttl": null
"ttl": null,
"valueCodec": "none"
}
}
},
{
"registryId": "FE-REG-ERROR",
"owner": "feature-frontend-error-classification-boundary-contract",
"source": "src/contracts/errors.js",
"source": "src/contracts/errors.ts",
"rowCount": 31,
"contract": {
"requiredFields": [
@@ -1393,7 +1407,7 @@
{
"registryId": "FE-REG-QUERY",
"owner": "feature-frontend-server-state-caching-contract",
"source": "src/features/installed-feature-contracts.js",
"source": "src/features/installed-feature-contracts.ts",
"rowCount": 1,
"contract": {
"requiredFields": [
@@ -1401,6 +1415,8 @@
"serialization",
"identity",
"invalidation",
"invalidationTopic",
"crossContext",
"version",
"persistence"
],
@@ -1409,13 +1425,19 @@
"serialization": "string",
"identity": "string",
"invalidation": "string",
"invalidationTopic": "string",
"crossContext": "string",
"version": "integer",
"persistence": "string"
},
"uniqueFields": [
"namespace"
"namespace",
"invalidationTopic"
],
"allowedValues": {
"crossContext": [
"invalidate-only"
],
"persistence": [
"disabled"
]
@@ -1426,14 +1448,18 @@
"namespace",
"serialization",
"identity",
"invalidationTopic",
"crossContext",
"version",
"persistence"
]
},
"rows": {
"REFERENCE_RESOURCE": {
"crossContext": "invalidate-only",
"identity": "no-pii-token-or-raw-url",
"invalidation": "reference resource namespace after successful mutation",
"invalidationTopic": "qinv.01k10f7m3w9p6r2c8v5n4x",
"namespace": [
"reference-resource",
1
@@ -1447,7 +1473,7 @@
{
"registryId": "FE-REG-TELEMETRY",
"owner": "feature-frontend-diagnostics-telemetry-runtime",
"source": "src/contracts/telemetry.js",
"source": "src/contracts/telemetry.ts",
"rowCount": 5,
"contract": {
"requiredFields": [
@@ -1629,7 +1655,7 @@
{
"registryId": "FE-REG-RELEASE",
"owner": "feature-frontend-release-cache-rollback-contract",
"source": "src/contracts/release-tokens.js",
"source": "src/contracts/release-tokens.ts",
"rowCount": 8,
"contract": {
"requiredFields": [
+74 -1
View File
@@ -1,4 +1,77 @@
{
"schemaVersion": 1,
"changes": []
"changes": [
{
"changeId": "FE-REG-QUERY:$contract:allowedValues:contract-field-changed",
"versionBump": "Cross-context invalidation wire protocol starts at version 1.",
"migration": "Every installed query row declares invalidate-only; older tabs remain local-only.",
"compatibilityWindow": "Mixed releases are isolated by release cacheEpoch and never exchange query keys or values.",
"rollback": "Remove the coordinator composition and the two query registry fields.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-QUERY:$contract:breakingFields:contract-field-changed",
"versionBump": "Cross-context invalidation wire protocol starts at version 1.",
"migration": "Every installed query row declares its opaque topic and transport policy.",
"compatibilityWindow": "A release cacheEpoch rejects messages from a different deployed contract.",
"rollback": "Remove the coordinator composition and restore the prior query registry contract.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-QUERY:$contract:fieldTypes:contract-field-changed",
"versionBump": "Cross-context invalidation wire protocol starts at version 1.",
"migration": "The installed reference query row and all consumers were updated atomically.",
"compatibilityWindow": "Old clients do not consume the new fields; new clients validate them before boot.",
"rollback": "Restore the previous query registry field types and local-only invalidation.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-QUERY:$contract:requiredFields:contract-field-changed",
"versionBump": "Cross-context invalidation wire protocol starts at version 1.",
"migration": "Missing topics now fail registry validation instead of silently degrading at runtime.",
"compatibilityWindow": "Only a fully built release consumes its own installed registry snapshot.",
"rollback": "Remove the newly required fields and cross-context composition together.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-QUERY:$contract:uniqueFields:contract-field-changed",
"versionBump": "Cross-context invalidation wire protocol starts at version 1.",
"migration": "Existing query namespaces received unique registry-issued opaque topics.",
"compatibilityWindow": "Topics are scoped by release cacheEpoch, so mixed releases cannot collide.",
"rollback": "Drop invalidationTopic uniqueness after removing the transport consumer.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-STORAGE:$contract:allowedValues:contract-field-changed",
"versionBump": "Web Storage value codec contracts start at version 1.",
"migration": "Existing keys retain their physical schema version; values outside the selected codec are discarded.",
"compatibilityWindow": "Valid existing color-scheme and opaque-string records remain readable.",
"rollback": "Restore the previous registry contract; no physical key deletion is required.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-STORAGE:$contract:breakingFields:contract-field-changed",
"versionBump": "Web Storage value codec contracts start at version 1.",
"migration": "Each existing row received an explicit codec; executable migration was never consumed and is now forbidden.",
"compatibilityWindow": "Schema-versioned physical keys and the envelope shape remain unchanged.",
"rollback": "Remove valueCodec enforcement and restore the prior metadata declaration.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-STORAGE:$contract:fieldTypes:contract-field-changed",
"versionBump": "Web Storage value codec contracts start at version 1.",
"migration": "The dead function migration union was narrowed to the only implemented discard policy.",
"compatibilityWindow": "All installed definitions already used discard before this contract change.",
"rollback": "Restore the former type metadata without rewriting persisted records.",
"owner": "frontend-platform"
},
{
"changeId": "FE-REG-STORAGE:$contract:requiredFields:contract-field-changed",
"versionBump": "Web Storage value codec contracts start at version 1.",
"migration": "All installed storage rows now declare their closed value codec.",
"compatibilityWindow": "Existing valid envelopes continue to decode; invalid values fail closed.",
"rollback": "Remove the required codec field and runtime codec dispatch together.",
"owner": "frontend-platform"
}
]
}
+34 -19
View File
@@ -8,7 +8,7 @@
"registries": [
{
"registryId": "FE-REG-ROUTE",
"path": "src/features/installed-feature-contracts.js",
"path": "src/features/installed-feature-contracts.ts",
"exportName": "ROUTE_REGISTRY",
"owner": "feature-frontend-routing-release-recovery-runtime",
"keyField": "routeId",
@@ -92,7 +92,7 @@
},
{
"registryId": "FE-REG-ROUTE-RUNTIME",
"path": "src/features/installed-feature-contracts.js",
"path": "src/features/installed-feature-contracts.ts",
"exportName": "ROUTE_RUNTIME_CONTRACT",
"owner": "feature-frontend-routing-release-recovery-runtime",
"keyField": "routeId",
@@ -141,7 +141,7 @@
},
{
"registryId": "FE-REG-API",
"path": "src/features/installed-feature-contracts.js",
"path": "src/features/installed-feature-contracts.ts",
"exportName": "API_OPERATIONS",
"owner": "feature-frontend-api-client-response-envelope-contract",
"keyField": "operationId",
@@ -209,7 +209,7 @@
},
{
"registryId": "FE-REG-SCHEMA",
"path": "src/features/installed-feature-contracts.js",
"path": "src/features/installed-feature-contracts.ts",
"exportName": "SCHEMA_REGISTRY",
"owner": "feature-frontend-contract-schema-registry",
"keyField": "schemaId",
@@ -241,7 +241,7 @@
},
{
"registryId": "FE-REG-ENV",
"path": "src/contracts/env.js",
"path": "src/contracts/env.ts",
"exportName": "ENV_REGISTRY",
"owner": "feature-frontend-env-runtime-config-contract",
"requiredFields": ["phase", "classification", "required", "defaultValue"],
@@ -262,11 +262,11 @@
},
"consumers": [
{
"path": "src/bootstrap/runtime-config-schema.js",
"path": "src/bootstrap/runtime-config-schema.ts",
"token": "APP_ENV"
},
{
"path": "src/contracts/env.js",
"path": "src/contracts/env.ts",
"token": "getBuildConfig"
}
],
@@ -274,7 +274,7 @@
},
{
"registryId": "FE-REG-STORAGE",
"path": "src/contracts/storage-keys.js",
"path": "src/contracts/storage-keys.ts",
"exportName": "STORAGE_REGISTRY",
"owner": "feature-frontend-storage-registry-contract",
"keyField": "logicalName",
@@ -284,6 +284,7 @@
"backend",
"classification",
"schemaVersion",
"valueCodec",
"ttl",
"migration",
"quotaFallback"
@@ -294,8 +295,9 @@
"backend": "string",
"classification": "string",
"schemaVersion": "integer",
"valueCodec": "string",
"ttl": "integer|string|null",
"migration": "string|function",
"migration": "string",
"quotaFallback": "string"
},
"uniqueFields": ["logicalName", "physicalKey"],
@@ -304,7 +306,6 @@
"memory",
"sessionStorage",
"localStorage",
"indexedDB",
"disabled",
"forbidden"
],
@@ -313,6 +314,12 @@
"opaque-cache",
"sensitive-forbidden"
],
"valueCodec": [
"color-scheme-v1",
"opaque-string-v1",
"none"
],
"migration": ["discard"],
"quotaFallback": ["memory", "no-persist", "feature-disable"]
},
"consumerIdentityField": "logicalName",
@@ -324,12 +331,13 @@
"backend",
"classification",
"schemaVersion",
"valueCodec",
"migration"
]
},
{
"registryId": "FE-REG-ERROR",
"path": "src/contracts/errors.js",
"path": "src/contracts/errors.ts",
"exportName": "ERROR_REGISTRY",
"owner": "feature-frontend-error-classification-boundary-contract",
"keyField": "kind",
@@ -365,7 +373,7 @@
},
"consumers": [
{
"path": "src/adapters/http/client.js",
"path": "src/adapters/http/client.ts",
"token": "failure("
}
],
@@ -373,7 +381,7 @@
},
{
"registryId": "FE-REG-QUERY",
"path": "src/features/installed-feature-contracts.js",
"path": "src/features/installed-feature-contracts.ts",
"exportName": "QUERY_REGISTRY",
"owner": "feature-frontend-server-state-caching-contract",
"requiredFields": [
@@ -381,6 +389,8 @@
"serialization",
"identity",
"invalidation",
"invalidationTopic",
"crossContext",
"version",
"persistence"
],
@@ -389,16 +399,19 @@
"serialization": "string",
"identity": "string",
"invalidation": "string",
"invalidationTopic": "string",
"crossContext": "string",
"version": "integer",
"persistence": "string"
},
"uniqueFields": ["namespace"],
"uniqueFields": ["namespace", "invalidationTopic"],
"allowedValues": {
"crossContext": ["invalidate-only"],
"persistence": ["disabled"]
},
"consumers": [
{
"path": "src/features/reference-feature/contracts/reference-feature-contract.js",
"path": "src/features/reference-feature/contracts/reference-feature-contract.ts",
"token": "referenceQueryKeys"
}
],
@@ -406,13 +419,15 @@
"namespace",
"serialization",
"identity",
"invalidationTopic",
"crossContext",
"version",
"persistence"
]
},
{
"registryId": "FE-REG-TELEMETRY",
"path": "src/contracts/telemetry.js",
"path": "src/contracts/telemetry.ts",
"exportName": "TELEMETRY_REGISTRY",
"owner": "feature-frontend-diagnostics-telemetry-runtime",
"keyField": "eventName",
@@ -440,7 +455,7 @@
},
"consumers": [
{
"path": "scripts/check-diagnostics.mjs",
"path": "scripts/check-diagnostics.ts",
"token": "TELEMETRY_REGISTRY"
}
],
@@ -453,7 +468,7 @@
},
{
"registryId": "FE-REG-RELEASE",
"path": "src/contracts/release-tokens.js",
"path": "src/contracts/release-tokens.ts",
"exportName": "RELEASE_TOKEN_REGISTRY",
"owner": "feature-frontend-release-cache-rollback-contract",
"keyField": "token",
@@ -466,7 +481,7 @@
"uniqueFields": ["token"],
"consumers": [
{
"path": "src/bootstrap/load-release-manifest.js",
"path": "src/bootstrap/load-release-manifest.ts",
"token": "assetManifestHash"
}
],