사용 방법
- 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
- 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
- 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/sshvarzman-salesforce/claude-skills --skill handling-locked-standard-objects시작 전 확인
- 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
- 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.
Handling Locked Standard Objects (custom fields that never materialize)
The trap
Some standard industry / Financial Services Cloud objects — confirmed on the standard `Claim` object (KeyPrefix 0Zk) in the CommericalDemos org — are structurally locked: you can create custom fields on them through every normal channel and get success every time, but the column never physically exists.
- A
CustomFieldmetadata deploy returnssuccess: true. - A Tooling API
POSTto/sobjects/CustomFieldreturnscreated: true. EntityDefinition.IsCustomizablereportstrue.- …and yet the field is invisible to SOQL (
No such column), to REST describe, and to ApexSchema.getGlobalDescribe().get('Claim').getDescribe().fields.getMap()— a field "created" seconds earlier returnsfalsefrom.containsKey(...).
This is structural (a locked managed/standard object), not a propagation delay or cache staleness. Waiting does not fix it. The "created" field records are orphaned metadata no-ops — harmless, but never queryable.
Detect it before you design around it
Don't trust the deploy's success:true. Prove the column exists at runtime with Apex `getGlobalDescribe` — this is the authoritative check:
// run via: sf apex run --file check.apex --target-org <org>
Map<String, Schema.SObjectField> f =
Schema.getGlobalDescribe().get('Claim').getDescribe().fields.getMap();
System.debug('HAS FIELD: ' + f.containsKey('provider_name__c')); // false on a locked objectIf this prints false for a field you just deployed successfully, the object is locked. A SOQL smoke test on the field (SELECT Provider_Name__c FROM Claim LIMIT 1) failing with No such column corroborates it.
The workaround: structured lines in a standard long-text field
Since you can't add columns, pack the structured data into an existing standard long-text field (Claim.Summary, 32,000 chars) as delimited Key: Value lines, and parse them back out in the prompt template / flow:
Provider: Bright Smile Dental
Service Date: 2026-07-12
Referral Required: No
Referral On File: No
Details: Dental claim for a crown replacement. Currently under review.- Write side (system-context create flow): build the block with a formula using
BR()between lines (seebuilding-system-context-agent-data-flows), assign toSummary. - Read side (flex prompt template): instruct the model to parse
Provider:/Service Date:/Referral Required:/Referral On File:/Details:out of theSummarytext into whatever sections the customer sees. The template does the parsing — no custom fields required. - Use only standard createable/queryable fields otherwise: on
Claimthose areName,AccountId,ClaimType,Status,ClaimReason,EstimatedAmount,Summary,PolicyNumberId(all confirmed queryable at runtime).
When you hit a new object
- Deploy/create the field as normal.
- Immediately run the `getGlobalDescribe` Apex check. If
true, you're fine — use the field. Iffalse, the object is locked. - If locked: leave the orphaned field record (harmless), switch to the long-text-with-structured-lines design, and note it so nobody re-litigates it.
Gotchas
- `success:true` is a lie here. Deploy/Tooling success does not mean the column exists. Always confirm with
getGlobalDescribe. - `IsCustomizable=true` is also misleading on these objects — it does not guarantee runtime materialization.
- Not fixable by retry/wait/cache-clear — it's structural. Don't burn time re-deploying.
- Relationships to these objects still work — e.g.
ClaimParticipant(a separate object) links Contact→Claim normally; only custom fields on the locked object itself fail. Model the extra data as a long-text block or on a related object you can customize.




