Field SOP
Field SOP

Give Your AI Content a Legal ID Card: A Labeling Compliance SOP (Explicit + Implicit Labels, Hands-On)

An AI content labeling compliance SOP: four hands-on steps under the labeling Measures + GB 45438 - a three-question scope check -> explicit labels (per-content-type table + platform declaration toggles) -> implicit labels (full c2patool install / manifest.json trainedAlgorithmicMedia / embed-and-verify commands) -> publish and keep records. Five pitfalls: platform re-compression strips metadata / label-stripping tools are unlawful and ineffective / do not hide explicit labels / watermarks are just one implicit form / write labeling duties into outsourcing contracts. Not legal advice.

Published August 17, 20267 min read
<!-- ai-content-labeling-compliance-sop | sop | Give Your AI Content a Legal ID Card: A Labeling Compliance SOP (Explicit + Implicit Labels, Hands-On) -->

China's Measures for Labeling of AI-Generated Synthetic Content has been in force for nearly a year, with mandatory national standard GB 45438 alongside it - yet many creators and teams still operate on "I know I should label, I don't know how." Our previous AI Watermark Arms Race Hotspot covered the red-line risk of label-stripping tools; this SOP covers the correct posture: three steps to give your AI content a compliant ID card - an explicit label users can see, an implicit label machines can read, and a platform declaration that stays on record. Fully actionable; commands come from official documentation.

Scope note: this is a technical workflow plus public regulation summary, not legal advice; for specific scenarios (especially commercial publishing, cross-border distribution) consult a professional. Commands per the official c2patool docs.

1. Step One: Decide Whether Your Content Needs Labeling

The Measures cover AI-generated or synthesized text, images, audio, video, virtual scenes, and other information. A quick three-question self-check:

  1. Who generated it: was the content (in whole or substantial part) generated/synthesized by an AI model, or did AI only fix typos and grammar? The latter generally falls outside labeling scope.
  2. Deep-synthesis situations: face/voice replacement, scene synthesis, immersive scenes and similar deep-synthesis content carry stricter explicit-labeling requirements.
  3. Who publishes it: are you a service provider (platform/tool maker) or a user (an individual/team creating with tools)? Provider obligations are heavier (label + verify); users also have a proactive declaration duty (Article 10).

When in doubt, label - the cost of over-labeling is one line of notice; the cost of missing labels is compliance risk.

2. Step Two: Add the Explicit Label (User-Perceivable)

The explicit label must be directly visible/audible to ordinary users as they consume the content. By content type:

Content typeExplicit label practice (per Article 4 requirements)
TextWritten notice at the start/end of the article (e.g., "This article was AI-assisted"), or a conspicuous notice in the interface
ImageMarking at a conspicuous position on the image
AudioVoice or audio cue notice at the beginning/end
VideoConspicuous marking on the opening screen

Practical points: put the notice conspicuously at the start or end, not buried in paragraph three; use the publishing platform's built-in "AI-generated" declaration toggle (major platforms provide one per the Measures) - the platform attaches a unified label, which is steadier than pasting your own line.

3. Step Three: Add the Implicit Label (Machine-Readable)

The implicit label goes into file metadata - the channel platforms verify and you prove provenance with. The handiest tool for images/videos/documents is the official C2PA CLI c2patool (contentauth/c2pa-rs, Rust, actively maintained):

1) Install (any one):

bash
# macOS
brew install c2patool
# Generic (needs a Rust toolchain)
cargo install c2patool
# Or download a prebuilt binary from GitHub Releases

2) Write the manifest definition (manifest.json, declaring trained-algorithmic media):

json
{
  "declare": {
    "c2pa.created": "auto",
    "c2pa.actions": [
      { "action": "c2pa.created", "digitalSourceType": "trainedAlgorithmicMedia" }
    ]
  },
  "vendor": "your-team",
  "claim_generator": "your-workflow/1.0"
}

Fields per the official manifest docs; trainedAlgorithmicMedia is the IPTC digital source type standard value for "AI-generated media."

3) Embed and verify:

bash
# Embed: read the original image, add the manifest, output a labeled file
c2patool image.jpg -m manifest.json -o image_labeled.jpg

# Verify: confirm the label is present and the signature valid
c2patool image_labeled.jpg -d

The -d flag prints the detailed manifest report; confirm the digitalSourceType assertion landed and the implicit label is done. Wrap in a shell loop for batches; teams building their own AI services should go further and watermark model outputs (see our SynthID-Text Teardown).

4. Step Four: Publish and Keep Records

  1. Platform declaration: tick the platform's "AI-generated" declaration when publishing (it pairs with the explicit label; the platform verifies the metadata implicit label).
  2. Keep evidence: retain the manifest file and a screenshot of the c2patool -d output; for outsourcing/collaboration, write labeling cooperation duties into the delivery agreement.
  3. Verify incoming work: run c2patool <file> -d on outsourced manuscripts to look for AI-source assertions; cross-check with statistical detection (see our AI Content Detector Tools Compared).

5. Five Common Pitfalls

  1. Platform re-compression strips metadata: transcoding on WeChat/Weibo distribution chains can strip C2PA data. The explicit label (the line baked into the image) is the final backstop - don't do just one of the two.
  2. Never "clean" content with label-stripping tools before publishing: Article 10 forbids maliciously deleting, altering, fabricating, or concealing labels - and forbids providing such tools. Stripping is not only unlawful; technically it doesn't even work (statistical watermark residue remains).
  3. Explicit label hidden too deep: end-of-article fine print, a 4px corner mark, or 0.5 seconds at the video's end do not count as "conspicuous." Judge by "visible at first glance."
  4. Assuming a watermark is enough: watermarks are only one encouraged form of implicit label; explicit labels and metadata labels are independent obligations - none substitutes for another.
  5. No written terms for outsourced work: if the contractor used AI but didn't label, responsibility gets murky. Put "AI-use disclosure + labeling cooperation" clauses in the contract and verify at delivery.

Frequently Asked Questions

Q1: I only used AI to polish my own writing - do I need to label? A1: Generally no - the Measures target AI-generated synthetic content; pure assistance (typos, grammar) usually doesn't qualify. The test is "whether a substantial part was generated by AI." When unsure, add a line of "AI-assisted" notice; over-labeling is harmless.

Q2: Can I choose between explicit and implicit labels? A2: No - they are parallel obligations. The explicit label is for humans (text/image/audio notice); the implicit label is for machines (metadata/watermarks). Implicit-only leaves users uninformed; explicit-only breaks platform verification and provenance chains.

Q3: Can a c2patool-embedded label be stripped? A3: The metadata segment can be peeled off (open-source tools have demonstrated this), but C2PA also has "soft binding" mechanisms that chain credentials to the content itself - stripping is not clearing. For compliance, the point is: your labeling fulfills your duty; someone else stripping it is their legal risk.

Q4: Do individual creators / self-media fall under these Measures? A4: Yes. Users publishing AI-generated content via platforms should proactively declare and use platform labeling functions (Article 10); platforms carry verification and supplementary-labeling duties. The easiest routine for individual authors: platform declaration toggle + explicit notice line, plus c2patool implicit labels for images.

Q5: Does publishing abroad follow the Chinese standard? A5: Services reaching mainland audiences fall under the Measures; the EU AI Act has its own transparency duties. C2PA is an international standard format - embed once, usable across jurisdictions. For cross-border compliance boundaries, consult a professional.


References

  • CAC and three other departments: Measures for Labeling of AI-Generated Synthetic Content (published 2025-03-14, effective 2025-09-01; Article 3 explicit/implicit definitions, Article 4 explicit requirements, Article 5 implicit requirements, Article 10 proactive declaration and no-stripping clause)
  • Mandatory national standard: GB 45438 (AI-generated synthetic content labeling)
  • GitHub: contentauth/c2pa-rs (official c2patool docs: -m embed, -d detailed report, --create trainedAlgorithmicMedia, manifest definition)
  • IPTC NewsCodes: digitalSourceType (trainedAlgorithmicMedia standard value)
  • This site: AI Watermark Arms Race Hotspot | SynthID-Text Teardown | AI Content Detector Tools Compared

Compiled from public regulations and official tool documentation (2026-08-17), not legal advice; commands and fields per the official c2patool docs.

This article is AI-assisted and human-edited. Last updated: 2026-08-17

FAQ

I only used AI to polish my own writing - do I need to label?
Generally no - the Measures target AI-generated synthetic content; pure assistance (typos, grammar) usually doesn't qualify. The test is "whether a substantial part was generated by AI." When unsure, add a line of "AI-assisted" notice; over-labeling is harmless.
Can I choose between explicit and implicit labels?
No - they are parallel obligations. The explicit label is for humans (text/image/audio notice); the implicit label is for machines (metadata/watermarks). Implicit-only leaves users uninformed; explicit-only breaks platform verification and provenance chains.
Can a c2patool-embedded label be stripped?
The metadata segment can be peeled off (open-source tools have demonstrated this), but C2PA also has "soft binding" mechanisms that chain credentials to the content itself - stripping is not clearing. For compliance, the point is: your labeling fulfills your duty; someone else stripping it is their legal risk.
Do individual creators / self-media fall under these Measures?
Yes. Users publishing AI-generated content via platforms should proactively declare and use platform labeling functions (Article 10); platforms carry verification and supplementary-labeling duties. The easiest routine for individual authors: platform declaration toggle + explicit notice line, plus c2patool implicit labels for images.
Does publishing abroad follow the Chinese standard?
Services reaching mainland audiences fall under the Measures; the EU AI Act has its own transparency duties. C2PA is an international standard format - embed once, usable across jurisdictions. For cross-border compliance boundaries, consult a professional.

Related

Field SOP

428B Weights Are Out, Budget 8 H100s: M3.1 Flash Local Deploy

A deployment log for M3.1 Flash (428B, 23B active). Cold water first: there is no consumer or single-GPU recipe anywhere official - the smallest validated tiers are 4x Blackwell (B200/B300/GB200/GB300, TP4), 4x AMD MI355X (TP4), or a full node of 8x H100/H200 (TP8, FP8 path). Weights come from HF or ModelScope (public, not gated); three size calibers coexist: community-count 252.4GB over 48 shards plus a 2.3GB DSpark head, and the vLLM recipe listing NVFP4 at 285GB, MXFP4 at 293GB, FP8 at 533GB; there is no official quantized repo. vLLM needs 0.33.0 or newer (absent from PyPI on release day, so use the vllm/vllm-openai:minimax-m31-flash Docker image or nightly); three official commands transcribed verbatim - H100/H200 TP8, GB200 TP4, MI355X TP4 - all forcing --block-size 128 and --disable-hybrid-kv-cache-manager (omit it and you get No common block size for 16); 1M context opens via --max-model-len (the Hopper sample caps at 262144). SGLang is not merged to main yet (Blackwell needs the MSA kernel at a pinned commit plus nvcc 13.4 minimum - cu130 does not count). The memory ledger: BF16 at roughly 856GB is an inference, not an official figure; 23B active lowers compute, not the VRAM floor - all 428B experts must stay resident, which is exactly why consumer cards are out; total KV cache for 1M context is unpublished. Domestic compute rides FlagOS Day-0 across nine chips (Huawei Ascend included, via SGLang-plugin-FL), numbers flagged as FlagOS official. Thirteen official error notes collected with fixes: HugeTLB 560GiB, B200 OOM, parser spelling, and more. License: MiniMax Community License, commercial attribution plus the 20-million-dollar threshold. One line of reality: 428B weights are out - budget 8 H100s.

Oct 24, 20269 min read
Field SOP

Nemotron 3.5 Bolt Local Deployment: 74B on a 24GB Card

NVIDIA released Nemotron 3.5 Bolt 74B-A9B 24GB on October 15, 2026: a compression of the 120B Super VL via Star Elastic budget-conditioned architecture search (expert top-K down from 22 to 9, distilled recovery training over 120B tokens), on a hybrid Mamba-2 and Transformer architecture. The quantization plan is the story - the expert layers that dominate the weights drop to IQ2_XXS at 2.0625 bits per element (about 19GB), Mamba linear layers use NVFP4, and lm_head, embeddings, and attention stay at Q8_0, landing the full model at 22-24GB with accuracy recovered through quantization-aware distillation from the compression stage onward. Four deployment routes, with commands: Ollama (supported since 0.40.5, ollama run nemotron-3.5-bolt, a 25GB download, verify 100 percent GPU via ollama ps); Unsloth (UD-IQ2_XXS about 22GB, UD-IQ1_M about 20.3GB, ctx from a conservative 4096); llama.cpp official recipes (builds after October 15 to recognize nemotron_h_moe; the 28GB recipe runs 65K context with 8-bit KV and 6 draft tokens, the 32GB recipe reaches 262K; llama-server defaults to port 9931 since b11521); and vLLM (Blackwell SM120 with the LiLiCorr drafter for multi-user serving). Two context starting points coexist: 16K-32K for bare weights, 4K for Unsloth whose default drafter eats another 1-2GB. Eight troubleshooting entries cover OOM context cuts, layers spilling to system RAM, the missing --mmproj flag, and the shared 16384 max_tokens budget. OpenMDW-1.1 grants free unrestricted commercial use, leaves outputs unencumbered, requires notices only on redistribution, and carries a patent-retaliation clause. Vendor-reported: GPQA Diamond 86.4, Terminal-Bench 2.1 at 51.0, PinchBench first in class (83.99 TPS on RTX Spark; no official consumer-card figure). The 4GB Bolt E4B followed on October 23.

Oct 23, 20268 min read
Field SOP

Xing4.0-29B-Intent Local Deploy: 4B Active, Which Command?

Getting Xing4.0-29B-Intent running hinges on a detail that trips most people up: the official deployment instructions do not live in the intent repository but in the base model repository. The intent README only says to replace the model path with the Xing4.0-29B-Intent weights and set --served-model-name to Xing4.0-29B-Intent, so the full vLLM and SGLang launch commands must be taken from the Xing4.0-29B-A4B base repo. Several flags are hard requirements: --trust-remote-code is mandatory because model_type is the in-house xing4_0 architecture, neither llama nor qwen; --tensor-parallel-size 2 implies at least two cards; --max-model-len 262144 matches the 256K context; --reasoning-parser xing4_0 and --tool-call-parser xing4_0 supply the matching parsers; --speculative-config uses the mtp method; and --gpu-memory-utilization 0.90 with --max-num-seqs 4 is the official example ratio. The weights ship as 41 safetensors shards totaling 62.43 GB, and the only official quantizations are FP8 (33.17 GB, e4m3) and GGUF (a single IQ4_NL file at 17.75 GB) - there is no AWQ, GPTQ, or INT8 safetensors. Minimum VRAM is not published at all; the official line is to configure GPU memory, parallelism, and context length for your environment. What the base repo does spell out: bfloat16 is required because the mHC path errors out on FP16 or quantized weights, --pipeline-parallel-size greater than 1 is not yet supported, the CUDA mHC path needs tilelang installed, and the host needs Docker 24.0 or newer with driver 535 or newer. The Ascend route explicitly wants 910B2 NPUs with at least two cards, with three official quay.io images (none of which bundle the weights). Consumer and CPU paths appear only in the base llama.cpp docs: int4 weights quantized with IQ4_NL come to about 19 GB and fit on a single consumer GPU, with an RTX 3090 24 GB as the example. The SDK is just an httpx HTTP client and is not on PyPI, and structured output comes in two layers - the model's native category plus args array, and SDK-guided JSON Schema constraints through vLLM response_format. The license is Apache-2.0, yet the weight side has no standalone LICENSE file, the repository LICENSE is an unfilled placeholder template, and the original terms of the 61 upstream datasets still need checking.

Oct 22, 20269 min read