Screenplay generation and proxy generator hardening fixes - #2417
#2417Screenplay generation and proxy generator hardening fixes#2417woksin wants to merge 6 commits intomainCratis/Arc:mainfrom claude/github-issues-triage-v3oqufCratis/Arc:claude/github-issues-triage-v3oqufCopy head branch name to clipboard
Conversation
#2381) The role extraction only inspected named arguments, so the idiomatic [Roles("...")] attribute — which sets Roles via a params string[] constructor — yielded no roles. Also read the constructor argument array so both the constructor and named-argument forms produce roles. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
) Generator output emitted under obj/ contributes partial members to a slice's namespace but says nothing about where the slice's source or its screens live. Excluding generated files from folder attribution and the project-root vote removes false SP0025 diagnostics and stops screen discovery from scanning build-output trees. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
…ers (#2398) Constraint names written with separators (kebab-case is idiomatic for Chronicle constraint names) were sanitized by deleting the separators, producing run-together all-lowercase identifiers. Treat separators as word boundaries and PascalCase the segments, so 'unique-timesheet-start' becomes 'UniqueTimesheetStart'. Names that carry no separator are left untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
The WithMessage(_ => Messages.Constant) form - a lambda returning a compile-time constant - was rejected as having no constant value, dropping every message in applications that keep messages behind constants. Read the lambda body's constant value, so both the constant and literal lambda forms are recovered. Genuinely computed messages still have no constant and are reported as before. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
- Qualify [Authorize] in RoleSecuredTypes spec to resolve CS0104 against the two AuthorizeAttribute types in scope - Move static MessageExpression ahead of instance members (SA1204) - Combine adjacent Where clauses in SliceDirectories (MA0029/RCS1112) - Chain StringBuilder.Append calls in ScreenplayNaming (RCS1201) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
Concepts referenced solely from inside a complex record or a read-model property were dropped from a generated Screenplay document, taking their validation rules and PII marking with them. The type registry now walks the members of every record it names, cycle-safe and in ordinal order, so a concept is declared wherever it was reached from. A record an artifact carries has no declaration construct in the grammar, so its shape is still lost - that loss is now reported with a new Information diagnostic (SP0035) naming the record, rather than dropped silently. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B1mrPcRT2GYjRxrx4T1p8N
| foreach (var property in type.DeclaredProperties()) | ||
| { | ||
| var carried = UnderlyingTypes.Of(property.Type); | ||
| var name = carried.ToDisplayString(); | ||
|
|
||
| found.TryAdd(name, carried); | ||
|
|
||
| if (IsRecord(carried) && walked.Add(name)) | ||
| { | ||
| Walk(carried, found, walked); | ||
| } | ||
| } |
|
Closing this as superseded, with its unique commit preserved rather than discarded. Four of the five commits here are already implemented in #2418, in the same files, so the two cannot both merge cleanly:
#2381 has been extracted to #2419, rebased onto One correction worth carrying over. The Also, the description carries an AI-attribution footer, which the repository's PR guidance asks not to include. Nothing is lost by closing this — the branch is kept, four commits are superseded by tested equivalents, and the fifth is open as #2419. |
Summary
A batch of small, well-scoped fixes from an open-issue triage sweep. Each is an independent commit.
Fixed
[Roles("...")]constructor form, not only the named-argument form (Proxy generator drops roles declared via [Roles("...")] constructor form #2381)obj//bin/as slice source folders, removing falseSP0025diagnostics (Screenplay generation: obj/ generator-output folders pollute slice source-folder attribution (false SP0025) #2395)WithMessage(_ => Constant)lambda forms instead of dropping them asSP0016(Screenplay generation: recover validation messages from WithMessage(_ => Constant) lambdas (SP0016) #2397)🤖 Generated with Claude Code
Generated by Claude Code