Major-version release. Drops client-side prompt redaction. The
ArcVelvet arcIngest server is now the manifest-redaction authority
and the in-flight prompt-moderation gate. The node's job is to send
plaintext + the creator's opt-in flag; the server does the rest.
Wire contract changes (generation assertion):
workflow_prompt Always PLAINTEXT. Server walks the same
text-encoder catch-all pattern this node
uses for extraction; when
include_prompt_text=false (default), the
server replaces text-encoder text values
with [REDACTED:sha256:<hex>] envelopes
BEFORE signing the manifest.
promptTextForModeration NEW field. Concatenated plaintext from
text-encoder nodes, joined by '\n'.
Server scans via OpenAI moderation
(omni-moderation-latest, 8s timeout,
fail-closed). On pass: corpus is
DISCARDED in flight, never persists. On
a sexual/minors flag: preserved in a
sealed minor_safety_escalations doc the
server's operator handles via NCMEC
handoff pipeline. Server strips this
field from the generation assertion
BEFORE signing — it never reaches the
public C2PA manifest.
include_prompt_text Creator opt-in BOOLEAN (false by default).
true → server embeds plaintext
workflow_prompt in the signed manifest.
false → server redacts text-encoder text
values into envelopes before signing.
redacted_prompt No longer set by the node. Server sets it
based on include_prompt_text and writes
into the manifest assertion.
Removed (client-side redaction code retired):
LOCKED_CATCHALL_PATTERN, DEFAULT_TEXT_INPUT_FIELDS_LOWER (renamed
to TEXTENCODE_CATCHALL / TEXT_INPUT_FIELDS_LOWER — now used for
EXTRACTION only, not transformation)
_REDACTED_PREFIX, _REDACTED_SUFFIX
_load_text_encoder_patterns, _class_type_matches,
_redact_string_value, _redact_prompt_text
hashlib import (no longer needed on node side)
Added:
_is_textencode_node, _is_text_field — same walk semantics the
server's promptModeration.ts uses, kept in lockstep so the corpus
the node sends is byte-identical to what the server would extract
from workflow_prompt on its own.
_extract_prompt_text_for_moderation — replaces _redact_prompt_text.
Why server-side redaction (over client-side):
A single canonical redaction authority avoids the trust gap where
each node version's local walk can drift from the server's
expectation. The walks are pinned in lockstep (substring "textencode"
catch-all on class_type + /text|prompt/i field-name match) so a
v1.0.0 node sending plaintext produces the same moderation corpus
the server would extract on its own.
config example update:
arc_config.example.json no longer accepts text_encoder_patterns
(server handles redaction; node-side patterns have no effect).
api_key placeholder updated to point at the Credentials tab on
arcvelvet.com instead of the old arc-issue-key.mjs operator script.
Inline _comment_v1_0_0_note explains the v1.0.0 cutover for users
upgrading from a previous version.
README privacy section rewritten:
Status line bumped to v1.0.0.
Plain-English description of the in-flight moderation + discard
posture, the include_prompt_text creator opt-in, what happens on
a refusal, and why server-side redaction is the right authority.
Server side compatibility:
Operator confirmed server arcIngest deployed revision arcingest-
00010-yeg (today) carries: redactPromptForManifest, strip of
promptTextForModeration before sign, firedCategories observability.
arcVendorSign symmetric leak fix committed server-side but operator
is gating PyPI publish on that deploy reaching a new revision via
gcloud verification. Pre-1.0.0 nodes (no include_prompt_text field)
are handled by the server's Case-2 branch: workflow_prompt is left
untouched, the node's redacted_prompt is preserved.
Files:
README.md +/- privacy section rewrite + status
arc_config.example.json remove text_encoder_patterns + add
v1.0.0 upgrade note
nodes/arc_save.py remove client-side redaction code;
add extraction helper; update
generation assertion builder; update
save() body
pyproject.toml version 0.1.0 → 1.0.0; description
updated to mention server-side
moderation
PyPI publish driven by repository operator, not this commit.
7 lines
837 B
JSON
7 lines
837 B
JSON
{
|
|
"_comment_api_key": "Copy this file to arc_config.json and paste the plaintext key from the Credentials tab on arcvelvet.com. arc_config.json is gitignored. NEVER share, screenshot, or zip-with-share this file once populated — it holds a live API credential.",
|
|
"api_key": "arc_live_REPLACE_WITH_YOUR_KEY_FROM_arcvelvet.com_CREDENTIALS_TAB",
|
|
|
|
"_comment_v1_0_0_note": "v1.0.0 cutover: the previous 'text_encoder_patterns' field is no longer honored — the server is now the manifest-redaction authority and uses a fixed catch-all walk ('textencode' substring + text/prompt field-name match) identical to the node's extraction walk. There is nothing to configure on the node side for prompt handling. Delete arc_config.json's text_encoder_patterns field if upgrading from a previous version; the node will ignore it silently."
|
|
}
|