RC-4 nach umfangreichen Updates
release-tag / release-image (push) Successful in 6m37s

This commit is contained in:
2026-07-21 16:28:24 +02:00
parent 52c1c204ff
commit 862f86dc3e
18 changed files with 558 additions and 51 deletions
+20 -13
View File
@@ -71,10 +71,14 @@ type ParseOptions struct {
}
var Presets = map[string]Preset{
"no-ai": {ID: "no-ai", Extent: "none", Review: "editorial"},
"research": {ID: "research", Extent: "assisted", Activities: []string{"research"}, Review: "editorial"},
"summary": {ID: "summary", Extent: "assisted", Activities: []string{"summarisation"}, Review: "editorial"},
"full": {ID: "full", Extent: "full", Activities: []string{"generation"}, Review: "editorial"},
// Human review is deliberately not presumed by presets. Under Article 50(4)
// AI Act, substantive human review/editorial control can affect whether
// certain public-interest text must be labelled. The factual review process
// must therefore be selected explicitly by the publisher.
"no-ai": {ID: "no-ai", Extent: "none", Review: "none"},
"research": {ID: "research", Extent: "assisted", Activities: []string{"research"}, Review: "none"},
"summary": {ID: "summary", Extent: "assisted", Activities: []string{"summarisation"}, Review: "none"},
"full": {ID: "full", Extent: "full", Activities: []string{"generation"}, Review: "none"},
}
var validExtents = map[string]bool{"none": true, "assisted": true, "partial": true, "mostly": true, "full": true}
@@ -134,7 +138,8 @@ func NewFromQueryWithOptions(values url.Values, contextURL string, options Parse
extent = "assisted"
}
if review == "" {
review = "editorial"
// Do not infer a legally relevant human-review process from AI usage alone.
review = "none"
}
assurance := clean(values.Get("assurance"), 32)
if assurance == "" {
@@ -150,11 +155,8 @@ func NewFromQueryWithOptions(values url.Values, contextURL string, options Parse
}
componentReview := clean(values.Get(name+"Review"), 24)
if componentReview == "" {
if componentExtent == "none" {
componentReview = "none"
} else {
componentReview = "editorial"
}
// Human review must be stated explicitly; never infer editorial control.
componentReview = "none"
}
componentActivities := splitCSV(values.Get(name + "Activities"))
if len(componentActivities) == 0 {
@@ -252,9 +254,14 @@ func Validate(d Declaration) error {
problems = append(problems, "declaredAt must be RFC3339")
}
}
if d.EditorialResponsibility != nil && d.EditorialResponsibility.URL != "" {
if u, err := url.ParseRequestURI(d.EditorialResponsibility.URL); err != nil || u.Scheme == "" || u.Host == "" {
problems = append(problems, "editorialResponsibility.url must be an absolute URL")
if d.EditorialResponsibility != nil {
if strings.TrimSpace(d.EditorialResponsibility.Name) == "" {
problems = append(problems, "editorialResponsibility.name is required when editorialResponsibility is present")
}
if d.EditorialResponsibility.URL != "" {
if u, err := url.ParseRequestURI(d.EditorialResponsibility.URL); err != nil || u.Scheme == "" || u.Host == "" {
problems = append(problems, "editorialResponsibility.url must be an absolute URL")
}
}
}
for name, c := range d.Components {