This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user