@ttt-productions/ttt-core 0.19.0 → 0.19.1
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/dist/doc-schemas/chat-sync.d.ts +2 -2
- package/dist/doc-schemas/index.d.ts +19 -0
- package/dist/doc-schemas/index.d.ts.map +1 -1
- package/dist/doc-schemas/index.js +21 -0
- package/dist/doc-schemas/index.js.map +1 -1
- package/dist/doc-schemas/media-activation-jobs.d.ts +6 -6
- package/dist/doc-schemas/media-assets.d.ts +168 -14
- package/dist/doc-schemas/media-assets.d.ts.map +1 -1
- package/dist/doc-schemas/media-assets.js +55 -0
- package/dist/doc-schemas/media-assets.js.map +1 -1
- package/dist/doc-schemas/moderation.d.ts +6 -6
- package/dist/doc-schemas/ncii/allegations.d.ts +84 -0
- package/dist/doc-schemas/ncii/allegations.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/allegations.js +45 -0
- package/dist/doc-schemas/ncii/allegations.js.map +1 -0
- package/dist/doc-schemas/ncii/appeals.d.ts +121 -0
- package/dist/doc-schemas/ncii/appeals.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/appeals.js +132 -0
- package/dist/doc-schemas/ncii/appeals.js.map +1 -0
- package/dist/doc-schemas/ncii/cases.d.ts +158 -0
- package/dist/doc-schemas/ncii/cases.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/cases.js +132 -0
- package/dist/doc-schemas/ncii/cases.js.map +1 -0
- package/dist/doc-schemas/ncii/config.d.ts +131 -0
- package/dist/doc-schemas/ncii/config.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/config.js +227 -0
- package/dist/doc-schemas/ncii/config.js.map +1 -0
- package/dist/doc-schemas/ncii/holds.d.ts +84 -0
- package/dist/doc-schemas/ncii/holds.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/holds.js +63 -0
- package/dist/doc-schemas/ncii/holds.js.map +1 -0
- package/dist/doc-schemas/ncii/notices.d.ts +109 -0
- package/dist/doc-schemas/ncii/notices.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/notices.js +114 -0
- package/dist/doc-schemas/ncii/notices.js.map +1 -0
- package/dist/doc-schemas/ncii/removal.d.ts +222 -0
- package/dist/doc-schemas/ncii/removal.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/removal.js +130 -0
- package/dist/doc-schemas/ncii/removal.js.map +1 -0
- package/dist/doc-schemas/ncii/requests.d.ts +372 -0
- package/dist/doc-schemas/ncii/requests.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/requests.js +287 -0
- package/dist/doc-schemas/ncii/requests.js.map +1 -0
- package/dist/doc-schemas/ncii/scan.d.ts +59 -0
- package/dist/doc-schemas/ncii/scan.d.ts.map +1 -0
- package/dist/doc-schemas/ncii/scan.js +105 -0
- package/dist/doc-schemas/ncii/scan.js.map +1 -0
- package/dist/doc-schemas/notification-ledger.d.ts +1 -1
- package/dist/doc-schemas/payments.d.ts +2 -2
- package/dist/doc-schemas/registry.d.ts +1929 -96
- package/dist/doc-schemas/registry.d.ts.map +1 -1
- package/dist/doc-schemas/registry.js +86 -0
- package/dist/doc-schemas/registry.js.map +1 -1
- package/dist/doc-schemas/report-docs.d.ts +3 -3
- package/dist/doc-schemas/safety/age.d.ts +178 -0
- package/dist/doc-schemas/safety/age.d.ts.map +1 -0
- package/dist/doc-schemas/safety/age.js +222 -0
- package/dist/doc-schemas/safety/age.js.map +1 -0
- package/dist/doc-schemas/safety/case-aliases.d.ts +97 -0
- package/dist/doc-schemas/safety/case-aliases.d.ts.map +1 -0
- package/dist/doc-schemas/safety/case-aliases.js +110 -0
- package/dist/doc-schemas/safety/case-aliases.js.map +1 -0
- package/dist/doc-schemas/safety/case.d.ts +542 -0
- package/dist/doc-schemas/safety/case.d.ts.map +1 -0
- package/dist/doc-schemas/safety/case.js +339 -0
- package/dist/doc-schemas/safety/case.js.map +1 -0
- package/dist/doc-schemas/safety/evidence.d.ts +346 -0
- package/dist/doc-schemas/safety/evidence.d.ts.map +1 -0
- package/dist/doc-schemas/safety/evidence.js +273 -0
- package/dist/doc-schemas/safety/evidence.js.map +1 -0
- package/dist/doc-schemas/safety/foundation.d.ts +425 -0
- package/dist/doc-schemas/safety/foundation.d.ts.map +1 -0
- package/dist/doc-schemas/safety/foundation.js +349 -0
- package/dist/doc-schemas/safety/foundation.js.map +1 -0
- package/dist/doc-schemas/safety/holds.d.ts +152 -0
- package/dist/doc-schemas/safety/holds.d.ts.map +1 -0
- package/dist/doc-schemas/safety/holds.js +142 -0
- package/dist/doc-schemas/safety/holds.js.map +1 -0
- package/dist/doc-schemas/safety/monitors.d.ts +77 -0
- package/dist/doc-schemas/safety/monitors.d.ts.map +1 -0
- package/dist/doc-schemas/safety/monitors.js +87 -0
- package/dist/doc-schemas/safety/monitors.js.map +1 -0
- package/dist/doc-schemas/safety/provenance.d.ts +70 -0
- package/dist/doc-schemas/safety/provenance.d.ts.map +1 -0
- package/dist/doc-schemas/safety/provenance.js +76 -0
- package/dist/doc-schemas/safety/provenance.js.map +1 -0
- package/dist/doc-schemas/safety/report.d.ts +256 -0
- package/dist/doc-schemas/safety/report.d.ts.map +1 -0
- package/dist/doc-schemas/safety/report.js +116 -0
- package/dist/doc-schemas/safety/report.js.map +1 -0
- package/dist/doc-schemas/safety/sagas.d.ts +154 -0
- package/dist/doc-schemas/safety/sagas.d.ts.map +1 -0
- package/dist/doc-schemas/safety/sagas.js +162 -0
- package/dist/doc-schemas/safety/sagas.js.map +1 -0
- package/dist/doc-schemas/social.d.ts +3 -3
- package/dist/doc-schemas/user.d.ts +15 -0
- package/dist/doc-schemas/user.d.ts.map +1 -1
- package/dist/doc-schemas/user.js +9 -0
- package/dist/doc-schemas/user.js.map +1 -1
- package/dist/doc-schemas/work-project.d.ts +1 -1
- package/dist/media/atoms.d.ts +2 -2
- package/dist/media/domain-events-admin.d.ts +1 -1
- package/dist/media/domain-events.d.ts +1 -1
- package/dist/media/file-origin.d.ts +1 -1
- package/dist/media/index.d.ts +1 -0
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/pending-media.d.ts +25 -25
- package/dist/media/photodna-coverage.d.ts +46 -0
- package/dist/media/photodna-coverage.d.ts.map +1 -0
- package/dist/media/photodna-coverage.js +74 -0
- package/dist/media/photodna-coverage.js.map +1 -0
- package/dist/media/start-upload.d.ts +1 -1
- package/dist/media/target-info.d.ts +1 -1
- package/dist/paths/collections.d.ts +58 -0
- package/dist/paths/collections.d.ts.map +1 -1
- package/dist/paths/collections.js +77 -0
- package/dist/paths/collections.js.map +1 -1
- package/dist/paths/path-builders.d.ts +57 -0
- package/dist/paths/path-builders.d.ts.map +1 -1
- package/dist/paths/path-builders.js +75 -0
- package/dist/paths/path-builders.js.map +1 -1
- package/dist/schemas/social.d.ts +2 -2
- package/dist/types/audit.d.ts +1 -1
- package/dist/types/audit.d.ts.map +1 -1
- package/dist/upload-variables/square-streetz-post-variables.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Trust & Safety — NCII allegations (Appendix A §A11, concept (1)).
|
|
2
|
+
//
|
|
3
|
+
// `nciiAllegations/{allegationId}` — ANY user (authenticated or anonymous public)
|
|
4
|
+
// may allege NCII. An allegation may justify platform-policy hiding but does NOT
|
|
5
|
+
// by itself satisfy the statute or arm the 48h clock; it NEVER auto-becomes a
|
|
6
|
+
// statutory `takeItDownRequest`. The discriminated locator is the ONE typed
|
|
7
|
+
// locator (TargetLocatorV1) — never an all-optional contentRef.
|
|
8
|
+
//
|
|
9
|
+
// Every shape here is transcribed verbatim from docs/code_changes_needed/
|
|
10
|
+
// trust-and-safety/IMPLEMENTATION_PLAN.md Appendix A §A11 (1) — no invented
|
|
11
|
+
// values, no placeholders.
|
|
12
|
+
//
|
|
13
|
+
// SHARED enums + the locator come from ../safety/foundation.js (the single source
|
|
14
|
+
// for every cross-cluster enum); they are NEVER redefined here. This cluster
|
|
15
|
+
// IMPORTS TargetLocatorV1Schema.
|
|
16
|
+
//
|
|
17
|
+
// Collection note: this cluster introduces a NEW Firestore collection; wiring
|
|
18
|
+
// collections.ts / path-builders.ts / registry.ts is deferred to the app leg (the
|
|
19
|
+
// orchestrator binds the schema + path builders there); the doc-id shape is
|
|
20
|
+
// documented on the schema below.
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
import { TargetLocatorV1Schema } from '../safety/foundation.js';
|
|
23
|
+
// ===========================================================================
|
|
24
|
+
// §A11 (1) — nciiAllegations/{allegationId}
|
|
25
|
+
// ===========================================================================
|
|
26
|
+
/** Who alleged: an authenticated user or an anonymous member of the public. */
|
|
27
|
+
export const NciiAllegationReporterTypeSchema = z.enum(['authenticatedUser', 'anonymousPublic']);
|
|
28
|
+
/** Allegation lifecycle status — `received` until triaged into one of the
|
|
29
|
+
* terminal/linked states. An allegation NEVER becomes a statutory request. */
|
|
30
|
+
export const NciiAllegationStatusSchema = z.enum(['received', 'linked', 'dismissed', 'escalated']);
|
|
31
|
+
/** `nciiAllegations/{allegationId}` — any user may allege; does NOT by itself
|
|
32
|
+
* satisfy the statute or arm the 48h clock. Doc id `allegationId` is a
|
|
33
|
+
* deterministic/assigned id (z.string().min(1)). */
|
|
34
|
+
export const NciiAllegationV1Schema = z.object({
|
|
35
|
+
schemaVersion: z.literal(1),
|
|
36
|
+
allegationId: z.string().min(1),
|
|
37
|
+
caseId: z.string().min(1).optional(),
|
|
38
|
+
reporterType: NciiAllegationReporterTypeSchema,
|
|
39
|
+
submittedAt: z.number(),
|
|
40
|
+
// the discriminated locator (the ONE typed locator) — never an all-optional contentRef
|
|
41
|
+
targetLocator: TargetLocatorV1Schema,
|
|
42
|
+
allegationReason: z.string(), // free-text reason; NEVER substitutes for a statutory request
|
|
43
|
+
status: NciiAllegationStatusSchema,
|
|
44
|
+
}).strict();
|
|
45
|
+
//# sourceMappingURL=allegations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allegations.js","sourceRoot":"","sources":["../../../src/doc-schemas/ncii/allegations.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,kFAAkF;AAClF,iFAAiF;AACjF,8EAA8E;AAC9E,4EAA4E;AAC5E,gEAAgE;AAChE,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,2BAA2B;AAC3B,EAAE;AACF,kFAAkF;AAClF,6EAA6E;AAC7E,iCAAiC;AACjC,EAAE;AACF,8EAA8E;AAC9E,kFAAkF;AAClF,4EAA4E;AAC5E,kCAAkC;AAElC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAGjG;8EAC8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAGnG;;oDAEoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,gCAAgC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,uFAAuF;IACvF,aAAa,EAAE,qBAAqB;IACpC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,8DAA8D;IAC5F,MAAM,EAAE,0BAA0B;CACnC,CAAC,CAAC,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** The AUTHORITATIVE appeal state (`nciiCases.appealState` projects this). */
|
|
3
|
+
export declare const NciiAppealStateSchema: z.ZodEnum<{
|
|
4
|
+
underReview: "underReview";
|
|
5
|
+
denied: "denied";
|
|
6
|
+
submitted: "submitted";
|
|
7
|
+
granted: "granted";
|
|
8
|
+
withdrawn: "withdrawn";
|
|
9
|
+
}>;
|
|
10
|
+
export type NciiAppealState = z.infer<typeof NciiAppealStateSchema>;
|
|
11
|
+
/** Durable command/retry/dead-letter status for the reinstatement/denial effect. */
|
|
12
|
+
export declare const NciiAppealCommandStatusSchema: z.ZodEnum<{
|
|
13
|
+
pending: "pending";
|
|
14
|
+
deadLetter: "deadLetter";
|
|
15
|
+
applied: "applied";
|
|
16
|
+
executing: "executing";
|
|
17
|
+
}>;
|
|
18
|
+
export type NciiAppealCommandStatus = z.infer<typeof NciiAppealCommandStatusSchema>;
|
|
19
|
+
/** Durable command sub-record on the appeal — drives the reinstatement/denial
|
|
20
|
+
* effect with retry/dead-letter. */
|
|
21
|
+
export declare const NciiAppealCommandV1Schema: z.ZodObject<{
|
|
22
|
+
commandId: z.ZodString;
|
|
23
|
+
status: z.ZodEnum<{
|
|
24
|
+
pending: "pending";
|
|
25
|
+
deadLetter: "deadLetter";
|
|
26
|
+
applied: "applied";
|
|
27
|
+
executing: "executing";
|
|
28
|
+
}>;
|
|
29
|
+
attemptCount: z.ZodNumber;
|
|
30
|
+
nextAttemptAt: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
leaseOwner: z.ZodOptional<z.ZodString>;
|
|
32
|
+
leaseExpiresAt: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
lastErrorCode: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.core.$strict>;
|
|
35
|
+
export type NciiAppealCommandV1 = z.infer<typeof NciiAppealCommandV1Schema>;
|
|
36
|
+
/** `nciiAppeals/{appealId}` — durable, append-only uploader-removal appeal. Doc id
|
|
37
|
+
* `appealId` is deterministic:
|
|
38
|
+
* `sha256('ncii-appeal-v1:' + caseId + ':' + appellantUid + ':' + removalGeneration)`
|
|
39
|
+
* (a retried submit resolves to the same doc — idempotent). */
|
|
40
|
+
export declare const NciiAppealV1Schema: z.ZodObject<{
|
|
41
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
42
|
+
appealId: z.ZodString;
|
|
43
|
+
caseId: z.ZodString;
|
|
44
|
+
requestIds: z.ZodArray<z.ZodString>;
|
|
45
|
+
appealKind: z.ZodLiteral<"uploaderRemovalAppeal">;
|
|
46
|
+
removalGeneration: z.ZodNumber;
|
|
47
|
+
appellantUid: z.ZodString;
|
|
48
|
+
idempotencyKey: z.ZodString;
|
|
49
|
+
state: z.ZodEnum<{
|
|
50
|
+
underReview: "underReview";
|
|
51
|
+
denied: "denied";
|
|
52
|
+
submitted: "submitted";
|
|
53
|
+
granted: "granted";
|
|
54
|
+
withdrawn: "withdrawn";
|
|
55
|
+
}>;
|
|
56
|
+
deadlineAt: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
command: z.ZodObject<{
|
|
58
|
+
commandId: z.ZodString;
|
|
59
|
+
status: z.ZodEnum<{
|
|
60
|
+
pending: "pending";
|
|
61
|
+
deadLetter: "deadLetter";
|
|
62
|
+
applied: "applied";
|
|
63
|
+
executing: "executing";
|
|
64
|
+
}>;
|
|
65
|
+
attemptCount: z.ZodNumber;
|
|
66
|
+
nextAttemptAt: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
leaseOwner: z.ZodOptional<z.ZodString>;
|
|
68
|
+
leaseExpiresAt: z.ZodOptional<z.ZodNumber>;
|
|
69
|
+
lastErrorCode: z.ZodOptional<z.ZodString>;
|
|
70
|
+
}, z.core.$strict>;
|
|
71
|
+
createdAt: z.ZodNumber;
|
|
72
|
+
updatedAt: z.ZodNumber;
|
|
73
|
+
decidedAt: z.ZodOptional<z.ZodNumber>;
|
|
74
|
+
}, z.core.$strict>;
|
|
75
|
+
export type NciiAppealV1 = z.infer<typeof NciiAppealV1Schema>;
|
|
76
|
+
/** Who created the submission. */
|
|
77
|
+
export declare const NciiAppealSubmissionAuthorSchema: z.ZodEnum<{
|
|
78
|
+
operator: "operator";
|
|
79
|
+
appellant: "appellant";
|
|
80
|
+
}>;
|
|
81
|
+
export type NciiAppealSubmissionAuthor = z.infer<typeof NciiAppealSubmissionAuthorSchema>;
|
|
82
|
+
/** `nciiAppeals/{appealId}/submissions/{submissionId}` — IMMUTABLE append-only
|
|
83
|
+
* record of the appellant's reason + evidence. Doc id `submissionId` is a
|
|
84
|
+
* deterministic/assigned id (z.string().min(1)). */
|
|
85
|
+
export declare const NciiAppealSubmissionV1Schema: z.ZodObject<{
|
|
86
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
87
|
+
submissionId: z.ZodString;
|
|
88
|
+
sequence: z.ZodNumber;
|
|
89
|
+
receivedAt: z.ZodNumber;
|
|
90
|
+
appellantStatement: z.ZodString;
|
|
91
|
+
evidenceIds: z.ZodArray<z.ZodString>;
|
|
92
|
+
createdBy: z.ZodEnum<{
|
|
93
|
+
operator: "operator";
|
|
94
|
+
appellant: "appellant";
|
|
95
|
+
}>;
|
|
96
|
+
}, z.core.$strict>;
|
|
97
|
+
export type NciiAppealSubmissionV1 = z.infer<typeof NciiAppealSubmissionV1Schema>;
|
|
98
|
+
/** Appeal decision result. */
|
|
99
|
+
export declare const NciiAppealDecisionResultSchema: z.ZodEnum<{
|
|
100
|
+
denied: "denied";
|
|
101
|
+
granted: "granted";
|
|
102
|
+
}>;
|
|
103
|
+
export type NciiAppealDecisionResult = z.infer<typeof NciiAppealDecisionResultSchema>;
|
|
104
|
+
/** `nciiAppeals/{appealId}/decisions/{decisionId}` — IMMUTABLE append-only
|
|
105
|
+
* decision. ONLY `nciiAppealReviewer` may write a decision (capability pinned by
|
|
106
|
+
* literal). Doc id `decisionId` is a deterministic/assigned id (z.string().min(1)). */
|
|
107
|
+
export declare const NciiAppealDecisionV1Schema: z.ZodObject<{
|
|
108
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
109
|
+
decisionId: z.ZodString;
|
|
110
|
+
result: z.ZodEnum<{
|
|
111
|
+
denied: "denied";
|
|
112
|
+
granted: "granted";
|
|
113
|
+
}>;
|
|
114
|
+
reviewerUid: z.ZodString;
|
|
115
|
+
capability: z.ZodLiteral<"nciiAppealReviewer">;
|
|
116
|
+
basisSubmissionIds: z.ZodArray<z.ZodString>;
|
|
117
|
+
rationaleRef: z.ZodString;
|
|
118
|
+
decidedAt: z.ZodNumber;
|
|
119
|
+
}, z.core.$strict>;
|
|
120
|
+
export type NciiAppealDecisionV1 = z.infer<typeof NciiAppealDecisionV1Schema>;
|
|
121
|
+
//# sourceMappingURL=appeals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appeals.d.ts","sourceRoot":"","sources":["../../../src/doc-schemas/ncii/appeals.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB;;;;;;EAMhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,oFAAoF;AACpF,eAAO,MAAM,6BAA6B;;;;;EAKxC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF;oCACoC;AACpC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;kBAQ3B,CAAC;AACZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E;;;+DAG+D;AAC/D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwBpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAO9D,kCAAkC;AAClC,eAAO,MAAM,gCAAgC;;;EAAoC,CAAC;AAClF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F;;oDAEoD;AACpD,eAAO,MAAM,4BAA4B;;;;;;;;;;;kBAQ9B,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AASlF,8BAA8B;AAC9B,eAAO,MAAM,8BAA8B;;;EAAgC,CAAC;AAC5E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF;;uFAEuF;AACvF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;kBAS5B,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Trust & Safety — durable uploader-removal appeal (Appendix A §A11 [H-09]).
|
|
2
|
+
//
|
|
3
|
+
// `nciiAppeals/{appealId}` — the `uploaderRemovalAppeal` is a first-class durable,
|
|
4
|
+
// append-only record exactly like every other NCII workflow object. The mutable
|
|
5
|
+
// `nciiCases.appealState` is a labeled NON-AUTHORITATIVE PROJECTION of this record,
|
|
6
|
+
// NEVER the authority.
|
|
7
|
+
//
|
|
8
|
+
// This schema is the UPLOADER appeal ONLY (`appealKind:'uploaderRemovalAppeal'`).
|
|
9
|
+
// The authenticated uploader whose content was removed appeals here; ONLY
|
|
10
|
+
// `nciiAppealReviewer` may grant it (reinstate content / reverse an NCII hash
|
|
11
|
+
// block), and a child-safety hold is NEVER reversible through it. A requester's
|
|
12
|
+
// `requesterValidityCorrection` (status-token supplement) is NOT an appeal, carries
|
|
13
|
+
// NO reinstatement power, and is NOT modeled by this schema.
|
|
14
|
+
//
|
|
15
|
+
// Deterministic `appealId = sha256('ncii-appeal-v1:' + caseId + ':' + appellantUid
|
|
16
|
+
// + ':' + removalGeneration)` (a retried submit resolves to the same doc —
|
|
17
|
+
// idempotent). The client-supplied ≥128-bit `idempotencyKey` together with the
|
|
18
|
+
// deterministic appealId guarantees one record per retry.
|
|
19
|
+
//
|
|
20
|
+
// Every shape here is transcribed verbatim from docs/code_changes_needed/
|
|
21
|
+
// trust-and-safety/IMPLEMENTATION_PLAN.md Appendix A §A11 [H-09] — no invented
|
|
22
|
+
// values, no placeholders.
|
|
23
|
+
//
|
|
24
|
+
// Collection note: this cluster introduces a NEW Firestore collection (+ two
|
|
25
|
+
// append-only child subcollections); wiring collections.ts / path-builders.ts /
|
|
26
|
+
// registry.ts is deferred to the app leg (the orchestrator binds the schemas +
|
|
27
|
+
// path builders there); the deterministic doc-id shape is documented on each
|
|
28
|
+
// schema below. No shared enum is imported — the appeal kind/state/command/result
|
|
29
|
+
// vocabularies are appeal-local literals (the cross-cluster NciiAppealKind enum
|
|
30
|
+
// has two members; this schema pins the single literal it owns).
|
|
31
|
+
import { z } from 'zod';
|
|
32
|
+
// ===========================================================================
|
|
33
|
+
// §A11 [H-09] — appeal state + command vocabularies
|
|
34
|
+
// ===========================================================================
|
|
35
|
+
/** The AUTHORITATIVE appeal state (`nciiCases.appealState` projects this). */
|
|
36
|
+
export const NciiAppealStateSchema = z.enum([
|
|
37
|
+
'submitted',
|
|
38
|
+
'underReview',
|
|
39
|
+
'granted',
|
|
40
|
+
'denied',
|
|
41
|
+
'withdrawn',
|
|
42
|
+
]);
|
|
43
|
+
/** Durable command/retry/dead-letter status for the reinstatement/denial effect. */
|
|
44
|
+
export const NciiAppealCommandStatusSchema = z.enum([
|
|
45
|
+
'pending',
|
|
46
|
+
'executing',
|
|
47
|
+
'applied',
|
|
48
|
+
'deadLetter',
|
|
49
|
+
]);
|
|
50
|
+
/** Durable command sub-record on the appeal — drives the reinstatement/denial
|
|
51
|
+
* effect with retry/dead-letter. */
|
|
52
|
+
export const NciiAppealCommandV1Schema = z.object({
|
|
53
|
+
commandId: z.string().min(1),
|
|
54
|
+
status: NciiAppealCommandStatusSchema,
|
|
55
|
+
attemptCount: z.number(),
|
|
56
|
+
nextAttemptAt: z.number().optional(),
|
|
57
|
+
leaseOwner: z.string().min(1).optional(),
|
|
58
|
+
leaseExpiresAt: z.number().optional(),
|
|
59
|
+
lastErrorCode: z.string().optional(),
|
|
60
|
+
}).strict();
|
|
61
|
+
// ===========================================================================
|
|
62
|
+
// §A11 [H-09] — nciiAppeals/{appealId}
|
|
63
|
+
// ===========================================================================
|
|
64
|
+
/** `nciiAppeals/{appealId}` — durable, append-only uploader-removal appeal. Doc id
|
|
65
|
+
* `appealId` is deterministic:
|
|
66
|
+
* `sha256('ncii-appeal-v1:' + caseId + ':' + appellantUid + ':' + removalGeneration)`
|
|
67
|
+
* (a retried submit resolves to the same doc — idempotent). */
|
|
68
|
+
export const NciiAppealV1Schema = z.object({
|
|
69
|
+
schemaVersion: z.literal(1),
|
|
70
|
+
// = sha256('ncii-appeal-v1:' + caseId + ':' + appellantUid + ':' + removalGeneration)
|
|
71
|
+
appealId: z.string().min(1),
|
|
72
|
+
caseId: z.string().min(1),
|
|
73
|
+
// the request(s)/removal this appeal contests
|
|
74
|
+
requestIds: z.array(z.string().min(1)).max(16),
|
|
75
|
+
// this schema is the uploader appeal ONLY
|
|
76
|
+
appealKind: z.literal('uploaderRemovalAppeal'),
|
|
77
|
+
// ties the appeal to the specific NciiRemovalJobV1 generation that removed the content
|
|
78
|
+
removalGeneration: z.number(),
|
|
79
|
+
// the AUTHENTICATED uploader whose content was removed
|
|
80
|
+
appellantUid: z.string().min(1),
|
|
81
|
+
// client-supplied, ≥128-bit; together with the deterministic appealId guarantees one record per retry
|
|
82
|
+
idempotencyKey: z.string().min(1),
|
|
83
|
+
// the AUTHORITATIVE appeal state (appealState projects this)
|
|
84
|
+
state: NciiAppealStateSchema,
|
|
85
|
+
// per-appeal review SLA (NciiPolicyConfigV1.uploaderRemovalAppealWindowDays); UI-independent monitor may arm on it
|
|
86
|
+
deadlineAt: z.number().optional(),
|
|
87
|
+
// durable command/retry/dead-letter state for the reinstatement/denial effect
|
|
88
|
+
command: NciiAppealCommandV1Schema,
|
|
89
|
+
createdAt: z.number(),
|
|
90
|
+
updatedAt: z.number(),
|
|
91
|
+
decidedAt: z.number().optional(),
|
|
92
|
+
}).strict();
|
|
93
|
+
// ===========================================================================
|
|
94
|
+
// §A11 [H-09] — nciiAppeals/{appealId}/submissions/{submissionId}
|
|
95
|
+
// IMMUTABLE append-only — the appellant's reason + evidence.
|
|
96
|
+
// ===========================================================================
|
|
97
|
+
/** Who created the submission. */
|
|
98
|
+
export const NciiAppealSubmissionAuthorSchema = z.enum(['appellant', 'operator']);
|
|
99
|
+
/** `nciiAppeals/{appealId}/submissions/{submissionId}` — IMMUTABLE append-only
|
|
100
|
+
* record of the appellant's reason + evidence. Doc id `submissionId` is a
|
|
101
|
+
* deterministic/assigned id (z.string().min(1)). */
|
|
102
|
+
export const NciiAppealSubmissionV1Schema = z.object({
|
|
103
|
+
schemaVersion: z.literal(1),
|
|
104
|
+
submissionId: z.string().min(1),
|
|
105
|
+
sequence: z.number(),
|
|
106
|
+
receivedAt: z.number(),
|
|
107
|
+
appellantStatement: z.string(),
|
|
108
|
+
evidenceIds: z.array(z.string().min(1)).max(16),
|
|
109
|
+
createdBy: NciiAppealSubmissionAuthorSchema,
|
|
110
|
+
}).strict();
|
|
111
|
+
// ===========================================================================
|
|
112
|
+
// §A11 [H-09] — nciiAppeals/{appealId}/decisions/{decisionId}
|
|
113
|
+
// IMMUTABLE append-only — ONLY `nciiAppealReviewer` may write a decision; a
|
|
114
|
+
// `granted` decision drives the reinstatement command + a child-safety hold is
|
|
115
|
+
// NEVER reversible through it.
|
|
116
|
+
// ===========================================================================
|
|
117
|
+
/** Appeal decision result. */
|
|
118
|
+
export const NciiAppealDecisionResultSchema = z.enum(['granted', 'denied']);
|
|
119
|
+
/** `nciiAppeals/{appealId}/decisions/{decisionId}` — IMMUTABLE append-only
|
|
120
|
+
* decision. ONLY `nciiAppealReviewer` may write a decision (capability pinned by
|
|
121
|
+
* literal). Doc id `decisionId` is a deterministic/assigned id (z.string().min(1)). */
|
|
122
|
+
export const NciiAppealDecisionV1Schema = z.object({
|
|
123
|
+
schemaVersion: z.literal(1),
|
|
124
|
+
decisionId: z.string().min(1),
|
|
125
|
+
result: NciiAppealDecisionResultSchema,
|
|
126
|
+
reviewerUid: z.string().min(1),
|
|
127
|
+
capability: z.literal('nciiAppealReviewer'),
|
|
128
|
+
basisSubmissionIds: z.array(z.string().min(1)).max(16),
|
|
129
|
+
rationaleRef: z.string(),
|
|
130
|
+
decidedAt: z.number(),
|
|
131
|
+
}).strict();
|
|
132
|
+
//# sourceMappingURL=appeals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appeals.js","sourceRoot":"","sources":["../../../src/doc-schemas/ncii/appeals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Case lane — adult NCII vs likeness/depiction. */
|
|
3
|
+
export declare const NciiCaseLaneSchema: z.ZodEnum<{
|
|
4
|
+
ncii: "ncii";
|
|
5
|
+
likeness: "likeness";
|
|
6
|
+
}>;
|
|
7
|
+
export type NciiCaseLane = z.infer<typeof NciiCaseLaneSchema>;
|
|
8
|
+
/** NON-AUTHORITATIVE projection of the durable NciiAppealV1 (the
|
|
9
|
+
* `uploaderRemovalAppeal` only) — derived from the appeal's latest decision; the
|
|
10
|
+
* appeal record, not this field, is the source of truth ([H-09]). Only
|
|
11
|
+
* `nciiAppealReviewer` may drive 'granted'/reinstate. */
|
|
12
|
+
export declare const NciiCaseAppealStateSchema: z.ZodEnum<{
|
|
13
|
+
underReview: "underReview";
|
|
14
|
+
none: "none";
|
|
15
|
+
denied: "denied";
|
|
16
|
+
submitted: "submitted";
|
|
17
|
+
granted: "granted";
|
|
18
|
+
}>;
|
|
19
|
+
export type NciiCaseAppealState = z.infer<typeof NciiCaseAppealStateSchema>;
|
|
20
|
+
/** `nciiCases/{caseId}` — the operational record; minimize-retention; child-link
|
|
21
|
+
* rows, never unbounded root arrays. Doc id `caseId` is a deterministic/assigned
|
|
22
|
+
* id (z.string().min(1)). NO case-level `fileDeleteAfter` [M3]: a single
|
|
23
|
+
* case-level timestamp could wrongly override a LATER-linked request, so each
|
|
24
|
+
* evidence row owns its own `deleteAfter` and each request owns its own
|
|
25
|
+
* PII/status/token schedule. */
|
|
26
|
+
export declare const NciiCaseV1Schema: z.ZodObject<{
|
|
27
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
28
|
+
caseId: z.ZodString;
|
|
29
|
+
revision: z.ZodNumber;
|
|
30
|
+
lane: z.ZodEnum<{
|
|
31
|
+
ncii: "ncii";
|
|
32
|
+
likeness: "likeness";
|
|
33
|
+
}>;
|
|
34
|
+
internalStatus: z.ZodEnum<{
|
|
35
|
+
open: "open";
|
|
36
|
+
rejected: "rejected";
|
|
37
|
+
removed: "removed";
|
|
38
|
+
removalInProgress: "removalInProgress";
|
|
39
|
+
appealPending: "appealPending";
|
|
40
|
+
reinstated: "reinstated";
|
|
41
|
+
closed: "closed";
|
|
42
|
+
}>;
|
|
43
|
+
childSafetyLinkStatus: z.ZodEnum<{
|
|
44
|
+
none: "none";
|
|
45
|
+
assessmentPending: "assessmentPending";
|
|
46
|
+
linked: "linked";
|
|
47
|
+
resolvedNoChildSafetyCase: "resolvedNoChildSafetyCase";
|
|
48
|
+
}>;
|
|
49
|
+
crossover: z.ZodObject<{
|
|
50
|
+
minorAssessment: z.ZodEnum<{
|
|
51
|
+
unknown: "unknown";
|
|
52
|
+
adult: "adult";
|
|
53
|
+
possibleMinor: "possibleMinor";
|
|
54
|
+
confirmedMinor: "confirmedMinor";
|
|
55
|
+
}>;
|
|
56
|
+
csamAssessment: z.ZodEnum<{
|
|
57
|
+
notAssessed: "notAssessed";
|
|
58
|
+
notApparent: "notApparent";
|
|
59
|
+
apparentViolation: "apparentViolation";
|
|
60
|
+
validatedHashMatch: "validatedHashMatch";
|
|
61
|
+
}>;
|
|
62
|
+
childSafetyCaseId: z.ZodOptional<z.ZodString>;
|
|
63
|
+
assessedByUid: z.ZodOptional<z.ZodString>;
|
|
64
|
+
assessedAt: z.ZodOptional<z.ZodNumber>;
|
|
65
|
+
}, z.core.$strict>;
|
|
66
|
+
childSafetyCaseId: z.ZodOptional<z.ZodString>;
|
|
67
|
+
appealState: z.ZodEnum<{
|
|
68
|
+
underReview: "underReview";
|
|
69
|
+
none: "none";
|
|
70
|
+
denied: "denied";
|
|
71
|
+
submitted: "submitted";
|
|
72
|
+
granted: "granted";
|
|
73
|
+
}>;
|
|
74
|
+
nciiRemovalDeadlineAt: z.ZodOptional<z.ZodNumber>;
|
|
75
|
+
createdAt: z.ZodNumber;
|
|
76
|
+
updatedAt: z.ZodNumber;
|
|
77
|
+
}, z.core.$strict>;
|
|
78
|
+
export type NciiCaseV1 = z.infer<typeof NciiCaseV1Schema>;
|
|
79
|
+
/** `nciiCases/{caseId}/allegationLinks/{allegationId}` — links an allegation to
|
|
80
|
+
* the case. Doc id is the `allegationId`. */
|
|
81
|
+
export declare const NciiCaseAllegationLinkV1Schema: z.ZodObject<{
|
|
82
|
+
allegationId: z.ZodString;
|
|
83
|
+
linkedAt: z.ZodNumber;
|
|
84
|
+
linkedByUid: z.ZodString;
|
|
85
|
+
}, z.core.$strict>;
|
|
86
|
+
export type NciiCaseAllegationLinkV1 = z.infer<typeof NciiCaseAllegationLinkV1Schema>;
|
|
87
|
+
/** `nciiCases/{caseId}/requestLinks/{requestId}` — links a statutory request to
|
|
88
|
+
* the case. Doc id is the `requestId`. */
|
|
89
|
+
export declare const NciiCaseRequestLinkV1Schema: z.ZodObject<{
|
|
90
|
+
requestId: z.ZodString;
|
|
91
|
+
linkedAt: z.ZodNumber;
|
|
92
|
+
linkedByUid: z.ZodString;
|
|
93
|
+
}, z.core.$strict>;
|
|
94
|
+
export type NciiCaseRequestLinkV1 = z.infer<typeof NciiCaseRequestLinkV1Schema>;
|
|
95
|
+
/** Removal-action method on a `removalActions` row. */
|
|
96
|
+
export declare const NciiCaseRemovalActionMethodSchema: z.ZodEnum<{
|
|
97
|
+
tombstone: "tombstone";
|
|
98
|
+
accountAction: "accountAction";
|
|
99
|
+
assetBlock: "assetBlock";
|
|
100
|
+
}>;
|
|
101
|
+
export type NciiCaseRemovalActionMethod = z.infer<typeof NciiCaseRemovalActionMethodSchema>;
|
|
102
|
+
/** `nciiCases/{caseId}/removalActions/{actionId}` — append-only removal-action
|
|
103
|
+
* row. Doc id is the `actionId`. */
|
|
104
|
+
export declare const NciiCaseRemovalActionV1Schema: z.ZodObject<{
|
|
105
|
+
at: z.ZodNumber;
|
|
106
|
+
actorId: z.ZodString;
|
|
107
|
+
surface: z.ZodString;
|
|
108
|
+
targetItemType: z.ZodString;
|
|
109
|
+
targetItemId: z.ZodString;
|
|
110
|
+
method: z.ZodEnum<{
|
|
111
|
+
tombstone: "tombstone";
|
|
112
|
+
accountAction: "accountAction";
|
|
113
|
+
assetBlock: "assetBlock";
|
|
114
|
+
}>;
|
|
115
|
+
result: z.ZodString;
|
|
116
|
+
}, z.core.$strict>;
|
|
117
|
+
export type NciiCaseRemovalActionV1 = z.infer<typeof NciiCaseRemovalActionV1Schema>;
|
|
118
|
+
/** Provenance of a blocked exact hash. Transformed / non-identical content is
|
|
119
|
+
* NEVER auto-claimed identical. */
|
|
120
|
+
export declare const NciiBlockedHashSourceSchema: z.ZodEnum<{
|
|
121
|
+
requestEvidence: "requestEvidence";
|
|
122
|
+
platformOriginal: "platformOriginal";
|
|
123
|
+
platformCopy: "platformCopy";
|
|
124
|
+
knownIdenticalCopy: "knownIdenticalCopy";
|
|
125
|
+
}>;
|
|
126
|
+
export type NciiBlockedHashSource = z.infer<typeof NciiBlockedHashSourceSchema>;
|
|
127
|
+
/** Blocked-hash lifecycle. Reversal is restricted + audited; adult NCII hashes do
|
|
128
|
+
* NOT enter the CSAM hash system unless child-safety criteria independently
|
|
129
|
+
* apply. */
|
|
130
|
+
export declare const NciiBlockedHashStatusSchema: z.ZodEnum<{
|
|
131
|
+
active: "active";
|
|
132
|
+
reversed: "reversed";
|
|
133
|
+
}>;
|
|
134
|
+
export type NciiBlockedHashStatus = z.infer<typeof NciiBlockedHashStatusSchema>;
|
|
135
|
+
/** `nciiCases/{caseId}/blockedHashes/{hashId}` [F8] — exact-hash block. Doc id is
|
|
136
|
+
* the `hashId`. */
|
|
137
|
+
export declare const NciiBlockedHashV1Schema: z.ZodObject<{
|
|
138
|
+
hashId: z.ZodString;
|
|
139
|
+
algorithm: z.ZodLiteral<"sha256">;
|
|
140
|
+
digest: z.ZodString;
|
|
141
|
+
source: z.ZodEnum<{
|
|
142
|
+
requestEvidence: "requestEvidence";
|
|
143
|
+
platformOriginal: "platformOriginal";
|
|
144
|
+
platformCopy: "platformCopy";
|
|
145
|
+
knownIdenticalCopy: "knownIdenticalCopy";
|
|
146
|
+
}>;
|
|
147
|
+
createdAt: z.ZodNumber;
|
|
148
|
+
createdByUid: z.ZodString;
|
|
149
|
+
status: z.ZodEnum<{
|
|
150
|
+
active: "active";
|
|
151
|
+
reversed: "reversed";
|
|
152
|
+
}>;
|
|
153
|
+
reversedAt: z.ZodOptional<z.ZodNumber>;
|
|
154
|
+
reversedByUid: z.ZodOptional<z.ZodString>;
|
|
155
|
+
reversalReason: z.ZodOptional<z.ZodString>;
|
|
156
|
+
}, z.core.$strict>;
|
|
157
|
+
export type NciiBlockedHashV1 = z.infer<typeof NciiBlockedHashV1Schema>;
|
|
158
|
+
//# sourceMappingURL=cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cases.d.ts","sourceRoot":"","sources":["../../../src/doc-schemas/ncii/cases.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,oDAAoD;AACpD,eAAO,MAAM,kBAAkB;;;EAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;yDAGyD;AACzD,eAAO,MAAM,yBAAyB;;;;;;EAMpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;gCAKgC;AAChC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoBlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM1D;6CAC6C;AAC7C,eAAO,MAAM,8BAA8B;;;;kBAIhC,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF;0CAC0C;AAC1C,eAAO,MAAM,2BAA2B;;;;kBAI7B,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,uDAAuD;AACvD,eAAO,MAAM,iCAAiC;;;;EAAuD,CAAC;AACtG,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F;oCACoC;AACpC,eAAO,MAAM,6BAA6B;;;;;;;;;;;;kBAQ/B,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAOpF;mCACmC;AACnC,eAAO,MAAM,2BAA2B;;;;;EAKtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;YAEY;AACZ,eAAO,MAAM,2BAA2B;;;EAAiC,CAAC;AAC1E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;mBACmB;AACnB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;kBAWzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Trust & Safety — NCII operational case (Appendix A §A11, concept (3)) + the
|
|
2
|
+
// multi-hash block ([F8]).
|
|
3
|
+
//
|
|
4
|
+
// `nciiCases/{caseId}` — the internal operational record linking allegations +
|
|
5
|
+
// requests; minimize-retention (NOT NCMEC, NOT 1-yr). It uses bounded CHILD-LINK
|
|
6
|
+
// ROWS, never unbounded root arrays. Locked invariant [H7]: an NCII case NEVER
|
|
7
|
+
// "reclassifies to CSAM" — a linked child-safety case independently owns
|
|
8
|
+
// preservation / CyberTipline / child-safety account actions; child-safety
|
|
9
|
+
// linkage can never close/pause/replace/delete the NCII request or its 48h
|
|
10
|
+
// deadline.
|
|
11
|
+
//
|
|
12
|
+
// Every shape here is transcribed verbatim from docs/code_changes_needed/
|
|
13
|
+
// trust-and-safety/IMPLEMENTATION_PLAN.md Appendix A §A11 (3) + [F8] — no invented
|
|
14
|
+
// values, no placeholders.
|
|
15
|
+
//
|
|
16
|
+
// SHARED enums come from ../safety/foundation.js (the single source for every
|
|
17
|
+
// cross-cluster enum); they are NEVER redefined here. This cluster IMPORTS
|
|
18
|
+
// NciiInternalStatusSchema, NciiChildSafetyLinkStatusSchema, and
|
|
19
|
+
// NciiChildSafetyCrossoverSchema.
|
|
20
|
+
//
|
|
21
|
+
// Collection note: this cluster introduces a NEW Firestore collection plus child
|
|
22
|
+
// subcollections (allegationLinks / requestLinks / removalActions / blockedHashes
|
|
23
|
+
// — AND `uploaderNotices`, whose schema NciiUploaderNoticeV1 is OWNED BY THE
|
|
24
|
+
// REMOVAL CLUSTER, not authored here; the orchestrator binds it). Wiring
|
|
25
|
+
// collections.ts / path-builders.ts / registry.ts is deferred to the app leg; the
|
|
26
|
+
// doc-id shapes are documented on each schema below.
|
|
27
|
+
import { z } from 'zod';
|
|
28
|
+
import { NciiInternalStatusSchema, NciiChildSafetyLinkStatusSchema, NciiChildSafetyCrossoverSchema, } from '../safety/foundation.js';
|
|
29
|
+
// ===========================================================================
|
|
30
|
+
// §A11 (3) — nciiCases/{caseId}
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
/** Case lane — adult NCII vs likeness/depiction. */
|
|
33
|
+
export const NciiCaseLaneSchema = z.enum(['ncii', 'likeness']);
|
|
34
|
+
/** NON-AUTHORITATIVE projection of the durable NciiAppealV1 (the
|
|
35
|
+
* `uploaderRemovalAppeal` only) — derived from the appeal's latest decision; the
|
|
36
|
+
* appeal record, not this field, is the source of truth ([H-09]). Only
|
|
37
|
+
* `nciiAppealReviewer` may drive 'granted'/reinstate. */
|
|
38
|
+
export const NciiCaseAppealStateSchema = z.enum([
|
|
39
|
+
'none',
|
|
40
|
+
'submitted',
|
|
41
|
+
'underReview',
|
|
42
|
+
'granted',
|
|
43
|
+
'denied',
|
|
44
|
+
]);
|
|
45
|
+
/** `nciiCases/{caseId}` — the operational record; minimize-retention; child-link
|
|
46
|
+
* rows, never unbounded root arrays. Doc id `caseId` is a deterministic/assigned
|
|
47
|
+
* id (z.string().min(1)). NO case-level `fileDeleteAfter` [M3]: a single
|
|
48
|
+
* case-level timestamp could wrongly override a LATER-linked request, so each
|
|
49
|
+
* evidence row owns its own `deleteAfter` and each request owns its own
|
|
50
|
+
* PII/status/token schedule. */
|
|
51
|
+
export const NciiCaseV1Schema = z.object({
|
|
52
|
+
schemaVersion: z.literal(1),
|
|
53
|
+
caseId: z.string().min(1),
|
|
54
|
+
revision: z.number(),
|
|
55
|
+
lane: NciiCaseLaneSchema,
|
|
56
|
+
// [H7] internal operational case status
|
|
57
|
+
internalStatus: NciiInternalStatusSchema,
|
|
58
|
+
// [H7] child-safety linkage status
|
|
59
|
+
childSafetyLinkStatus: NciiChildSafetyLinkStatusSchema,
|
|
60
|
+
// [F4] the possible-minor assessment; childSafetyCaseId lives HERE ([H7], one canonical place)
|
|
61
|
+
crossover: NciiChildSafetyCrossoverSchema,
|
|
62
|
+
// OPTIONAL labeled repairable PROJECTION of crossover.childSafetyCaseId — never the source of truth
|
|
63
|
+
childSafetyCaseId: z.string().min(1).optional(),
|
|
64
|
+
// [H-09] NON-AUTHORITATIVE projection of the durable NciiAppealV1 (uploaderRemovalAppeal ONLY)
|
|
65
|
+
appealState: NciiCaseAppealStateSchema,
|
|
66
|
+
// NON-AUTHORITATIVE projection of the minimum active request monitor ([H4]); source of truth =
|
|
67
|
+
// safetySlaMonitors/{requestId}__nciiRemovalDeadline
|
|
68
|
+
nciiRemovalDeadlineAt: z.number().optional(),
|
|
69
|
+
createdAt: z.number(),
|
|
70
|
+
updatedAt: z.number(),
|
|
71
|
+
}).strict();
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// §A11 (3) — child-link rows (bounded; NEVER root arrays)
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
/** `nciiCases/{caseId}/allegationLinks/{allegationId}` — links an allegation to
|
|
76
|
+
* the case. Doc id is the `allegationId`. */
|
|
77
|
+
export const NciiCaseAllegationLinkV1Schema = z.object({
|
|
78
|
+
allegationId: z.string().min(1),
|
|
79
|
+
linkedAt: z.number(),
|
|
80
|
+
linkedByUid: z.string().min(1),
|
|
81
|
+
}).strict();
|
|
82
|
+
/** `nciiCases/{caseId}/requestLinks/{requestId}` — links a statutory request to
|
|
83
|
+
* the case. Doc id is the `requestId`. */
|
|
84
|
+
export const NciiCaseRequestLinkV1Schema = z.object({
|
|
85
|
+
requestId: z.string().min(1),
|
|
86
|
+
linkedAt: z.number(),
|
|
87
|
+
linkedByUid: z.string().min(1),
|
|
88
|
+
}).strict();
|
|
89
|
+
/** Removal-action method on a `removalActions` row. */
|
|
90
|
+
export const NciiCaseRemovalActionMethodSchema = z.enum(['tombstone', 'accountAction', 'assetBlock']);
|
|
91
|
+
/** `nciiCases/{caseId}/removalActions/{actionId}` — append-only removal-action
|
|
92
|
+
* row. Doc id is the `actionId`. */
|
|
93
|
+
export const NciiCaseRemovalActionV1Schema = z.object({
|
|
94
|
+
at: z.number(),
|
|
95
|
+
actorId: z.string().min(1),
|
|
96
|
+
surface: z.string(),
|
|
97
|
+
targetItemType: z.string(),
|
|
98
|
+
targetItemId: z.string().min(1),
|
|
99
|
+
method: NciiCaseRemovalActionMethodSchema,
|
|
100
|
+
result: z.string(),
|
|
101
|
+
}).strict();
|
|
102
|
+
// ===========================================================================
|
|
103
|
+
// §A11 (4) [F8] — nciiCases/{caseId}/blockedHashes/{hashId} (multi-hash block;
|
|
104
|
+
// exact-hash blocks only; replaces the singular `reUploadBlock`)
|
|
105
|
+
// ===========================================================================
|
|
106
|
+
/** Provenance of a blocked exact hash. Transformed / non-identical content is
|
|
107
|
+
* NEVER auto-claimed identical. */
|
|
108
|
+
export const NciiBlockedHashSourceSchema = z.enum([
|
|
109
|
+
'requestEvidence',
|
|
110
|
+
'platformOriginal',
|
|
111
|
+
'platformCopy',
|
|
112
|
+
'knownIdenticalCopy',
|
|
113
|
+
]);
|
|
114
|
+
/** Blocked-hash lifecycle. Reversal is restricted + audited; adult NCII hashes do
|
|
115
|
+
* NOT enter the CSAM hash system unless child-safety criteria independently
|
|
116
|
+
* apply. */
|
|
117
|
+
export const NciiBlockedHashStatusSchema = z.enum(['active', 'reversed']);
|
|
118
|
+
/** `nciiCases/{caseId}/blockedHashes/{hashId}` [F8] — exact-hash block. Doc id is
|
|
119
|
+
* the `hashId`. */
|
|
120
|
+
export const NciiBlockedHashV1Schema = z.object({
|
|
121
|
+
hashId: z.string().min(1),
|
|
122
|
+
algorithm: z.literal('sha256'),
|
|
123
|
+
digest: z.string().min(1),
|
|
124
|
+
source: NciiBlockedHashSourceSchema,
|
|
125
|
+
createdAt: z.number(),
|
|
126
|
+
createdByUid: z.string().min(1),
|
|
127
|
+
status: NciiBlockedHashStatusSchema,
|
|
128
|
+
reversedAt: z.number().optional(),
|
|
129
|
+
reversedByUid: z.string().min(1).optional(),
|
|
130
|
+
reversalReason: z.string().optional(),
|
|
131
|
+
}).strict();
|
|
132
|
+
//# sourceMappingURL=cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cases.js","sourceRoot":"","sources":["../../../src/doc-schemas/ncii/cases.ts"],"names":[],"mappings":"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"}
|