SKYHAWK IMMUTABLE EVIDENCE EXTRACTION Purpose: Narrow evidence review for skyhawk_upload_file history gate Generated: 2026-08-31T20:05:40Z Report-ID: 20260831T200540Z-1668444 ===== SOURCE IMMUTABLE REPORT ===== SOURCE_REPORT_ID=20260831T195202Z-1605488 SOURCE_PATH=/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T195202Z-1605488.txt SOURCE_SIZE_BYTES=636252 SOURCE_SHA256=25325823558d80ed3611e0a5caae9c939f02539a5d72fcfbed2f0ceb208707f8 SOURCE_MODIFIED=NO ===== ACTIVE FINISH / SUBMISSION SOURCE ===== 1-SKYHAWK AI DEBUG REPORT 2:Task: Deep read-only reconciliation of Generic Intake upload-history truth 3-Generated: 2026-08-31T19:52:03+00:00 4-Report-ID: 20260831T195202Z-1605488 5-Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-20260831T195202Z-1605488.txt 6-Host: s19522.use2.stableserver.net -- 19-LATEST_MODEL=REPLACEABLE_HANDOFF_ONLY 20-BACKUP_REQUIRED=NO 21- 22-===== ACTUAL REFERENCE BODY READ ===== 23:No syntax errors detected in /tmp/skyhawk-upload-history-deep-audit-20260831T195202Z-1605488/read-references.php 24-RULES_NID=49418 25-RULES_BODY_READ=PASS 26-RULES_BODY_BYTES=56104 27-RULES_BODY_SHA256=b8bfc47aa6415c18669c8e38ddbd21c85adfeb9d218e141474e0ecb7e71d603a -- 56-184-Authoritative current-report URL: https://skyhawk.org/downloads/chatgpt-debug-latest.txt. 57-185- 58-186:The authoritative latest file contains the complete current report, not merely a pointer. Each diagnostic run also creates an immutable archive report named with a unique Report-ID, such as /downloads/chatgpt-debug-20260824T164135Z-698130.txt. The immutable archive is retained as historical execution evidence, but the AI normally reads the fixed latest URL directly. 59-187- 60:188-Publish atomically. Build the complete report in a temporary file. After the report is finished, move it into the immutable archive filename, then copy that completed archive to a temporary latest filename and atomically move the temporary latest file into /downloads/chatgpt-debug-latest.txt. Never stream a still-changing report directly into either public filename. 61-189- 62-190-The complete report must begin with: 63-191- 64-192-SKYHAWK AI DEBUG REPORT -- 89-220- 90-221-Capture enough evidence to determine the next state, not thousands of irrelevant lines. Use the older A2-to-Windows report-transfer workflow only when Gene actually needs a local file.Debug Evidence Promotion 91-222- 92-223- 93:224-Promote the relevant final evidence automatically. Every diagnostic or test block must finish by placing the evidence that determines the next state into /downloads/chatgpt-debug-latest.txt. Gene must not be required to run a second copy/promote command after the test. 94-225- 95-226:Keep immutable evidence separately. Installation or diagnostic runs continue to create their immutable Report-ID archive. A temporary live-event stream may use its own fixed file while the test is occurring, but when the test produces the evidence needed for the next decision, that evidence must be atomically promoted to chatgpt-debug-latest.txt. 96-227- 97-228-The fixed latest URL is the normal machine handoff. After Gene reports that a command or requested test is complete, the AI should retrieve https://skyhawk.org/downloads/chatgpt-debug-latest.txt itself, force freshness when possible, and validate the contents before asking Gene for output. The immutable archive is fallback evidence, not a routine human relay requirement. -- 145-14-For Reunion source updates, the contributor filename is provenance and presentation metadata, not semantic authority. Acceptance must not require a month, year, Event name, or other business meaning to be encoded in the filename. The workflow determines the target Event; exactly one real PDF and the applicable authorization, duplicate-content, persistence, and public-verification gates determine acceptance. Skyhawk may use a deterministic internal stored path while preserving the original contributor filename. 146-15- A Reunion benefit is initiated by the Association member who accepts responsibility for it. Normal future design requires that member to be authenticated. 147-16- The authenticated Drupal UID is the durable identity. Account email is the authoritative contact value presented from Drupal; a changed email must be verified before becoming authoritative. 148-17: Once responsibility has been established, routine Reunion newsletter/source updates are performed through authenticated Ready Room access. A new Generic Intake token is not required for each update. 149:18- Existing token/request records remain immutable historical evidence of how earlier authority was established. The 2026 A-4 JULY bootstrap remains token-established history. 150:19- Each consequential Reunion update records the executing UID, time, previous current file, resulting current file, and verification outcome. Drupal revision history is preferred where it provides that evidence without another custom tracking subsystem. 151-20- Current Association membership is required to exercise production Reunion authority. Reliable generalized current-member eligibility must use the authoritative membership state after the documented roster reconciliation; it must not be guessed from unrelated data. 152-21- Each durable Reunion Unit has one primary accountable current member and at least one additional current-member continuity contact by the start of the Reunion. Additional authorized helpers may be supported. 153-22- The Reunion Unit persists across successive reunion occurrences. A future reunion is a new occurrence associated with the same durable Unit rather than an overwrite of an earlier reunion occurrence. 154:23- Reunion photographs and historical material are retained and displayed for their historical and sentimental value. Loss of a responsible member does not automatically delete public history. 155-24- If all eligible responsible contacts are lost, the Association determines succession and continued stewardship. 156-25- Existing agreed reminder behavior remains unchanged. Reminders prompt authorized members to maintain their existing Reunion relationship; they do not recreate authority. 157-26- The model should remain reusable for other future member-supported benefits without prematurely constructing a universal custom framework. 158-27-Source-Material Workflow 159-28- 160-29- 161-30: The responsible authenticated member may provide Reunion source material either by uploading one ordinary source document through Drupal core managed_file or by pasting source text directly. 162-31- Uploaded source intake remains format-agnostic. PDF, DOC/DOCX, TXT and other ordinary source documents are not assigned business meaning from their filename or extension. Normal Drupal and hosting safety constraints still apply. 163:32- Pasted text is stored directly as submitted source content. The system does not manufacture a fake text file merely to force pasted material through a file-upload abstraction. 164:33- The submitted source is authoritative input. Parsing or model extraction produces proposed structured facts only. Extraction failure does not invalidate an otherwise preserved source. 165-34- A new self-service Reunion request creates an unpublished Reunion Event draft owned by the authenticated requester. That draft is the durable occurrence identity; later parsing/review updates the same entity rather than creating a duplicate Event. 166-35- General production activation still requires authoritative current-membership eligibility and the required primary/continuity-member relationship. Until the membership-roster reconciliation provides that deterministic contract, creation of a private draft does not itself grant publication/update authority. 167:36- Replacement/update sources reconcile the existing Event. Prior accepted sources and relevant source history remain associated with the same Event. 168--- 169-151-Success, information and error/action-required messages remain 170-152-inline, subdued and aesthetically integrated, but positioned and 171-153-styled so that a user is unlikely to miss required action. Generic 172-154-Drupal messenger popups are not the target UX for these custom 173-155-member-facing workflows. 174-156- 175:157:CURRENT STATE - GENERIC INTAKE SYSTEMProject: Generic Intake SystemStatus: In developmentUltimate goal: A self-service, reusable, aesthetically integrated intake framework that lets authorized nontechnical Ready Room users create purpose-specific public file requests without webmaster assistance. The underlying upload engine remains generic for future uses.Current accepted functionality:Drupal core managed_file owns automatic initial file transfer.Generic file acceptance is proven. Format-specific diagnosis is closed absent contradictory evidence.Token-specific private storage under private://uploads/[token]/ is proven.Finish submission and permanent-file finalization are proven.Reusable token behavior is proven.The current Pixel/Chrome public upload presentation is accepted.The redundant generic Upload title is closed work.Public Drupal status-popup behavior was corrected toward the established inline PageMessage pattern.Accepted request/invitation gate: real Ready Room testing proved explicit recipient routing, request-data persistence, the canonical https://skyhawk.org/upload/{token} invitation, the same stored request instructions in the actual email and public upload page, and on-page Ready Room request confirmation. Accepted by Report-ID 20260830T161100Z-2299062. Current implementation slice: prove the shared Event framework with the real 2026 A-4 Skyhawk Reunion corpus. JULY creates exactly one Event; AUGUST reconciles that same Event; SEPTEMBER reconciles the same Event to the current pre-event state while preserving prior updates. No duplicate Event nodes.Next implementation principle: preserve the proven uploader/finalization engine and evolve the surrounding request-management system. Do not rewrite the working upload path merely to implement the broader framework.Closed work: extension and MIME enumeration, image-versus-video diagnosis, synthetic upload triggering, custom serializer/queue transfer experiments, generic Upload page title, and repeated reproving of accepted core transfer/finalization behavior.Reopen closed work only when: new contradictory functional evidence demonstrates that the accepted behavior is no longer true.Current Agreed Product DecisionsThe Ready Room menu links directly to an Upload Requests dashboard. Individual public requests do not become menu entries.Granular Drupal permissions, assigned to roles, govern creation, management, reassignment, lifecycle actions, viewing submissions, and permanent deletion.Request-specific instructions are entered once and dynamically reused in both the invitation email and public upload page. The live page is authoritative when instructions change.The underlying uploader remains format-agnostic even when a request expects ZIP files, photographs, video, documents, or other material.Public size language uses industry-standard decimal MB where 1 MB equals 1,000,000 bytes, plus the exact comma-separated byte count where useful.The configured limit is per individual file, not the aggregate of multiple files in a submission.Large collections are split among multiple files or ZIP archives rather than reducing original photo or video quality merely to fit a limit.Removal before Finish submission is required. Each file gets a clear individual Remove action rather than Drupal selection checkboxes.The pre-finish manifest shows filename, MB, exact bytes, status, and Remove, plus file count and aggregate size.Resumable transfer is desirable for large files if a maintained Drupal-compatible solution can provide it simply. Do not build a custom resumable-upload platform.SA controls stored/internal filenames for sortable, collision-resistant recovery. Original contributor filenames remain preserved as metadata. Database fields, not filename parsing, remain authoritative for Views.Each request has an immutable human-friendly ID and each Finish submission has a batch identity.Useful provenance is retained, including original/generated filename, request, batch, known source/contributor information, timestamps, size, and relevant supplied metadata.Exact duplicate hashes may be retained for integrity and later duplicate identification, but exact duplicates are not automatically rejected because provenance can differ.The responsible party determines the intended disposition of each request. Receipt and automatic publication are separate concepts.Original files are preserved by default, while storage and retention policy may be revisited if storage becomes a material constraint.ZIP preservation or extraction depends on purpose, permissions, and downstream workflow rather than one universal rule.Copyright remains with whoever legally owns it. Upload does not itself transfer copyright to SA.Contributors should represent, to the best of their knowledge, that they are entitled to provide the material and are not knowingly violating another persons rights.Applicable photo policy grants SA appropriate continuing non-exclusive permission to preserve, reproduce, migrate or convert, adapt for presentation, publish, and use contributed material in Association activities and publications.SA remains the sole arbiter of whether and under what conditions photographs administered or distributed through the SA website are provided or authorized for third-party use, without claiming copyright SA does not own.Known photographer/source and SA credit may both be used publicly as appropriate, while full provenance remains preserved internally.The upload system does not ask contributors to manage future contact requests. SA may forward a legitimate contact request to the known owner/source. The requester is told that no response within the defined period means no permission or contact. Silence is never consent.Photo-oriented requests may support both a batch description and optional per-photo descriptions plus other appropriate configurable metadata.The exact applicable rights/agreement version, request, batch, and acceptance time are retained.The existing photo-contribution workflow is superseded only after the generic framework proves equivalent or better required functionality.Successful submission normally produces one internal summary per completed batch.Requests may generate up to two sensible expiration reminders, but any successful submission cancels outstanding reminder prompting for that request.The system does not automatically nag the contributor. The creator can resend the active request and current dynamically generated instructions.Successful received material is not automatically deleted. Truly abandoned temporary material may be cleaned up conservatively under documented policy.Arbitrary contributed files are treated as untrusted until appropriately reviewed or scanned. Prefer a simple maintained scanning mechanism rather than custom antivirus infrastructure.Desktop, tablet, and mobile are supported where practical. Device parity must not make important functionality unreasonably complex or impossible.After Finish submission, show a meaningful receipt before offering Upload another batch while the request remains active.Errors remain inline and explain what happened, why, and what the contributor should do. Successfully transferred files are not needlessly retransmitted because another file failed.KISS governs implementation.Implementation order: request data model and Ready Room dashboard; shared instructions and email workflow; public manifest/removal/size/receipt/error UX; naming/batch/history/accounting/provenance/hash; permissions/expiration/reminders/lifecycle; then evaluate maintained resumable upload and malware scanning; replace photo-contribute only after parity is proven.Deterministic AI instruction: routine work on this project must begin by rereading the ACTIVE RULES block and this CURRENT STATE block. Deeper historical or diagnostic material is supporting evidence and must not override current accepted truth unless new evidence changes that truth. 176-158-Upload Token System 177-159- 178-160-This is the authoritative reference for the generic public upload-token product implemented in skyhawk_site_fixes. 179-161- -- 193-175-The public page has no redundant generic Upload page title. Its identifying heading is Upload Files: [label]. 194-176-The secret token value is never displayed. 195-177:Selecting files is the upload action. Drupal core managed_file immediately starts AJAX transfer from the file-input change event. 196-178-Successful initial uploads become temporary Drupal managed files under private://uploads/[token]/. 197:179:The final action is Finish submission. 198:180-Skyhawk custom-form results never use Drupal messenger/status popups. Upload/finalization results render inline on the form using the established PageMessageTrait pattern required by Tier-1 Rule 8.3. 199-181- 200-182-Token Lifecycle 201-183- 202-184- -- 207-195- 208-196-Multiple files may be selected. 209-197-Maximum individual file size is 511 MiB (535,822,336 bytes). 210-198-The hosting transport ceiling remains 512 MiB for an HTTP POST, so exceptionally large batches may need to be selected/uploaded separately even though each individual file is legal. 211:199:After Drupal receives temporary managed files, final submission makes them permanent, records each file in skyhawk_upload_file, increments cumulative file accounting, and sends the configured batch notification. 212:200-Completion notifications contain only the files finalized in that batch, not every historical file associated with the token. 213-201- 214-202- 215-203-Administration 216-204- -- 218--- 219-215- 220-216-The old UploadTokenController and upload_token_mobile_fix.js are retired into the timestamped replacement backup rather than destroyed during initial acceptance testing. 221-217- 222:218-Functional acceptance remains pending until the Pixel test verifies: legal multi-file upload, final submission, private storage, history rows, notification, reuse of the same token, explicit revocation, expiry rejection, and oversize rejection. 223-219- 224-220-Current Functional State 225-221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226:222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227-223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228:224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230-226-Current Regression Token 231-227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- -- 237-1- 238-2- 239-3-LOST-D 240-4- 241:5:Current implementation slice: The 2026 A-4 acceptance corpus remains complete on Event 49464 with JULY and AUGUST retained as history and SEPTEMBER current. Reunion self-service source intake and Request a Reunion are installed. The established Ready Room management destination is My Reunion Events; the redundant My Reunions entry is retired. The next consequential boundary is the proof-of-concept keeper handoff: verify the intended primary and continuity member email/account relationships first. Do not rename Event 49464, reassign it, change authoritative account email, establish keeper authority, or send keeper instructions until those identity/email checks pass. 242-6- 243-7- 244-8-Member Communications 245-9-Improve logged-in member communication while protecting personal -- 294-55-raven_journal_index_534.csv is retained as the historical Raven source data. 295-56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- 303-64-Normal Skyhawk command-line work occurs interactively at the A2 prompt. 304-65-On this A2 environment, do not use Bash process substitution such as < <(...) for Skyhawk work. It has repeatedly failed through /dev/fd/*. 305- 306- 307:===== ACTIVE SOURCE HISTORY OWNERS ===== 308:ACTIVE_SKYHAWK_UPLOAD_FILE_SOURCE_HITS=1 309:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.install:177: $schema['skyhawk_upload_file'] = [ 310- 311:===== ACTIVE GENERIC FINISH/PERSISTENCE SOURCE ===== 312-===== FILE: /home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenForm.php ===== 313-SHA256=862ca045c49fdcda6ee0bb4e97630cc25049f4a9ac35433192d40aae858fbf94 314- 315-222- ''; -- 318-225- $items = ''; 319-226- 320-227- foreach ($ready_names as $ready_name) { 321-228- $items .= 322:229- '
  • Ready to submit: ' . 323-230- \Drupal\Component\Utility\Html::escape( 324-231- $ready_name 325-232- ) . 326-233- '
  • '; -- 329-236- $ready_markup = 330-237- '
    ' . 331-238- 'Upload complete.' . 332-239- '' . 333:240: 'These are the files that Finish submission will finalize.' . 334-241- '
    '; 335-242- } 336-243- 337-244- $form['token_identity'] = [ -- 347-254- $form['intro'] = [ 348-255- '#markup' => 349-256- '

    Each file may be up to 511 MiB. ' . 350-257- 'Selecting a file starts its upload. ' . 351:258- 'Wait until its filename says Ready to submit ' . 352--- 353-264- '#markup' => 354-265- '

    ' . 355-266- 'UPLOAD YOUR FILE IN THE BOX IMMEDIATELY BELOW.' . -- 383-294- ], 384-295- ]; 385-296- 386-297- /* 387:298: * Finish belongs directly under the upload widget. 388-299- */ 389-300- $form['actions'] = [ 390-301- '#type' => 'actions', 391-302- '#weight' => 31, 392-303- ]; 393-304- 394:305- $form['actions']['submit'] = [ 395:306- '#type' => 'submit', 396-307- '#value' => 397:308: $this->t('Finish submission'), 398-309- '#button_type' => 'primary', 399-310- '#attributes' => [ 400-311- 'class' => [ 401:312- 'skyhawk-finish-submission', 402-313- ], 403-314- ], 404-315- '#states' => [ 405-316- 'disabled' => [ -- 410-321- ], 411-322- ]; 412-323- 413-324- /* 414:325: * Receipt is local to Finish. 415-326- */ 416-327- $form['page_message'] = 417-328- $this->renderPageMessage(); 418-329- 419-330- $form['page_message']['#weight'] = 32; 420-331- 421-332- /* 422-333- * Still below the upload box, but no longer separating 423:334: * the file widget from Finish submission. 424-335- */ 425-336- $form['request_instructions'] = [ 426-337- '#type' => 'details', 427-338- '#title' => -- 457-394- ); 458-395- } 459-396- } NO_MATCHES ===== SKYHAWK_UPLOAD_FILE SCHEMA / INDEXES ===== 54-182-The debug channel exists to eliminate routine copy/paste between Termux, Windows, Mac, mobile devices, and the AI. 55-183- 56-184-Authoritative current-report URL: https://skyhawk.org/downloads/chatgpt-debug-latest.txt. 57-185- 58:186:The authoritative latest file contains the complete current report, not merely a pointer. Each diagnostic run also creates an immutable archive report named with a unique Report-ID, such as /downloads/chatgpt-debug-20260824T164135Z-698130.txt. The immutable archive is retained as historical execution evidence, but the AI normally reads the fixed latest URL directly. 59-187- 60-188-Publish atomically. Build the complete report in a temporary file. After the report is finished, move it into the immutable archive filename, then copy that completed archive to a temporary latest filename and atomically move the temporary latest file into /downloads/chatgpt-debug-latest.txt. Never stream a still-changing report directly into either public filename. 61-189- 62-190-The complete report must begin with: 63-191- 64-192-SKYHAWK AI DEBUG REPORT 65-193-Task: 66-194-Generated: 67:195:Report-ID: 68-196:Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-.txt 69-197-Host: 70-198-Working directory: 71-199-Drupal root: /home/darwus/drupalbeta/web -- 207-195- 208-196-Multiple files may be selected. 209-197-Maximum individual file size is 511 MiB (535,822,336 bytes). 210-198-The hosting transport ceiling remains 512 MiB for an HTTP POST, so exceptionally large batches may need to be selected/uploaded separately even though each individual file is legal. 211:199:After Drupal receives temporary managed files, final submission makes them permanent, records each file in skyhawk_upload_file, increments cumulative file accounting, and sends the configured batch notification. 212-200-Completion notifications contain only the files finalized in that batch, not every historical file associated with the token. 213-201- 214-202- 215-203-Administration -- 224-220-Current Functional State 225-221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226-222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227-223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228:224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230-226-Current Regression Token 231-227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- -- 288-39- 289-40- 290-41- 291--- 292:53-The Drupal-native journal_index content type and its Drupal Views are the authoritative live Journal Index architecture. 293:54-The former standalone raw SQL table journal_index was a legacy Raven/import artifact and was retired on 2026-08-27 after live-use auditing. 294:55-raven_journal_index_534.csv is retained as the historical Raven source data. 295:56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- -- 304-65-On this A2 environment, do not use Bash process substitution such as < <(...) for Skyhawk work. It has repeatedly failed through /dev/fd/*. 305- 306- 307-===== ACTIVE SOURCE HISTORY OWNERS ===== 308:ACTIVE_SKYHAWK_UPLOAD_FILE_SOURCE_HITS=1 309:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.install:177: $schema['skyhawk_upload_file'] = [ 310- 311-===== ACTIVE GENERIC FINISH/PERSISTENCE SOURCE ===== 312-===== FILE: /home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenForm.php ===== 313-SHA256=862ca045c49fdcda6ee0bb4e97630cc25049f4a9ac35433192d40aae858fbf94 -- 333-240: 'These are the files that Finish submission will finalize.' . 334-241- '
    '; 335-242- } 336-243- 337:244- $form['token_identity'] = [ 338-245- '#type' => 'html_tag', 339-246- '#tag' => 'h2', 340-247- '#value' => $this->t( 341-248- 'Upload Files: @label', -- 361-272- /* 362-273- * Drupal core remains the upload owner. 363-274- * 364-275- * The ready-state markup belongs INSIDE this element so 365:276- * core uploadAjaxCallback replaces it when the fid changes. 366-277- */ 367-278- $form['files'] = [ 368-279- '#type' => 'managed_file', 369-280- '#title' => $this->t('Upload files'), -- 402-313- ], 403-314- ], 404-315- '#states' => [ 405-316- 'disabled' => [ 406:317- ':input[name="files[fids]"]' => [ 407-318- 'empty' => TRUE, 408-319- ], 409-320- ], 410-321- ], -- 447-384- ) { 448-385- return; 449-386- } 450-387- 451:388- $fids = $form_state->getValue('files') ?: []; 452-389- 453:390- if (empty($fids)) { 454-391- $form_state->setErrorByName( 455-392- 'files', 456-393- $this->t('Select at least one file.') 457-394- ); -- 484-530- return; 485-531- } 486-532- 487-533- /* 488:534- * Only count a newly accepted FID. 489-535- */ 490-536- if ( 491-537- !empty( 492-538- $accepted[ -- 527-588- $storage = 528-589- \Drupal::entityTypeManager() 529-590- ->getStorage('file'); 530-591- 531:592- $files = $storage->loadMultiple($fids); 532-593- 533-594- $count = 0; 534-595- $submitted_names = []; 535-596- -- 1008-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php:906: $file->save(); 1009-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-907- 1010-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-908- $fresh = 1011-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-909- \Drupal\file\Entity\File::load( 1012:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-910- $fid 1013-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-911- ); 1014-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-912- 1015-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-913- if ( 1016-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-914- !$fresh || -- 1092-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1319- 'field_reunion_newsletter' 1093-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1320- ) 1094-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1321- ->appendItem([ 1095-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1322- 'target_id' => 1096:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1323- (int) $promoted['fid'], 1097-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1324- ]); 1098-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1325- } 1099-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1326- 1100-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-1327- $event->setPublished(); -- 1248--- 1249-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-269- $form_state->set('replace_nid', $existing->id()); 1250-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-270- $form_state->set('replace_label', $existing->getTitle()); 1251-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-271- $form_state->set('replace_info', $info); 1252:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-272- $form_state->set('pending_canonical_fids', $canonical_fids); 1253:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-273- $form_state->set('pending_print_fids', $print_fids); 1254-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-274- $form_state->setRebuild(TRUE); 1255-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-275- } 1256-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-276- elseif ($adding_new) { 1257-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-277- $form_state->set('existing_nid', $existing->id()); -- 1260-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-280- 1261-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:281: public function submitForm(array &$form, FormStateInterface $form_state) { 1262-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-282- $meta = $form_state->get('meta'); 1263-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-283- if (!$meta) { 1264:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-284- $canonical_fids = $form_state->getValue('canonical_pdf'); 1265:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-285- $print_fids = $form_state->getValue('print_pdf'); 1266-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-286- $source_file = NULL; 1267:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-287- if (!empty($canonical_fids)) { 1268:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-288- $source_file = File::load(reset($canonical_fids)); 1269-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-289- } 1270:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-290- elseif (!empty($print_fids)) { 1271:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-291- $source_file = File::load(reset($print_fids)); 1272-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-292- } 1273-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-293- if ($source_file) { 1274--- 1275-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-296- } -- 1277-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-298- $existing_nid = $form_state->get('existing_nid'); 1278-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-299- if ($existing_nid) { 1279-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-300- $node = Node::load($existing_nid); 1280-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-301- if ($node) { 1281:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-302- $canonical_fids = $form_state->getValue('canonical_pdf'); 1282:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-303- $print_fids = $form_state->getValue('print_pdf'); 1283-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-304- 1284:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-305- if (!empty($canonical_fids)) { 1285:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-306- $pdf_file = File::load(reset($canonical_fids)); 1286-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-307- if ($pdf_file) { 1287-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:308: $pdf_file->setPermanent(); 1288-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:309: $pdf_file->save(); 1289-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-310- $node->set('field_pdf', ['target_id' => $pdf_file->id()]); 1290-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-311- } 1291-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-312- } 1292:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-313- if (!empty($print_fids)) { 1293:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-314- $print_file = File::load(reset($print_fids)); 1294-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-315- if ($print_file) { 1295-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:316: $print_file->setPermanent(); 1296-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:317: $print_file->save(); 1297-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-318- $node->set('field_pdf_print', ['target_id' => $print_file->id()]); -- 1316-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-341- $this->setPageMessage('Could not load existing node.', 'error'); 1317-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-342- return; 1318-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-343- } 1319-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-344- 1320:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-345- $canonical_fids = $form_state->get('pending_canonical_fids'); 1321:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-346- $print_fids = $form_state->get('pending_print_fids'); 1322-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-347- 1323:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-348- if (!empty($canonical_fids)) { 1324:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-349- $pdf_file = File::load(reset($canonical_fids)); 1325-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-350- if ($pdf_file) { 1326-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:351: $pdf_file->setPermanent(); 1327-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:352: $pdf_file->save(); 1328-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-353- $node->set('field_pdf', ['target_id' => $pdf_file->id()]); 1329-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-354- } 1330-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-355- } 1331:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-356- if (!empty($print_fids)) { 1332:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-357- $print_file = File::load(reset($print_fids)); 1333-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-358- if ($print_file) { 1334-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:359: $print_file->setPermanent(); 1335-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:360: $print_file->save(); 1336-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-361- $node->set('field_pdf_print', ['target_id' => $print_file->id()]); -- 1346-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-371- $this->setPageMessage('Upload cancelled.'); 1347-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-372- $form_state->setRedirect('skyhawk_site_fixes.journal_upload'); 1348-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-373- } 1349-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-374- 1350:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-375- protected function createJournalNode($canonical_fids, $print_fids, $meta, $form_state) { 1351-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-376- $season_map = [1 => 'Spring', 2 => 'Summer', 3 => 'Fall', 4 => 'Winter']; 1352-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-377- $year = $meta['year']; 1353-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-378- $vol = $meta['volume']; 1354-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-379- $iss = $meta['issue']; 1355-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-380- $season = $season_map[$iss] ?? 'Issue ' . $iss; 1356-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-381- $label = "$season $year (Vol. $vol No. $iss)"; 1357-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-382- 1358-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-383- $pdf_file = NULL; 1359:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-384- if (!empty($canonical_fids)) { 1360:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-385- $pdf_file = File::load(reset($canonical_fids)); 1361-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:386: if ($pdf_file) { $pdf_file->setPermanent(); $pdf_file->save(); } 1362-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-387- } 1363-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-388- 1364-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-389- $print_file = NULL; 1365:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-390- if (!empty($print_fids)) { 1366:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-391- $print_file = File::load(reset($print_fids)); 1367-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:392: if ($print_file) { $print_file->setPermanent(); $print_file->save(); } 1368-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-393- } 1369-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-394- 1370-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-395- $thumb_source = $pdf_file ?: $print_file; -- 1428-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-466- 1429-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-467-} 1430--- 1431-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-136- 1432:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-137- $form['expected_current_fid'] = [ 1433-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-138- '#type' => 'hidden', 1434:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-139- '#value' => $current_fid, 1435-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-140- ]; 1436-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-141- 1437-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-142- $form['expected_count'] = [ 1438-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-143- '#type' => 'hidden', -- 1462-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-300- } 1463-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-301- } NO_MATCHES ===== FID 61767 EVIDENCE ===== 4088- 4089-===== ROWS BY TOKEN PURPOSE ===== 4090- 4091-===== ACCEPTANCE FID HISTORY CHECK ===== 4092:FID_61767_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4093-FID_61768_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4094-FID_61769_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4095- 4096-===== EVENT 49464 ===== 4097-EVENT_49464_OWNER_UID=612 4098:EVENT_49464_NEWSLETTER_FIDS=61767,61768,61769 4099-DATABASE_AUDIT_COMPLETE=PASS 4100- 4101-===== KNOWN IMMUTABLE REPORT EVIDENCE ===== 4102-===== REPORT-ID 20260831T000619Z-6566488 ===== -- 4106-16-TOKEN_CREATED=NO 4107-17-TOKEN_USED=NO 4108-18-SUBMITTED_FILENAME=August Newsletter.pdf 4109-19-STORED_FILENAME_POLICY=deterministic_fid_based_public_path 4110:20:PREVIOUS_CURRENT_FID=61767 4111-21-PREVIOUS_HISTORY_COUNT=1 4112-22:NEW_FID=61768 4113-23-RESULTING_HISTORY_COUNT=2 4114-24:RESULTING_CURRENT_FID=61768 -- 4218-11-AUTHORITY=PASS 4219-12-EVENT_TITLE=2026 Skyhawkers Reunion 4220-13-EVENT_OWNER_UID=612 4221-14-EVENT_PUBLISHED=YES 4222:15:ACCEPTED_FIDS=61767,61768,61769 4223-16:CURRENT_FID=61769 4224-17-EVENT_PROTECTION_STATE=PASS 4225:18-FID61766_FILENAME=July Newsletter 2026.pdf 4226:19-FID61766_URI=private://uploads/ed646aaee11e35cae40bc6d57590b968/July Newsletter 2026.pdf 4227-20-FID61766_TEMPORARY=YES 4228-21-FID61766_USAGE_COUNT=0 4229--- 4230-25-FID61766_SAFE=PASS -- 4247-42:===== POST-CLEANUP VERIFY ===== 4248-43-EVENT_STATE_AFTER=PASS 4249-44-TITLE_AFTER=2026 Skyhawkers Reunion 4250-45-OWNER_AFTER=612 4251:46:FIDS_AFTER=61767,61768,61769 4252:47:ACCEPTED_FID_61767=PASS 4253-48:ACCEPTED_FID_61768=PASS 4254-49:ACCEPTED_FID_61769=PASS 4255-50-FID61766_ABSENT=PASS 4256-51-KEEPER_DELIVERY_RECORD_COUNT=3 -- 4265-60:OVERALL=PASS 4266-61- 4267-62-===== DELETION SCOPE ===== 4268-63-KNOWN_ORPHAN_FID_61766=DELETE_IF_TEMPORARY_AND_UNUSED 4269:64:ACCEPTED_FIDS_61767_61768_61769=PRESERVE 4270-65-EVENT_49464=PRESERVE 4271-66-KEEPER_ACK_RECORDS=PRESERVE 4272-67-IMMUTABLE_DEBUG_REPORTS=PRESERVE 4273-68-PRODUCTION_SOURCE=PRESERVE -- 4760-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-25-Advanced Generic Intake current implementation slice. 4761-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt:26:Kept narrow skyhawk_upload_file persisted-row proof explicitly open. 4762-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-27-Updated Drupal Environment Reference with canonical upload ownership. 4763-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-28-Advanced LOST-D from completed keeper handoff to Reunion Photo Upload 0.1. 4764:/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-29-Preserved Event 49464 and newsletters 61767/61768/61769. 4765--- 4766-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-1-SKYHAWK AI DEBUG REPORT 4767-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt:2:Task: Prove actual installed skyhawk_upload_file writer state 4768-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-3-Generated: 2026-08-26T03:10:51+00:00 -- 4864- 4865-===== RECONCILIATION ===== 4866-ACTIVE_SOURCE_HISTORY_HITS=1 4867-DB_ROW_COUNT=0 4868:FID_61767_HISTORY=UNRESOLVED_NO_FID_COLUMN 4869-FID_61768_HISTORY=UNRESOLVED_NO_FID_COLUMN 4870-FID_61769_HISTORY=UNRESOLVED_NO_FID_COLUMN 4871-EVIDENCE_CLASSIFICATION=WRITE_PATH_FOUND_BUT_NO_PERSISTED_HISTORY_ROWS 4872- ===== FID 61768 EVIDENCE ===== 4089-===== ROWS BY TOKEN PURPOSE ===== 4090- 4091-===== ACCEPTANCE FID HISTORY CHECK ===== 4092-FID_61767_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4093:FID_61768_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4094-FID_61769_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4095- 4096-===== EVENT 49464 ===== 4097-EVENT_49464_OWNER_UID=612 4098:EVENT_49464_NEWSLETTER_FIDS=61767,61768,61769 4099-DATABASE_AUDIT_COMPLETE=PASS 4100- 4101-===== KNOWN IMMUTABLE REPORT EVIDENCE ===== 4102:===== REPORT-ID 20260831T000619Z-6566488 ===== 4103:REPORT_FILE=/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T000619Z-6566488.txt 4104-SHA256=91e6049776575c07fb66eac46929ddab9f97a58fa68ecfdec6a5ce57d15f4082 4105-15-GENERAL_CURRENT_MEMBER_GATE=deferred_to_authoritative_roster_reconciliation 4106-16-TOKEN_CREATED=NO 4107-17-TOKEN_USED=NO 4108:18-SUBMITTED_FILENAME=August Newsletter.pdf 4109-19-STORED_FILENAME_POLICY=deterministic_fid_based_public_path 4110-20:PREVIOUS_CURRENT_FID=61767 4111-21-PREVIOUS_HISTORY_COUNT=1 4112:22:NEW_FID=61768 4113-23-RESULTING_HISTORY_COUNT=2 4114:24:RESULTING_CURRENT_FID=61768 4115-25-EVENT_PUBLISHED=YES 4116:26:FILE_URI=public://reunions/49464/61768/newsletter-61768.pdf 4117-27-FILE_PERMANENT=YES 4118-28-FILE_PHYSICAL=YES 4119-29-FILE_HASH_MATCH=YES 4120-30:PERSISTENCE_VERIFY=PASS -- 4218-11-AUTHORITY=PASS 4219-12-EVENT_TITLE=2026 Skyhawkers Reunion 4220-13-EVENT_OWNER_UID=612 4221-14-EVENT_PUBLISHED=YES 4222:15:ACCEPTED_FIDS=61767,61768,61769 4223-16:CURRENT_FID=61769 4224-17-EVENT_PROTECTION_STATE=PASS 4225-18-FID61766_FILENAME=July Newsletter 2026.pdf 4226-19-FID61766_URI=private://uploads/ed646aaee11e35cae40bc6d57590b968/July Newsletter 2026.pdf -- 4247-42:===== POST-CLEANUP VERIFY ===== 4248-43-EVENT_STATE_AFTER=PASS 4249-44-TITLE_AFTER=2026 Skyhawkers Reunion 4250-45-OWNER_AFTER=612 4251:46:FIDS_AFTER=61767,61768,61769 4252-47:ACCEPTED_FID_61767=PASS 4253:48:ACCEPTED_FID_61768=PASS 4254-49:ACCEPTED_FID_61769=PASS 4255-50-FID61766_ABSENT=PASS 4256-51-KEEPER_DELIVERY_RECORD_COUNT=3 4257-52:VERIFY=PASS -- 4265-60:OVERALL=PASS 4266-61- 4267-62-===== DELETION SCOPE ===== 4268-63-KNOWN_ORPHAN_FID_61766=DELETE_IF_TEMPORARY_AND_UNUSED 4269:64:ACCEPTED_FIDS_61767_61768_61769=PRESERVE 4270-65-EVENT_49464=PRESERVE 4271-66-KEEPER_ACK_RECORDS=PRESERVE 4272-67-IMMUTABLE_DEBUG_REPORTS=PRESERVE 4273-68-PRODUCTION_SOURCE=PRESERVE -- 4760-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-25-Advanced Generic Intake current implementation slice. 4761-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt:26:Kept narrow skyhawk_upload_file persisted-row proof explicitly open. 4762-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-27-Updated Drupal Environment Reference with canonical upload ownership. 4763-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-28-Advanced LOST-D from completed keeper handoff to Reunion Photo Upload 0.1. 4764:/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-29-Preserved Event 49464 and newsletters 61767/61768/61769. 4765--- 4766-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-1-SKYHAWK AI DEBUG REPORT 4767-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt:2:Task: Prove actual installed skyhawk_upload_file writer state 4768-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-3-Generated: 2026-08-26T03:10:51+00:00 -- 4865-===== RECONCILIATION ===== 4866-ACTIVE_SOURCE_HISTORY_HITS=1 4867-DB_ROW_COUNT=0 4868-FID_61767_HISTORY=UNRESOLVED_NO_FID_COLUMN 4869:FID_61768_HISTORY=UNRESOLVED_NO_FID_COLUMN 4870-FID_61769_HISTORY=UNRESOLVED_NO_FID_COLUMN 4871-EVIDENCE_CLASSIFICATION=WRITE_PATH_FOUND_BUT_NO_PERSISTED_HISTORY_ROWS 4872- 4873-Interpretation rules: ===== FID 61769 EVIDENCE ===== 4090- 4091-===== ACCEPTANCE FID HISTORY CHECK ===== 4092-FID_61767_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4093-FID_61768_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4094:FID_61769_UPLOAD_HISTORY_ROW=UNRESOLVED_NO_FID_COLUMN 4095- 4096-===== EVENT 49464 ===== 4097-EVENT_49464_OWNER_UID=612 4098:EVENT_49464_NEWSLETTER_FIDS=61767,61768,61769 4099-DATABASE_AUDIT_COMPLETE=PASS 4100- 4101-===== KNOWN IMMUTABLE REPORT EVIDENCE ===== 4102-===== REPORT-ID 20260831T000619Z-6566488 ===== -- 4136-19-EVENT_NID=49464 4137-20-EVENT_PUBLISHED=YES 4138-21-EVENT_OWNER_UID=1 4139-22-NEWSLETTER_COUNT=3 4140:23:CURRENT_FID=61769 4141:24-CURRENT_FILENAME=September Newsletter.pdf 4142:25:CURRENT_URI=public://reunions/49464/61769/newsletter-61769.pdf 4143-26-CURRENT_PERMANENT=YES 4144-27-CURRENT_PHYSICAL=YES 4145-28-CURRENT_SHA256=881398ad6a121851c950462cb07f8fae4c719afdb9526c4aa57100a3f068f50a 4146-29-SEPTEMBER_STATE=PASS -- 4163-95-MENU.My Reunions.COUNT=1 4164-96-MENU.Request a Reunion.COUNT=1 4165-97-EVENT_49464_PRESERVED=PASS 4166-98-NEWSLETTER_COUNT=3 4167:99:CURRENT_FID=61769 4168:100-CURRENT_FILENAME=September Newsletter.pdf 4169-101-DOC./blade/upload-token-system=PASS 4170-102-DOC./blade/lost-d=PASS 4171-103-DOC./blade/site-menu-reference=PASS 4172-104:FINAL_VERIFY=PASS -- 4195-136-EVENT_NID=49464 4196-137-JULY=HISTORY 4197-138-AUGUST=HISTORY 4198-139-SEPTEMBER=CURRENT 4199:140:SEPTEMBER_CURRENT_FID_EXPECTED=61769 4200-141-ACCEPTED_NEWSLETTER_COUNT_EXPECTED=3 4201-142- 4202-143-===== SAFETY ===== 4203-144-NEW_REUNION_CREATED_BY_INSTALL=NO -- 4218-11-AUTHORITY=PASS 4219-12-EVENT_TITLE=2026 Skyhawkers Reunion 4220-13-EVENT_OWNER_UID=612 4221-14-EVENT_PUBLISHED=YES 4222:15:ACCEPTED_FIDS=61767,61768,61769 4223:16:CURRENT_FID=61769 4224-17-EVENT_PROTECTION_STATE=PASS 4225-18-FID61766_FILENAME=July Newsletter 2026.pdf 4226-19-FID61766_URI=private://uploads/ed646aaee11e35cae40bc6d57590b968/July Newsletter 2026.pdf 4227-20-FID61766_TEMPORARY=YES -- 4247-42:===== POST-CLEANUP VERIFY ===== 4248-43-EVENT_STATE_AFTER=PASS 4249-44-TITLE_AFTER=2026 Skyhawkers Reunion 4250-45-OWNER_AFTER=612 4251:46:FIDS_AFTER=61767,61768,61769 4252-47:ACCEPTED_FID_61767=PASS 4253-48:ACCEPTED_FID_61768=PASS 4254:49:ACCEPTED_FID_61769=PASS 4255-50-FID61766_ABSENT=PASS 4256-51-KEEPER_DELIVERY_RECORD_COUNT=3 4257-52:VERIFY=PASS 4258-53- -- 4265-60:OVERALL=PASS 4266-61- 4267-62-===== DELETION SCOPE ===== 4268-63-KNOWN_ORPHAN_FID_61766=DELETE_IF_TEMPORARY_AND_UNUSED 4269:64:ACCEPTED_FIDS_61767_61768_61769=PRESERVE 4270-65-EVENT_49464=PRESERVE 4271-66-KEEPER_ACK_RECORDS=PRESERVE 4272-67-IMMUTABLE_DEBUG_REPORTS=PRESERVE 4273-68-PRODUCTION_SOURCE=PRESERVE -- 4760-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-25-Advanced Generic Intake current implementation slice. 4761-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt:26:Kept narrow skyhawk_upload_file persisted-row proof explicitly open. 4762-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-27-Updated Drupal Environment Reference with canonical upload ownership. 4763-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-28-Advanced LOST-D from completed keeper handoff to Reunion Photo Upload 0.1. 4764:/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T193805Z-1546791.txt-29-Preserved Event 49464 and newsletters 61767/61768/61769. 4765--- 4766-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-1-SKYHAWK AI DEBUG REPORT 4767-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt:2:Task: Prove actual installed skyhawk_upload_file writer state 4768-/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260826T031051Z-1245077.txt-3-Generated: 2026-08-26T03:10:51+00:00 -- 4866-ACTIVE_SOURCE_HISTORY_HITS=1 4867-DB_ROW_COUNT=0 4868-FID_61767_HISTORY=UNRESOLVED_NO_FID_COLUMN 4869-FID_61768_HISTORY=UNRESOLVED_NO_FID_COLUMN 4870:FID_61769_HISTORY=UNRESOLVED_NO_FID_COLUMN 4871-EVIDENCE_CLASSIFICATION=WRITE_PATH_FOUND_BUT_NO_PERSISTED_HISTORY_ROWS 4872- 4873-Interpretation rules: 4874-1. Source saying a row should be written is not persistence proof. ===== TOKEN / PURPOSE RELATIONSHIPS ===== 11-MODE=READ_ONLY_EVIDENCE_AUDIT 12-DRUPAL_CONTENT_MUTATION=NO 13-DATABASE_MUTATION=NO 14-APPLICATION_SOURCE_MUTATION=NO 15:TOKEN_CREATION=NO 16-UPLOAD_EXECUTION=NO 17-REFERENCE_MODEL=ALIAS_TO_NODE_TO_ACTUAL_BODY_READ 18-REPORT_MODEL=TIMESTAMPED_IMMUTABLE_REPORT_ID 19-LATEST_MODEL=REPLACEABLE_HANDOFF_ONLY -- 40-REFERENCE_BODY_READ_COMPLETE=PASS 41- 42-===== RELEVANT REFERENCE TEXT ===== 43-===== RULES RELEVANT TEXT ===== 44:1:ACTIVE RULES - READ BEFORE SKYHAWK WORKPurpose: These Rules are the durable operating contract for Skyhawk.org work. They exist to preserve progress, reduce repeated mistakes, and make external behavior from a probabilistic AI as deterministic and recoverable as practical.Mandatory Execution ContractEvery executable Skyhawk.org code block must begin with this literal first line:# RULES + GERMANE REFERENCE READIf that line is absent, the block is procedurally invalid and should not be run.Before writing executable code, reread this ACTIVE RULES block and the CURRENT STATE block of the germane project reference. Read deeper supporting sections only when they are relevant to the task.Inspect actual current state before modification when state is uncertain.Apply KISS. Use the simplest maintainable solution that satisfies the proven requirement. Complexity requires evidence.Prefer Drupal core, configuration, Views, and maintained contributed functionality before custom mechanisms.Do not reopen accepted work without new contradictory evidence.When one requirement fails, investigate that requirement rather than reaudit or redesign unrelated working functionality.Test user and business outcomes first. Inspect internal transitions only when an outcome fails and only deeply enough to identify and repair that failure.When an existing owner is identifiable, know and replace cleanly rather than append competing code or configuration.After every result, determine whether current truth actually changed. Update the Rules or project reference only when needed. 45-2-Authorization Establishment and Exercise 46-3- 47-4- Do not repeat an authorization ceremony when authoritative, scoped responsibility has already been established and remains valid. 48:5- Use durable authoritative principal identity for continuing responsibility. Tokens and verification links are mechanisms for establishing or verifying authority, not permanent identities. 49-6- Routine consequential actions must still re-check authenticated identity, current eligibility required by the product, scoped authority, persisted state, and the independent postconditions of the action. 50-7- If current eligibility cannot be determined from an authoritative source, do not invent or infer it. Restrict the operation to an explicitly accepted transitional fixture or stop until the authoritative contract is available. 51--- 52-180-6. Standard AI Debug Channel -- 84-215-If the first retrieval is stale, that is a retrieval-layer failure, not evidence that the A2 command failed. Retry the known latest URL with a cache-busting query value when the retrieval tool permits it. Do not report server failure merely because an intermediary served an older object. 85-216- 86-217-Do not ask Gene to paste terminal output merely because retrieval is stale. Manual copy/paste is a fallback only when the fixed latest-report channel cannot be read after reasonable fresh-retrieval attempts. 87-218- 88:219-Never place secrets in public debug reports. Do not include passwords, private keys, session cookies, API keys, active upload tokens, personal data, database credentials, or other sensitive material. Redact before publication. 89-220- 90-221-Capture enough evidence to determine the next state, not thousands of irrelevant lines. Use the older A2-to-Windows report-transfer workflow only when Gene actually needs a local file.Debug Evidence Promotion 91-222- 92-223- 93-224-Promote the relevant final evidence automatically. Every diagnostic or test block must finish by placing the evidence that determines the next state into /downloads/chatgpt-debug-latest.txt. Gene must not be required to run a second copy/promote command after the test. 94-225- 95-226:Keep immutable evidence separately. Installation or diagnostic runs continue to create their immutable Report-ID archive. A temporary live-event stream may use its own fixed file while the test is occurring, but when the test produces the evidence needed for the next decision, that evidence must be atomically promoted to chatgpt-debug-latest.txt. 96-227- 97:228-The fixed latest URL is the normal machine handoff. After Gene reports that a command or requested test is complete, the AI should retrieve https://skyhawk.org/downloads/chatgpt-debug-latest.txt itself, force freshness when possible, and validate the contents before asking Gene for output. The immutable archive is fallback evidence, not a routine human relay requirement. 98-229- 99-230-Live browser instrumentation must self-report. When a browser/device action is the only human-dependent step, the observer or diagnostic mechanism must capture and publish the resulting evidence automatically. Gene's role should end with performing the irreducible device action, such as choosing files on the Pixel. 100-231- 101-232-Do not overwrite useful evidence prematurely. A subsequent installation report, smoke test, cleanup action, or unrelated diagnostic must not replace chatgpt-debug-latest.txt before the AI has consumed the evidence from the just-completed functional test. -- 144-13- 145-14-For Reunion source updates, the contributor filename is provenance and presentation metadata, not semantic authority. Acceptance must not require a month, year, Event name, or other business meaning to be encoded in the filename. The workflow determines the target Event; exactly one real PDF and the applicable authorization, duplicate-content, persistence, and public-verification gates determine acceptance. Skyhawk may use a deterministic internal stored path while preserving the original contributor filename. 146-15- A Reunion benefit is initiated by the Association member who accepts responsibility for it. Normal future design requires that member to be authenticated. 147-16- The authenticated Drupal UID is the durable identity. Account email is the authoritative contact value presented from Drupal; a changed email must be verified before becoming authoritative. 148:17: Once responsibility has been established, routine Reunion newsletter/source updates are performed through authenticated Ready Room access. A new Generic Intake token is not required for each update. 149:18- Existing token/request records remain immutable historical evidence of how earlier authority was established. The 2026 A-4 JULY bootstrap remains token-established history. 150-19- Each consequential Reunion update records the executing UID, time, previous current file, resulting current file, and verification outcome. Drupal revision history is preferred where it provides that evidence without another custom tracking subsystem. 151-20- Current Association membership is required to exercise production Reunion authority. Reliable generalized current-member eligibility must use the authoritative membership state after the documented roster reconciliation; it must not be guessed from unrelated data. 152-21- Each durable Reunion Unit has one primary accountable current member and at least one additional current-member continuity contact by the start of the Reunion. Additional authorized helpers may be supported. 153-22- The Reunion Unit persists across successive reunion occurrences. A future reunion is a new occurrence associated with the same durable Unit rather than an overwrite of an earlier reunion occurrence. -- 161-30: The responsible authenticated member may provide Reunion source material either by uploading one ordinary source document through Drupal core managed_file or by pasting source text directly. 162-31- Uploaded source intake remains format-agnostic. PDF, DOC/DOCX, TXT and other ordinary source documents are not assigned business meaning from their filename or extension. Normal Drupal and hosting safety constraints still apply. 163-32- Pasted text is stored directly as submitted source content. The system does not manufacture a fake text file merely to force pasted material through a file-upload abstraction. 164-33- The submitted source is authoritative input. Parsing or model extraction produces proposed structured facts only. Extraction failure does not invalidate an otherwise preserved source. 165:34- A new self-service Reunion request creates an unpublished Reunion Event draft owned by the authenticated requester. That draft is the durable occurrence identity; later parsing/review updates the same entity rather than creating a duplicate Event. 166-35- General production activation still requires authoritative current-membership eligibility and the required primary/continuity-member relationship. Until the membership-roster reconciliation provides that deterministic contract, creation of a private draft does not itself grant publication/update authority. 167-36- Replacement/update sources reconcile the existing Event. Prior accepted sources and relevant source history remain associated with the same Event. 168--- 169-151-Success, information and error/action-required messages remain -- 171-153-styled so that a user is unlikely to miss required action. Generic 172-154-Drupal messenger popups are not the target UX for these custom 173-155-member-facing workflows. 174-156- 175:157:CURRENT STATE - GENERIC INTAKE SYSTEMProject: Generic Intake SystemStatus: In developmentUltimate goal: A self-service, reusable, aesthetically integrated intake framework that lets authorized nontechnical Ready Room users create purpose-specific public file requests without webmaster assistance. The underlying upload engine remains generic for future uses.Current accepted functionality:Drupal core managed_file owns automatic initial file transfer.Generic file acceptance is proven. Format-specific diagnosis is closed absent contradictory evidence.Token-specific private storage under private://uploads/[token]/ is proven.Finish submission and permanent-file finalization are proven.Reusable token behavior is proven.The current Pixel/Chrome public upload presentation is accepted.The redundant generic Upload title is closed work.Public Drupal status-popup behavior was corrected toward the established inline PageMessage pattern.Accepted request/invitation gate: real Ready Room testing proved explicit recipient routing, request-data persistence, the canonical https://skyhawk.org/upload/{token} invitation, the same stored request instructions in the actual email and public upload page, and on-page Ready Room request confirmation. Accepted by Report-ID 20260830T161100Z-2299062. Current implementation slice: prove the shared Event framework with the real 2026 A-4 Skyhawk Reunion corpus. JULY creates exactly one Event; AUGUST reconciles that same Event; SEPTEMBER reconciles the same Event to the current pre-event state while preserving prior updates. No duplicate Event nodes.Next implementation principle: preserve the proven uploader/finalization engine and evolve the surrounding request-management system. Do not rewrite the working upload path merely to implement the broader framework.Closed work: extension and MIME enumeration, image-versus-video diagnosis, synthetic upload triggering, custom serializer/queue transfer experiments, generic Upload page title, and repeated reproving of accepted core transfer/finalization behavior.Reopen closed work only when: new contradictory functional evidence demonstrates that the accepted behavior is no longer true.Current Agreed Product DecisionsThe Ready Room menu links directly to an Upload Requests dashboard. Individual public requests do not become menu entries.Granular Drupal permissions, assigned to roles, govern creation, management, reassignment, lifecycle actions, viewing submissions, and permanent deletion.Request-specific instructions are entered once and dynamically reused in both the invitation email and public upload page. The live page is authoritative when instructions change.The underlying uploader remains format-agnostic even when a request expects ZIP files, photographs, video, documents, or other material.Public size language uses industry-standard decimal MB where 1 MB equals 1,000,000 bytes, plus the exact comma-separated byte count where useful.The configured limit is per individual file, not the aggregate of multiple files in a submission.Large collections are split among multiple files or ZIP archives rather than reducing original photo or video quality merely to fit a limit.Removal before Finish submission is required. Each file gets a clear individual Remove action rather than Drupal selection checkboxes.The pre-finish manifest shows filename, MB, exact bytes, status, and Remove, plus file count and aggregate size.Resumable transfer is desirable for large files if a maintained Drupal-compatible solution can provide it simply. Do not build a custom resumable-upload platform.SA controls stored/internal filenames for sortable, collision-resistant recovery. Original contributor filenames remain preserved as metadata. Database fields, not filename parsing, remain authoritative for Views.Each request has an immutable human-friendly ID and each Finish submission has a batch identity.Useful provenance is retained, including original/generated filename, request, batch, known source/contributor information, timestamps, size, and relevant supplied metadata.Exact duplicate hashes may be retained for integrity and later duplicate identification, but exact duplicates are not automatically rejected because provenance can differ.The responsible party determines the intended disposition of each request. Receipt and automatic publication are separate concepts.Original files are preserved by default, while storage and retention policy may be revisited if storage becomes a material constraint.ZIP preservation or extraction depends on purpose, permissions, and downstream workflow rather than one universal rule.Copyright remains with whoever legally owns it. Upload does not itself transfer copyright to SA.Contributors should represent, to the best of their knowledge, that they are entitled to provide the material and are not knowingly violating another persons rights.Applicable photo policy grants SA appropriate continuing non-exclusive permission to preserve, reproduce, migrate or convert, adapt for presentation, publish, and use contributed material in Association activities and publications.SA remains the sole arbiter of whether and under what conditions photographs administered or distributed through the SA website are provided or authorized for third-party use, without claiming copyright SA does not own.Known photographer/source and SA credit may both be used publicly as appropriate, while full provenance remains preserved internally.The upload system does not ask contributors to manage future contact requests. SA may forward a legitimate contact request to the known owner/source. The requester is told that no response within the defined period means no permission or contact. Silence is never consent.Photo-oriented requests may support both a batch description and optional per-photo descriptions plus other appropriate configurable metadata.The exact applicable rights/agreement version, request, batch, and acceptance time are retained.The existing photo-contribution workflow is superseded only after the generic framework proves equivalent or better required functionality.Successful submission normally produces one internal summary per completed batch.Requests may generate up to two sensible expiration reminders, but any successful submission cancels outstanding reminder prompting for that request.The system does not automatically nag the contributor. The creator can resend the active request and current dynamically generated instructions.Successful received material is not automatically deleted. Truly abandoned temporary material may be cleaned up conservatively under documented policy.Arbitrary contributed files are treated as untrusted until appropriately reviewed or scanned. Prefer a simple maintained scanning mechanism rather than custom antivirus infrastructure.Desktop, tablet, and mobile are supported where practical. Device parity must not make important functionality unreasonably complex or impossible.After Finish submission, show a meaningful receipt before offering Upload another batch while the request remains active.Errors remain inline and explain what happened, why, and what the contributor should do. Successfully transferred files are not needlessly retransmitted because another file failed.KISS governs implementation.Implementation order: request data model and Ready Room dashboard; shared instructions and email workflow; public manifest/removal/size/receipt/error UX; naming/batch/history/accounting/provenance/hash; permissions/expiration/reminders/lifecycle; then evaluate maintained resumable upload and malware scanning; replace photo-contribute only after parity is proven.Deterministic AI instruction: routine work on this project must begin by rereading the ACTIVE RULES block and this CURRENT STATE block. Deeper historical or diagnostic material is supporting evidence and must not override current accepted truth unless new evidence changes that truth. 176:158-Upload Token System 177-159- 178:160-This is the authoritative reference for the generic public upload-token product implemented in skyhawk_site_fixes. 179-161- 180-162-Architecture 181-163- 182-164- 183:165-Public route: /upload/{token}. 184:166-Admin route: /admin/skyhawk/upload-tokens. 185:167-The public route is owned by UploadTokenForm. 186-168:Drupal core managed_file owns file selection, AJAX transfer, validation, and temporary file entities. 187:169-Files are stored under private://uploads/[token]/. 188-170-No custom synthetic mouse event or parallel direct-upload controller participates in the live product. 189-171- 190-172- 191-173-Public Upload Page Workflow 192-174- 193-175-The public page has no redundant generic Upload page title. Its identifying heading is Upload Files: [label]. 194:176-The secret token value is never displayed. 195-177:Selecting files is the upload action. Drupal core managed_file immediately starts AJAX transfer from the file-input change event. 196:178-Successful initial uploads become temporary Drupal managed files under private://uploads/[token]/. 197-179:The final action is Finish submission. 198-180-Skyhawk custom-form results never use Drupal messenger/status popups. Upload/finalization results render inline on the form using the established PageMessageTrait pattern required by Tier-1 Rule 8.3. 199-181- 200:182-Token Lifecycle 201-183- 202-184- 203:185-A token is valid when it exists, has status active, and has not expired. 204--- 205-193-Upload Rules 206-194- 207-195- 208-196-Multiple files may be selected. 209-197-Maximum individual file size is 511 MiB (535,822,336 bytes). 210-198-The hosting transport ceiling remains 512 MiB for an HTTP POST, so exceptionally large batches may need to be selected/uploaded separately even though each individual file is legal. 211-199:After Drupal receives temporary managed files, final submission makes them permanent, records each file in skyhawk_upload_file, increments cumulative file accounting, and sends the configured batch notification. 212:200-Completion notifications contain only the files finalized in that batch, not every historical file associated with the token. 213-201- 214-202- 215-203-Administration 216-204- 217-205- 218--- 219-215- 220:216-The old UploadTokenController and upload_token_mobile_fix.js are retired into the timestamped replacement backup rather than destroyed during initial acceptance testing. 221-217- 222:218-Functional acceptance remains pending until the Pixel test verifies: legal multi-file upload, final submission, private storage, history rows, notification, reuse of the same token, explicit revocation, expiry rejection, and oversize rejection. 223-219- 224-220-Current Functional State 225:221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226:222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227-223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228-224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230:226-Current Regression Token 231:227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- 233-229-Reunion Keeper Communication and Acknowledgment 234-230- 235- -- 237-1- 238-2- 239-3-LOST-D 240-4- 241:5:Current implementation slice: The 2026 A-4 acceptance corpus remains complete on Event 49464 with JULY and AUGUST retained as history and SEPTEMBER current. Reunion self-service source intake and Request a Reunion are installed. The established Ready Room management destination is My Reunion Events; the redundant My Reunions entry is retired. The next consequential boundary is the proof-of-concept keeper handoff: verify the intended primary and continuity member email/account relationships first. Do not rename Event 49464, reassign it, change authoritative account email, establish keeper authority, or send keeper instructions until those identity/email checks pass. 242-6- 243-7- 244-8-Member Communications 245-9-Improve logged-in member communication while protecting personal -- 265-11- 266-12- 267-13-Custom Modules 268-14- 269:15-skyhawk_site_fixes — primary site-specific integration module. Contains the upload token system, mail hooks, reunion system, journal upload, PageMessageTrait. 270-16:skyhawk_gallery — renders dir_listing nodes as filesystem image galleries. Contains PhotoContributionForm.php — the established working pattern for managed_file uploads on this site. Still uses Drupal messenger() popups (not yet converted to PageMessageTrait) — do not copy that part of the pattern. 271-17-yp_memorial — displays YP memorial memories from Webform submissions. 272-18-skyhawk_sdo_contact.zip, skyhawk_sdo_contact_patch.zip, skyhawk_sdo_router.zip — present on disk, not extracted/audited. See /blade/sdo-system-status. 273-19- -- 280-31- 281-32- 282-33-Established Patterns to Reuse 283-34- 284:35:File upload: Drupal's native managed_file form element with #multiple => TRUE, #upload_location, #upload_validators — see skyhawk_gallery/PhotoContributionForm.php and skyhawk_site_fixes/UploadTokenForm.php. 285-36-Inline one-shot messages (no Drupal messenger popup): skyhawk_site_fixes/src/Traits/PageMessageTrait.php. 286-37-Email sending: hook_mail() in skyhawk_site_fixes.module, dispatched via \Drupal::service('plugin.manager.mail')->mail(). 287:38-Per-request/token-gated routes: always call \Drupal::service('page_cache_kill_switch')->trigger() to prevent Drupal's page cache (default max-age 3600) from serving stale state. 288-39- 289-40- 290-41- 291--- -- 294-55-raven_journal_index_534.csv is retained as the historical Raven source data. 295-56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- -- 308-ACTIVE_SKYHAWK_UPLOAD_FILE_SOURCE_HITS=1 309-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.install:177: $schema['skyhawk_upload_file'] = [ 310- 311-===== ACTIVE GENERIC FINISH/PERSISTENCE SOURCE ===== 312:===== FILE: /home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenForm.php ===== 313-SHA256=862ca045c49fdcda6ee0bb4e97630cc25049f4a9ac35433192d40aae858fbf94 314- 315-222- ''; 316-223- } -- 333-240: 'These are the files that Finish submission will finalize.' . 334-241- ''; 335-242- } 336-243- 337:244- $form['token_identity'] = [ 338-245- '#type' => 'html_tag', 339-246- '#tag' => 'h2', 340-247- '#value' => $this->t( 341-248- 'Upload Files: @label', 342:249- ['@label' => $token_label] 343-250- ), 344-251- '#weight' => 0, 345-252- ]; 346-253- -- 352--- 353-264- '#markup' => 354-265- '
    ' . 355-266- 'UPLOAD YOUR FILE IN THE BOX IMMEDIATELY BELOW.' . 356:267- '
    Request instructions follow below the upload controls.' . 357-268- '
    ', 358-269- '#weight' => 20, 359-270- ]; 360-271- -- 367-278- $form['files'] = [ 368-279- '#type' => 'managed_file', 369-280- '#title' => $this->t('Upload files'), 370-281- '#upload_location' => 371:282: 'private://uploads/' . $token . '/', 372-283- '#multiple' => TRUE, 373-284- '#weight' => 30, 374-285- '#description' => 375-286- \Drupal\Core\Render\Markup::create( -- 421-332- /* 422-333- * Still below the upload box, but no longer separating NO_MATCHES ===== DATABASE ROW / HISTORY EVIDENCE ===== 1-SKYHAWK AI DEBUG REPORT 2:Task: Deep read-only reconciliation of Generic Intake upload-history truth 3-Generated: 2026-08-31T19:52:03+00:00 4-Report-ID: 20260831T195202Z-1605488 5-Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-20260831T195202Z-1605488.txt 6-Host: s19522.use2.stableserver.net -- 19-LATEST_MODEL=REPLACEABLE_HANDOFF_ONLY 20-BACKUP_REQUIRED=NO 21- 22-===== ACTUAL REFERENCE BODY READ ===== 23:No syntax errors detected in /tmp/skyhawk-upload-history-deep-audit-20260831T195202Z-1605488/read-references.php 24-RULES_NID=49418 25-RULES_BODY_READ=PASS 26-RULES_BODY_BYTES=56104 27-RULES_BODY_SHA256=b8bfc47aa6415c18669c8e38ddbd21c85adfeb9d218e141474e0ecb7e71d603a -- 95-226:Keep immutable evidence separately. Installation or diagnostic runs continue to create their immutable Report-ID archive. A temporary live-event stream may use its own fixed file while the test is occurring, but when the test produces the evidence needed for the next decision, that evidence must be atomically promoted to chatgpt-debug-latest.txt. 96-227- 97-228-The fixed latest URL is the normal machine handoff. After Gene reports that a command or requested test is complete, the AI should retrieve https://skyhawk.org/downloads/chatgpt-debug-latest.txt itself, force freshness when possible, and validate the contents before asking Gene for output. The immutable archive is fallback evidence, not a routine human relay requirement. 98-229- 99:230-Live browser instrumentation must self-report. When a browser/device action is the only human-dependent step, the observer or diagnostic mechanism must capture and publish the resulting evidence automatically. Gene's role should end with performing the irreducible device action, such as choosing files on the Pixel. 100-231- 101-232-Do not overwrite useful evidence prematurely. A subsequent installation report, smoke test, cleanup action, or unrelated diagnostic must not replace chatgpt-debug-latest.txt before the AI has consumed the evidence from the just-completed functional test. 102--- 103-460-Automation must explicitly use proven executables and environment facts rather than depend on interactive aliases or PATH behavior unless that behavior itself is the intended, proven mechanism. -- 145-14-For Reunion source updates, the contributor filename is provenance and presentation metadata, not semantic authority. Acceptance must not require a month, year, Event name, or other business meaning to be encoded in the filename. The workflow determines the target Event; exactly one real PDF and the applicable authorization, duplicate-content, persistence, and public-verification gates determine acceptance. Skyhawk may use a deterministic internal stored path while preserving the original contributor filename. 146-15- A Reunion benefit is initiated by the Association member who accepts responsibility for it. Normal future design requires that member to be authenticated. 147-16- The authenticated Drupal UID is the durable identity. Account email is the authoritative contact value presented from Drupal; a changed email must be verified before becoming authoritative. 148-17: Once responsibility has been established, routine Reunion newsletter/source updates are performed through authenticated Ready Room access. A new Generic Intake token is not required for each update. 149:18- Existing token/request records remain immutable historical evidence of how earlier authority was established. The 2026 A-4 JULY bootstrap remains token-established history. 150:19- Each consequential Reunion update records the executing UID, time, previous current file, resulting current file, and verification outcome. Drupal revision history is preferred where it provides that evidence without another custom tracking subsystem. 151-20- Current Association membership is required to exercise production Reunion authority. Reliable generalized current-member eligibility must use the authoritative membership state after the documented roster reconciliation; it must not be guessed from unrelated data. 152-21- Each durable Reunion Unit has one primary accountable current member and at least one additional current-member continuity contact by the start of the Reunion. Additional authorized helpers may be supported. 153-22- The Reunion Unit persists across successive reunion occurrences. A future reunion is a new occurrence associated with the same durable Unit rather than an overwrite of an earlier reunion occurrence. 154:23- Reunion photographs and historical material are retained and displayed for their historical and sentimental value. Loss of a responsible member does not automatically delete public history. 155-24- If all eligible responsible contacts are lost, the Association determines succession and continued stewardship. 156-25- Existing agreed reminder behavior remains unchanged. Reminders prompt authorized members to maintain their existing Reunion relationship; they do not recreate authority. 157-26- The model should remain reusable for other future member-supported benefits without prematurely constructing a universal custom framework. 158-27-Source-Material Workflow -- 163-32- Pasted text is stored directly as submitted source content. The system does not manufacture a fake text file merely to force pasted material through a file-upload abstraction. 164-33- The submitted source is authoritative input. Parsing or model extraction produces proposed structured facts only. Extraction failure does not invalidate an otherwise preserved source. 165-34- A new self-service Reunion request creates an unpublished Reunion Event draft owned by the authenticated requester. That draft is the durable occurrence identity; later parsing/review updates the same entity rather than creating a duplicate Event. 166-35- General production activation still requires authoritative current-membership eligibility and the required primary/continuity-member relationship. Until the membership-roster reconciliation provides that deterministic contract, creation of a private draft does not itself grant publication/update authority. 167:36- Replacement/update sources reconcile the existing Event. Prior accepted sources and relevant source history remain associated with the same Event. 168--- 169-151-Success, information and error/action-required messages remain 170-152-inline, subdued and aesthetically integrated, but positioned and 171-153-styled so that a user is unlikely to miss required action. Generic 172-154-Drupal messenger popups are not the target UX for these custom 173-155-member-facing workflows. 174-156- 175:157:CURRENT STATE - GENERIC INTAKE SYSTEMProject: Generic Intake SystemStatus: In developmentUltimate goal: A self-service, reusable, aesthetically integrated intake framework that lets authorized nontechnical Ready Room users create purpose-specific public file requests without webmaster assistance. The underlying upload engine remains generic for future uses.Current accepted functionality:Drupal core managed_file owns automatic initial file transfer.Generic file acceptance is proven. Format-specific diagnosis is closed absent contradictory evidence.Token-specific private storage under private://uploads/[token]/ is proven.Finish submission and permanent-file finalization are proven.Reusable token behavior is proven.The current Pixel/Chrome public upload presentation is accepted.The redundant generic Upload title is closed work.Public Drupal status-popup behavior was corrected toward the established inline PageMessage pattern.Accepted request/invitation gate: real Ready Room testing proved explicit recipient routing, request-data persistence, the canonical https://skyhawk.org/upload/{token} invitation, the same stored request instructions in the actual email and public upload page, and on-page Ready Room request confirmation. Accepted by Report-ID 20260830T161100Z-2299062. Current implementation slice: prove the shared Event framework with the real 2026 A-4 Skyhawk Reunion corpus. JULY creates exactly one Event; AUGUST reconciles that same Event; SEPTEMBER reconciles the same Event to the current pre-event state while preserving prior updates. No duplicate Event nodes.Next implementation principle: preserve the proven uploader/finalization engine and evolve the surrounding request-management system. Do not rewrite the working upload path merely to implement the broader framework.Closed work: extension and MIME enumeration, image-versus-video diagnosis, synthetic upload triggering, custom serializer/queue transfer experiments, generic Upload page title, and repeated reproving of accepted core transfer/finalization behavior.Reopen closed work only when: new contradictory functional evidence demonstrates that the accepted behavior is no longer true.Current Agreed Product DecisionsThe Ready Room menu links directly to an Upload Requests dashboard. Individual public requests do not become menu entries.Granular Drupal permissions, assigned to roles, govern creation, management, reassignment, lifecycle actions, viewing submissions, and permanent deletion.Request-specific instructions are entered once and dynamically reused in both the invitation email and public upload page. The live page is authoritative when instructions change.The underlying uploader remains format-agnostic even when a request expects ZIP files, photographs, video, documents, or other material.Public size language uses industry-standard decimal MB where 1 MB equals 1,000,000 bytes, plus the exact comma-separated byte count where useful.The configured limit is per individual file, not the aggregate of multiple files in a submission.Large collections are split among multiple files or ZIP archives rather than reducing original photo or video quality merely to fit a limit.Removal before Finish submission is required. Each file gets a clear individual Remove action rather than Drupal selection checkboxes.The pre-finish manifest shows filename, MB, exact bytes, status, and Remove, plus file count and aggregate size.Resumable transfer is desirable for large files if a maintained Drupal-compatible solution can provide it simply. Do not build a custom resumable-upload platform.SA controls stored/internal filenames for sortable, collision-resistant recovery. Original contributor filenames remain preserved as metadata. Database fields, not filename parsing, remain authoritative for Views.Each request has an immutable human-friendly ID and each Finish submission has a batch identity.Useful provenance is retained, including original/generated filename, request, batch, known source/contributor information, timestamps, size, and relevant supplied metadata.Exact duplicate hashes may be retained for integrity and later duplicate identification, but exact duplicates are not automatically rejected because provenance can differ.The responsible party determines the intended disposition of each request. Receipt and automatic publication are separate concepts.Original files are preserved by default, while storage and retention policy may be revisited if storage becomes a material constraint.ZIP preservation or extraction depends on purpose, permissions, and downstream workflow rather than one universal rule.Copyright remains with whoever legally owns it. Upload does not itself transfer copyright to SA.Contributors should represent, to the best of their knowledge, that they are entitled to provide the material and are not knowingly violating another persons rights.Applicable photo policy grants SA appropriate continuing non-exclusive permission to preserve, reproduce, migrate or convert, adapt for presentation, publish, and use contributed material in Association activities and publications.SA remains the sole arbiter of whether and under what conditions photographs administered or distributed through the SA website are provided or authorized for third-party use, without claiming copyright SA does not own.Known photographer/source and SA credit may both be used publicly as appropriate, while full provenance remains preserved internally.The upload system does not ask contributors to manage future contact requests. SA may forward a legitimate contact request to the known owner/source. The requester is told that no response within the defined period means no permission or contact. Silence is never consent.Photo-oriented requests may support both a batch description and optional per-photo descriptions plus other appropriate configurable metadata.The exact applicable rights/agreement version, request, batch, and acceptance time are retained.The existing photo-contribution workflow is superseded only after the generic framework proves equivalent or better required functionality.Successful submission normally produces one internal summary per completed batch.Requests may generate up to two sensible expiration reminders, but any successful submission cancels outstanding reminder prompting for that request.The system does not automatically nag the contributor. The creator can resend the active request and current dynamically generated instructions.Successful received material is not automatically deleted. Truly abandoned temporary material may be cleaned up conservatively under documented policy.Arbitrary contributed files are treated as untrusted until appropriately reviewed or scanned. Prefer a simple maintained scanning mechanism rather than custom antivirus infrastructure.Desktop, tablet, and mobile are supported where practical. Device parity must not make important functionality unreasonably complex or impossible.After Finish submission, show a meaningful receipt before offering Upload another batch while the request remains active.Errors remain inline and explain what happened, why, and what the contributor should do. Successfully transferred files are not needlessly retransmitted because another file failed.KISS governs implementation.Implementation order: request data model and Ready Room dashboard; shared instructions and email workflow; public manifest/removal/size/receipt/error UX; naming/batch/history/accounting/provenance/hash; permissions/expiration/reminders/lifecycle; then evaluate maintained resumable upload and malware scanning; replace photo-contribute only after parity is proven.Deterministic AI instruction: routine work on this project must begin by rereading the ACTIVE RULES block and this CURRENT STATE block. Deeper historical or diagnostic material is supporting evidence and must not override current accepted truth unless new evidence changes that truth. 176-158-Upload Token System 177-159- 178-160-This is the authoritative reference for the generic public upload-token product implemented in skyhawk_site_fixes. 179-161- -- 182-164- 183-165-Public route: /upload/{token}. 184-166-Admin route: /admin/skyhawk/upload-tokens. 185-167-The public route is owned by UploadTokenForm. 186:168:Drupal core managed_file owns file selection, AJAX transfer, validation, and temporary file entities. 187-169-Files are stored under private://uploads/[token]/. 188-170-No custom synthetic mouse event or parallel direct-upload controller participates in the live product. 189-171- 190-172- 191-173-Public Upload Page Workflow 192-174- 193-175-The public page has no redundant generic Upload page title. Its identifying heading is Upload Files: [label]. 194-176-The secret token value is never displayed. 195:177:Selecting files is the upload action. Drupal core managed_file immediately starts AJAX transfer from the file-input change event. 196-178-Successful initial uploads become temporary Drupal managed files under private://uploads/[token]/. 197-179:The final action is Finish submission. 198-180-Skyhawk custom-form results never use Drupal messenger/status popups. Upload/finalization results render inline on the form using the established PageMessageTrait pattern required by Tier-1 Rule 8.3. 199-181- -- 204--- 205-193-Upload Rules 206-194- 207-195- 208:196-Multiple files may be selected. 209-197-Maximum individual file size is 511 MiB (535,822,336 bytes). 210:198-The hosting transport ceiling remains 512 MiB for an HTTP POST, so exceptionally large batches may need to be selected/uploaded separately even though each individual file is legal. 211:199:After Drupal receives temporary managed files, final submission makes them permanent, records each file in skyhawk_upload_file, increments cumulative file accounting, and sends the configured batch notification. 212-200-Completion notifications contain only the files finalized in that batch, not every historical file associated with the token. 213-201- 214-202- 215-203-Administration -- 218--- 219-215- 220-216-The old UploadTokenController and upload_token_mobile_fix.js are retired into the timestamped replacement backup rather than destroyed during initial acceptance testing. 221-217- 222:218-Functional acceptance remains pending until the Pixel test verifies: legal multi-file upload, final submission, private storage, history rows, notification, reuse of the same token, explicit revocation, expiry rejection, and oversize rejection. 223-219- 224-220-Current Functional State 225:221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226:222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227:223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228:224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230-226-Current Regression Token 231-227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- -- 237-1- 238-2- 239-3-LOST-D 240-4- 241:5:Current implementation slice: The 2026 A-4 acceptance corpus remains complete on Event 49464 with JULY and AUGUST retained as history and SEPTEMBER current. Reunion self-service source intake and Request a Reunion are installed. The established Ready Room management destination is My Reunion Events; the redundant My Reunions entry is retired. The next consequential boundary is the proof-of-concept keeper handoff: verify the intended primary and continuity member email/account relationships first. Do not rename Event 49464, reassign it, change authoritative account email, establish keeper authority, or send keeper instructions until those identity/email checks pass. 242-6- 243-7- 244-8-Member Communications 245-9-Improve logged-in member communication while protecting personal -- 294-55-raven_journal_index_534.csv is retained as the historical Raven source data. 295-56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- 303-64-Normal Skyhawk command-line work occurs interactively at the A2 prompt. 304-65-On this A2 environment, do not use Bash process substitution such as < <(...) for Skyhawk work. It has repeatedly failed through /dev/fd/*. 305- 306- 307:===== ACTIVE SOURCE HISTORY OWNERS ===== 308:ACTIVE_SKYHAWK_UPLOAD_FILE_SOURCE_HITS=1 309:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.install:177: $schema['skyhawk_upload_file'] = [ 310- 311-===== ACTIVE GENERIC FINISH/PERSISTENCE SOURCE ===== 312-===== FILE: /home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenForm.php ===== 313-SHA256=862ca045c49fdcda6ee0bb4e97630cc25049f4a9ac35433192d40aae858fbf94 -- 346-253- 347-254- $form['intro'] = [ 348-255- '#markup' => 349-256- '

    Each file may be up to 511 MiB. ' . 350:257- 'Selecting a file starts its upload. ' . 351-258- 'Wait until its filename says Ready to submit ' . 352--- 353-264- '#markup' => 354-265- '

    ' . -- 452-389- 453-390- if (empty($fids)) { 454-391- $form_state->setErrorByName( 455-392- 'files', 456:393- $this->t('Select at least one file.') 457-394- ); 458-395- } 459-396- } 460-397- -- 473-410- ); 474-411- return; 475-412- } 476-413- 477:414- $row = $this->loadToken($token); 478-415- 479-416- if ( 480--- 481-527- ) -- 563-624- \Drupal::database() 564-625: ->update('skyhawk_upload_token') 565-626- ->fields([ 566-627: 'uses_count' => 567:628: (int) $row->uses_count + $count, 568-629- ]) 569-630- ->condition('token', $token) 570-631- ->condition('status', 'active') 571-632- ->execute(); -- 601-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js:92: * This is Drupal core managed_file's own 602-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-93- * AJAX Upload submit control. 603-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-94- */ 604-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-95- const uploadButton = 605:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-96- widget.querySelector( 606:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-97- '[data-drupal-selector$="-upload-button"]' 607-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-98- ); 608-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-99- 609-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-100- if ( 610-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/js/upload-token-auto-upload.js-101- uploadButton && -- 665-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1019- } 666--- 667-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1029- */ 668-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1030- unset( 669:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1031- $form['create']['contact_select'], 670-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1032- $form['create']['new_contact_name'], 671-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1033- $form['create']['new_contact_username'], 672-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1034- $form['create']['new_contact_email'] 673-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1035- ); -- 703-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1104- } 704-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1105- 705-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1106- $token = $match[1]; 706-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1107- 707:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1108- $row = \Drupal::database() 708:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1109- ->select('skyhawk_upload_token', 't') 709-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module:1110: ->fields('t', ['purpose', 'data']) 710-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1111- ->condition('token', $token) 711-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1112- ->execute() 712-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1113- ->fetchObject(); 713-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1114- 714:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1115- if (!$row) { 715-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1116- return; 716-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1117- } 717-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1118- 718-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1119- $data = []; 719-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1120- 720:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1121- if (!empty($row->data)) { 721:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1122- $decoded = json_decode((string) $row->data, TRUE); 722--- 723-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1124- if (is_array($decoded)) { 724-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1125- $data = $decoded; 725-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1126- } -- 731-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1132- 732-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1133- if ($instructions === '') { 733-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1134- $instructions = 734-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1135- \Drupal\skyhawk_site_fixes\IntakePurpose::instructions( 735:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module:1136: (string) $row->purpose 736-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1137- ); 737-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1138- } 738-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1139- 739-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1140- if ($instructions === '') { -- 764-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1541- ], 765-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1542- ]; 766-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1543- 767-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1544- /* 768:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1545- * Rebuild Create section in its existing order and insert 769-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1546- * Reunion controls directly after Purpose. 770-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1547- */ 771-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1548- $create = []; 772:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1549- $inserted = FALSE; 773-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1550- 774-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1551- foreach ($form['create'] as $key => $element) { 775-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1552- $create[$key] = $element; 776-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1553- 777-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module:1554: if ($key === 'purpose') { 778-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1555- $create['reunion_security'] = 779-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1556- $reunion_security; 780-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1557- 781:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1558- $inserted = TRUE; 782-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1559- } 783-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1560- } 784-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1561- 785-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1562- /* 786-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1563- * Defensive fallback if the Purpose key changes later. 787-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1564- */ 788:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1565- if (!$inserted) { 789-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1566- $create['reunion_security'] = NO_MATCHES ===== FILE ENTITY / PHYSICAL / HASH EVIDENCE ===== 1-SKYHAWK AI DEBUG REPORT 2-Task: Deep read-only reconciliation of Generic Intake upload-history truth 3-Generated: 2026-08-31T19:52:03+00:00 4-Report-ID: 20260831T195202Z-1605488 5:Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-20260831T195202Z-1605488.txt 6-Host: s19522.use2.stableserver.net 7-Working directory: /home/darwus/drupalbeta/web 8-Drupal root: /home/darwus/drupalbeta/web 9- -- 23-No syntax errors detected in /tmp/skyhawk-upload-history-deep-audit-20260831T195202Z-1605488/read-references.php 24-RULES_NID=49418 25-RULES_BODY_READ=PASS 26-RULES_BODY_BYTES=56104 27:RULES_BODY_SHA256=b8bfc47aa6415c18669c8e38ddbd21c85adfeb9d218e141474e0ecb7e71d603a 28-GENERIC_NID=49455 29-GENERIC_BODY_READ=PASS 30-GENERIC_BODY_BYTES=27319 31:GENERIC_BODY_SHA256=42fe77fbc0a2983d5c83237f01337c6a0f4b9d408066dba2594b610aff593d6d 32-LOSTD_NID=2479 33-LOSTD_BODY_READ=PASS 34-LOSTD_BODY_BYTES=8126 35:LOSTD_BODY_SHA256=d928bb9757de22e7eb712584e84d1bd440f84322080414554578f6dd8a245b06 36-ENVIRONMENT_NID=49461 37-ENVIRONMENT_BODY_READ=PASS 38-ENVIRONMENT_BODY_BYTES=50832 39:ENVIRONMENT_BODY_SHA256=5f4c896877d0c02e7453afcd817ae9e53b5058466ed3de8233b2ce3c8d937d85 40-REFERENCE_BODY_READ_COMPLETE=PASS 41- 42-===== RELEVANT REFERENCE TEXT ===== 43-===== RULES RELEVANT TEXT ===== 44-1:ACTIVE RULES - READ BEFORE SKYHAWK WORKPurpose: These Rules are the durable operating contract for Skyhawk.org work. They exist to preserve progress, reduce repeated mistakes, and make external behavior from a probabilistic AI as deterministic and recoverable as practical.Mandatory Execution ContractEvery executable Skyhawk.org code block must begin with this literal first line:# RULES + GERMANE REFERENCE READIf that line is absent, the block is procedurally invalid and should not be run.Before writing executable code, reread this ACTIVE RULES block and the CURRENT STATE block of the germane project reference. Read deeper supporting sections only when they are relevant to the task.Inspect actual current state before modification when state is uncertain.Apply KISS. Use the simplest maintainable solution that satisfies the proven requirement. Complexity requires evidence.Prefer Drupal core, configuration, Views, and maintained contributed functionality before custom mechanisms.Do not reopen accepted work without new contradictory evidence.When one requirement fails, investigate that requirement rather than reaudit or redesign unrelated working functionality.Test user and business outcomes first. Inspect internal transitions only when an outcome fails and only deeply enough to identify and repair that failure.When an existing owner is identifiable, know and replace cleanly rather than append competing code or configuration.After every result, determine whether current truth actually changed. Update the Rules or project reference only when needed. 45-2-Authorization Establishment and Exercise 46-3- 47-4- Do not repeat an authorization ceremony when authoritative, scoped responsibility has already been established and remains valid. 48:5- Use durable authoritative principal identity for continuing responsibility. Tokens and verification links are mechanisms for establishing or verifying authority, not permanent identities. 49-6- Routine consequential actions must still re-check authenticated identity, current eligibility required by the product, scoped authority, persisted state, and the independent postconditions of the action. 50-7- If current eligibility cannot be determined from an authoritative source, do not invent or infer it. Restrict the operation to an explicitly accepted transitional fixture or stop until the authoritative contract is available. 51--- 52-180-6. Standard AI Debug Channel 53-181- 54-182-The debug channel exists to eliminate routine copy/paste between Termux, Windows, Mac, mobile devices, and the AI. 55-183- 56:184-Authoritative current-report URL: https://skyhawk.org/downloads/chatgpt-debug-latest.txt. 57-185- 58-186:The authoritative latest file contains the complete current report, not merely a pointer. Each diagnostic run also creates an immutable archive report named with a unique Report-ID, such as /downloads/chatgpt-debug-20260824T164135Z-698130.txt. The immutable archive is retained as historical execution evidence, but the AI normally reads the fixed latest URL directly. 59-187- 60:188-Publish atomically. Build the complete report in a temporary file. After the report is finished, move it into the immutable archive filename, then copy that completed archive to a temporary latest filename and atomically move the temporary latest file into /downloads/chatgpt-debug-latest.txt. Never stream a still-changing report directly into either public filename. 61-189- 62-190-The complete report must begin with: 63-191- 64-192-SKYHAWK AI DEBUG REPORT 65-193-Task: 66-194-Generated: 67-195:Report-ID: 68:196:Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-.txt 69-197-Host: 70-198-Working directory: 71-199-Drupal root: /home/darwus/drupalbeta/web 72:200- 73-201-===== PRE-FLIGHT ===== 74-202-... 75--- 76-207-===== VERIFICATION ===== -- 91-222- 92-223- 93-224-Promote the relevant final evidence automatically. Every diagnostic or test block must finish by placing the evidence that determines the next state into /downloads/chatgpt-debug-latest.txt. Gene must not be required to run a second copy/promote command after the test. 94-225- 95:226:Keep immutable evidence separately. Installation or diagnostic runs continue to create their immutable Report-ID archive. A temporary live-event stream may use its own fixed file while the test is occurring, but when the test produces the evidence needed for the next decision, that evidence must be atomically promoted to chatgpt-debug-latest.txt. 96-227- 97:228-The fixed latest URL is the normal machine handoff. After Gene reports that a command or requested test is complete, the AI should retrieve https://skyhawk.org/downloads/chatgpt-debug-latest.txt itself, force freshness when possible, and validate the contents before asking Gene for output. The immutable archive is fallback evidence, not a routine human relay requirement. 98-229- 99-230-Live browser instrumentation must self-report. When a browser/device action is the only human-dependent step, the observer or diagnostic mechanism must capture and publish the resulting evidence automatically. Gene's role should end with performing the irreducible device action, such as choosing files on the Pixel. 100-231- 101-232-Do not overwrite useful evidence prematurely. A subsequent installation report, smoke test, cleanup action, or unrelated diagnostic must not replace chatgpt-debug-latest.txt before the AI has consumed the evidence from the just-completed functional test. -- 171-153-styled so that a user is unlikely to miss required action. Generic 172-154-Drupal messenger popups are not the target UX for these custom 173-155-member-facing workflows. 174-156- 175:157:CURRENT STATE - GENERIC INTAKE SYSTEMProject: Generic Intake SystemStatus: In developmentUltimate goal: A self-service, reusable, aesthetically integrated intake framework that lets authorized nontechnical Ready Room users create purpose-specific public file requests without webmaster assistance. The underlying upload engine remains generic for future uses.Current accepted functionality:Drupal core managed_file owns automatic initial file transfer.Generic file acceptance is proven. Format-specific diagnosis is closed absent contradictory evidence.Token-specific private storage under private://uploads/[token]/ is proven.Finish submission and permanent-file finalization are proven.Reusable token behavior is proven.The current Pixel/Chrome public upload presentation is accepted.The redundant generic Upload title is closed work.Public Drupal status-popup behavior was corrected toward the established inline PageMessage pattern.Accepted request/invitation gate: real Ready Room testing proved explicit recipient routing, request-data persistence, the canonical https://skyhawk.org/upload/{token} invitation, the same stored request instructions in the actual email and public upload page, and on-page Ready Room request confirmation. Accepted by Report-ID 20260830T161100Z-2299062. Current implementation slice: prove the shared Event framework with the real 2026 A-4 Skyhawk Reunion corpus. JULY creates exactly one Event; AUGUST reconciles that same Event; SEPTEMBER reconciles the same Event to the current pre-event state while preserving prior updates. No duplicate Event nodes.Next implementation principle: preserve the proven uploader/finalization engine and evolve the surrounding request-management system. Do not rewrite the working upload path merely to implement the broader framework.Closed work: extension and MIME enumeration, image-versus-video diagnosis, synthetic upload triggering, custom serializer/queue transfer experiments, generic Upload page title, and repeated reproving of accepted core transfer/finalization behavior.Reopen closed work only when: new contradictory functional evidence demonstrates that the accepted behavior is no longer true.Current Agreed Product DecisionsThe Ready Room menu links directly to an Upload Requests dashboard. Individual public requests do not become menu entries.Granular Drupal permissions, assigned to roles, govern creation, management, reassignment, lifecycle actions, viewing submissions, and permanent deletion.Request-specific instructions are entered once and dynamically reused in both the invitation email and public upload page. The live page is authoritative when instructions change.The underlying uploader remains format-agnostic even when a request expects ZIP files, photographs, video, documents, or other material.Public size language uses industry-standard decimal MB where 1 MB equals 1,000,000 bytes, plus the exact comma-separated byte count where useful.The configured limit is per individual file, not the aggregate of multiple files in a submission.Large collections are split among multiple files or ZIP archives rather than reducing original photo or video quality merely to fit a limit.Removal before Finish submission is required. Each file gets a clear individual Remove action rather than Drupal selection checkboxes.The pre-finish manifest shows filename, MB, exact bytes, status, and Remove, plus file count and aggregate size.Resumable transfer is desirable for large files if a maintained Drupal-compatible solution can provide it simply. Do not build a custom resumable-upload platform.SA controls stored/internal filenames for sortable, collision-resistant recovery. Original contributor filenames remain preserved as metadata. Database fields, not filename parsing, remain authoritative for Views.Each request has an immutable human-friendly ID and each Finish submission has a batch identity.Useful provenance is retained, including original/generated filename, request, batch, known source/contributor information, timestamps, size, and relevant supplied metadata.Exact duplicate hashes may be retained for integrity and later duplicate identification, but exact duplicates are not automatically rejected because provenance can differ.The responsible party determines the intended disposition of each request. Receipt and automatic publication are separate concepts.Original files are preserved by default, while storage and retention policy may be revisited if storage becomes a material constraint.ZIP preservation or extraction depends on purpose, permissions, and downstream workflow rather than one universal rule.Copyright remains with whoever legally owns it. Upload does not itself transfer copyright to SA.Contributors should represent, to the best of their knowledge, that they are entitled to provide the material and are not knowingly violating another persons rights.Applicable photo policy grants SA appropriate continuing non-exclusive permission to preserve, reproduce, migrate or convert, adapt for presentation, publish, and use contributed material in Association activities and publications.SA remains the sole arbiter of whether and under what conditions photographs administered or distributed through the SA website are provided or authorized for third-party use, without claiming copyright SA does not own.Known photographer/source and SA credit may both be used publicly as appropriate, while full provenance remains preserved internally.The upload system does not ask contributors to manage future contact requests. SA may forward a legitimate contact request to the known owner/source. The requester is told that no response within the defined period means no permission or contact. Silence is never consent.Photo-oriented requests may support both a batch description and optional per-photo descriptions plus other appropriate configurable metadata.The exact applicable rights/agreement version, request, batch, and acceptance time are retained.The existing photo-contribution workflow is superseded only after the generic framework proves equivalent or better required functionality.Successful submission normally produces one internal summary per completed batch.Requests may generate up to two sensible expiration reminders, but any successful submission cancels outstanding reminder prompting for that request.The system does not automatically nag the contributor. The creator can resend the active request and current dynamically generated instructions.Successful received material is not automatically deleted. Truly abandoned temporary material may be cleaned up conservatively under documented policy.Arbitrary contributed files are treated as untrusted until appropriately reviewed or scanned. Prefer a simple maintained scanning mechanism rather than custom antivirus infrastructure.Desktop, tablet, and mobile are supported where practical. Device parity must not make important functionality unreasonably complex or impossible.After Finish submission, show a meaningful receipt before offering Upload another batch while the request remains active.Errors remain inline and explain what happened, why, and what the contributor should do. Successfully transferred files are not needlessly retransmitted because another file failed.KISS governs implementation.Implementation order: request data model and Ready Room dashboard; shared instructions and email workflow; public manifest/removal/size/receipt/error UX; naming/batch/history/accounting/provenance/hash; permissions/expiration/reminders/lifecycle; then evaluate maintained resumable upload and malware scanning; replace photo-contribute only after parity is proven.Deterministic AI instruction: routine work on this project must begin by rereading the ACTIVE RULES block and this CURRENT STATE block. Deeper historical or diagnostic material is supporting evidence and must not override current accepted truth unless new evidence changes that truth. 176-158-Upload Token System 177-159- 178-160-This is the authoritative reference for the generic public upload-token product implemented in skyhawk_site_fixes. 179-161- -- 182-164- 183-165-Public route: /upload/{token}. 184-166-Admin route: /admin/skyhawk/upload-tokens. 185-167-The public route is owned by UploadTokenForm. 186:168:Drupal core managed_file owns file selection, AJAX transfer, validation, and temporary file entities. 187:169-Files are stored under private://uploads/[token]/. 188-170-No custom synthetic mouse event or parallel direct-upload controller participates in the live product. 189-171- 190-172- 191-173-Public Upload Page Workflow 192-174- 193-175-The public page has no redundant generic Upload page title. Its identifying heading is Upload Files: [label]. 194-176-The secret token value is never displayed. 195-177:Selecting files is the upload action. Drupal core managed_file immediately starts AJAX transfer from the file-input change event. 196:178-Successful initial uploads become temporary Drupal managed files under private://uploads/[token]/. 197-179:The final action is Finish submission. 198-180-Skyhawk custom-form results never use Drupal messenger/status popups. Upload/finalization results render inline on the form using the established PageMessageTrait pattern required by Tier-1 Rule 8.3. 199-181- 200-182-Token Lifecycle -- 206-194- 207-195- 208-196-Multiple files may be selected. 209-197-Maximum individual file size is 511 MiB (535,822,336 bytes). 210:198-The hosting transport ceiling remains 512 MiB for an HTTP POST, so exceptionally large batches may need to be selected/uploaded separately even though each individual file is legal. 211:199:After Drupal receives temporary managed files, final submission makes them permanent, records each file in skyhawk_upload_file, increments cumulative file accounting, and sends the configured batch notification. 212:200-Completion notifications contain only the files finalized in that batch, not every historical file associated with the token. 213-201- 214-202- 215-203-Administration 216-204- -- 222-218-Functional acceptance remains pending until the Pixel test verifies: legal multi-file upload, final submission, private storage, history rows, notification, reuse of the same token, explicit revocation, expiry rejection, and oversize rejection. 223-219- 224-220-Current Functional State 225-221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226:222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227-223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228:224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230-226-Current Regression Token 231:227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- 233-229-Reunion Keeper Communication and Acknowledgment 234-230- 235- -- 294-55-raven_journal_index_534.csv is retained as the historical Raven source data. 295-56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- -- 309-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.install:177: $schema['skyhawk_upload_file'] = [ 310- 311-===== ACTIVE GENERIC FINISH/PERSISTENCE SOURCE ===== 312-===== FILE: /home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenForm.php ===== 313:SHA256=862ca045c49fdcda6ee0bb4e97630cc25049f4a9ac35433192d40aae858fbf94 314- 315-222- '
    '; 316-223- } 317-224- else { -- 367-278- $form['files'] = [ 368-279- '#type' => 'managed_file', 369-280- '#title' => $this->t('Upload files'), 370-281- '#upload_location' => 371:282: 'private://uploads/' . $token . '/', 372-283- '#multiple' => TRUE, 373-284- '#weight' => 30, 374-285- '#description' => 375-286- \Drupal\Core\Render\Markup::create( -- 534-595- $submitted_names = []; 535-596- 536-597- foreach ($files as $file) { 537-598- /* 538:599- * Core managed_file created the temporary file entity. 539-600- * Final submission makes that exact current-batch file 540:601- * permanent. 541-602- */ 542:603: $file->setPermanent(); 543-604- $file->save(); 544-605- 545-606- $submitted_names[] = 546-607- (string) $file->getFilename(); -- 621-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-196- break; 622-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-197- 623-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-198- case 'upload_token_completed': 624-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-199- $message['subject'] = "[$site_name] Upload received: {$params['label']}"; 625:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-200- $message['body'][] = "A file upload has been completed."; 626-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-201- $message['body'][] = "Description: {$params['label']}"; 627-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module:202: $message['body'][] = "Purpose: {$params['purpose']}"; 628-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-203- $message['body'][] = "Token was sent to: {$params['recipient_email']}"; 629-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-204- $message['body'][] = "Completed: {$params['completed_time']}"; -- 694-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1056- ]; 695-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1057- 696--- 697-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1098- if (!preg_match( 698:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1099- '#https?://[^\s]+/upload/([A-Za-z0-9_-]+)#', 699-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1100- $body, 700-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1101- $match 701-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1102- )) { 702-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.module-1103- return; -- 948-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-436- $uri = 949-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-437- (string) $file->getFileUri(); 950-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-438- 951-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-439- $privatePrefix = 952:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php:440: 'private://uploads/' . 953-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-441- $token . 954-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-442- '/'; 955-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-443- 956-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-444- $publicPrefix = 957-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-445- $eventNid > 0 958:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-446- ? 'public://reunions/' . 959-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-447- $eventNid . 960-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-448- '/' . 961-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-449- $file->id() . 962-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-450- '/' -- 998-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-896- } 999-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-897- } 1000-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-898- 1001-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-899- /* 1002:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-900- * Only now change the managed file entity. 1003-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-901- */ NO_MATCHES ===== OLDER IMMUTABLE REPORT REFERENCES ===== 4098-EVENT_49464_NEWSLETTER_FIDS=61767,61768,61769 4099-DATABASE_AUDIT_COMPLETE=PASS 4100- 4101-===== KNOWN IMMUTABLE REPORT EVIDENCE ===== 4102:===== REPORT-ID 20260831T000619Z-6566488 ===== 4103:REPORT_FILE=/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T000619Z-6566488.txt 4104-SHA256=91e6049776575c07fb66eac46929ddab9f97a58fa68ecfdec6a5ce57d15f4082 4105-15-GENERAL_CURRENT_MEMBER_GATE=deferred_to_authoritative_roster_reconciliation 4106-16-TOKEN_CREATED=NO 4107-17-TOKEN_USED=NO -- 4128-38-===== PROCESS CHECKSUM ===== 4129-39-RULES REVIEWED: YES 4130-40-GERMANE REFERENCE REVIEWED: YES 4131- 4132:===== REPORT-ID 20260831T003407Z-377803 ===== 4133:REPORT_FILE=/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T003407Z-377803.txt 4134-SHA256=5a30461d940dc75cc8174fdefdc866eaaf8af708bbdf876a6638adb31198420c 4135-18-===== SEPTEMBER PRE-FLIGHT ===== 4136-19-EVENT_NID=49464 4137-20-EVENT_PUBLISHED=YES -- 4202-143-===== SAFETY ===== 4203-144-NEW_REUNION_CREATED_BY_INSTALL=NO 4204-145-EVENT_49464_MUTATED_BY_INSTALL=NO 4205- 4206:===== REPORT-ID 20260831T030109Z-1004450 ===== 4207:REPORT_FILE=/home/darwus/drupalbeta/web/downloads/chatgpt-debug-20260831T030109Z-1004450.txt 4208-SHA256=98c43fdb052db71d8efd8eebde62f2269ff35496a2e3457fdba5b4503151b03c 4209-1-SKYHAWK AI DEBUG REPORT 4210-2:Task: Conservative cleanup after 2026 Skyhawkers Reunion acceptance/handoff POC 4211-3-Generated: 2026-08-31T03:01:11+00:00 4212:4-Report-ID: 20260831T030109Z-1004450 4213:5-Archive-URL: https://skyhawk.org/downloads/chatgpt-debug-20260831T030109Z-1004450.txt 4214-6- 4215-7-===== PREFLIGHT ===== 4216--- 4217-10-LOSTD=PASS ===== EXPLICIT PASS FAIL UNRESOLVED FINDINGS ===== 21- 22-===== ACTUAL REFERENCE BODY READ ===== 23-No syntax errors detected in /tmp/skyhawk-upload-history-deep-audit-20260831T195202Z-1605488/read-references.php 24-RULES_NID=49418 25:RULES_BODY_READ=PASS 26-RULES_BODY_BYTES=56104 27-RULES_BODY_SHA256=b8bfc47aa6415c18669c8e38ddbd21c85adfeb9d218e141474e0ecb7e71d603a 28-GENERIC_NID=49455 29:GENERIC_BODY_READ=PASS 30-GENERIC_BODY_BYTES=27319 31-GENERIC_BODY_SHA256=42fe77fbc0a2983d5c83237f01337c6a0f4b9d408066dba2594b610aff593d6d 32-LOSTD_NID=2479 33:LOSTD_BODY_READ=PASS 34-LOSTD_BODY_BYTES=8126 35-LOSTD_BODY_SHA256=d928bb9757de22e7eb712584e84d1bd440f84322080414554578f6dd8a245b06 36-ENVIRONMENT_NID=49461 37:ENVIRONMENT_BODY_READ=PASS 38-ENVIRONMENT_BODY_BYTES=50832 39-ENVIRONMENT_BODY_SHA256=5f4c896877d0c02e7453afcd817ae9e53b5058466ed3de8233b2ce3c8d937d85 40:REFERENCE_BODY_READ_COMPLETE=PASS 41- 42-===== RELEVANT REFERENCE TEXT ===== 43-===== RULES RELEVANT TEXT ===== 44:1:ACTIVE RULES - READ BEFORE SKYHAWK WORKPurpose: These Rules are the durable operating contract for Skyhawk.org work. They exist to preserve progress, reduce repeated mistakes, and make external behavior from a probabilistic AI as deterministic and recoverable as practical.Mandatory Execution ContractEvery executable Skyhawk.org code block must begin with this literal first line:# RULES + GERMANE REFERENCE READIf that line is absent, the block is procedurally invalid and should not be run.Before writing executable code, reread this ACTIVE RULES block and the CURRENT STATE block of the germane project reference. Read deeper supporting sections only when they are relevant to the task.Inspect actual current state before modification when state is uncertain.Apply KISS. Use the simplest maintainable solution that satisfies the proven requirement. Complexity requires evidence.Prefer Drupal core, configuration, Views, and maintained contributed functionality before custom mechanisms.Do not reopen accepted work without new contradictory evidence.When one requirement fails, investigate that requirement rather than reaudit or redesign unrelated working functionality.Test user and business outcomes first. Inspect internal transitions only when an outcome fails and only deeply enough to identify and repair that failure.When an existing owner is identifiable, know and replace cleanly rather than append competing code or configuration.After every result, determine whether current truth actually changed. Update the Rules or project reference only when needed. 45-2-Authorization Establishment and Exercise 46-3- 47-4- Do not repeat an authorization ceremony when authoritative, scoped responsibility has already been established and remains valid. 48-5- Use durable authoritative principal identity for continuing responsibility. Tokens and verification links are mechanisms for establishing or verifying authority, not permanent identities. -- 80-211-===== END ===== 81-212- 82-213:Freshness is mandatory. After Gene confirms that a report was updated, the AI reads chatgpt-debug-latest.txt and validates Task:, Generated:, Report-ID:, host, working directory, and Drupal root against the current work before relying on it. 83-214- 84:215-If the first retrieval is stale, that is a retrieval-layer failure, not evidence that the A2 command failed. Retry the known latest URL with a cache-busting query value when the retrieval tool permits it. Do not report server failure merely because an intermediary served an older object. 85-216- 86-217-Do not ask Gene to paste terminal output merely because retrieval is stale. Manual copy/paste is a fallback only when the fixed latest-report channel cannot be read after reasonable fresh-retrieval attempts. 87-218- 88:219-Never place secrets in public debug reports. Do not include passwords, private keys, session cookies, API keys, active upload tokens, personal data, database credentials, or other sensitive material. Redact before publication. 89-220- 90-221-Capture enough evidence to determine the next state, not thousands of irrelevant lines. Use the older A2-to-Windows report-transfer workflow only when Gene actually needs a local file.Debug Evidence Promotion 91-222- 92-223- -- 107-464-3. Evidence Automatically Controls the Next Step 108-465- 109-466:When executable work creates an authoritative or immutable report, the AI must retrieve and read it automatically before diagnosis or further executable work. 110-467-The human must never have to tell the AI to read evidence generated by the AI's own workflow. 111:468-Failure diagnosis must come from actual evidence, not intended behavior, memory, assumptions or footer wording. 112-469-When only one safe evidence-supported AI-owned next action remains, the AI must provide that executable action automatically in the same response. The human is not required to ask "next." 113-470- 114-471- 115:472-4. A Response Cannot Promise Its Own Missing Work 116--- 117-475-A response may stop only for genuine human judgment/action, unavailable required evidence, a safety/authorization boundary, or completed work. 118:476-Writing "NEXT: AI will provide code" without providing the code is a failure. 119-477- 120-478- 121:479-5. Executable Blocks Must Fail Closed 122-480- 123-481:Every executable block must begin with the literal first line # RULES + GERMANE REFERENCE READ. 124:482-AI-generated blocks must use control flow that is valid for the actual shell/context and mechanically prevents later mutating steps after a failed prerequisite. 125-483-Do not use top-level shell constructs that cannot stop the running context. Test shell syntax before mutation when practical. 126:484-PASS, FAIL, UPDATE REQUIRED, BACKUP REQUIRED and NEXT must reflect gates that actually completed. Intended results never override execution evidence. 127:485-After a failure, repair the proven failure only. Do not reopen completed work or redesign unrelated components. 128-486- 129-487- 130- 131-===== GENERIC RELEVANT TEXT ===== -- 143-12- 144-13- 145-14-For Reunion source updates, the contributor filename is provenance and presentation metadata, not semantic authority. Acceptance must not require a month, year, Event name, or other business meaning to be encoded in the filename. The workflow determines the target Event; exactly one real PDF and the applicable authorization, duplicate-content, persistence, and public-verification gates determine acceptance. Skyhawk may use a deterministic internal stored path while preserving the original contributor filename. 146-15- A Reunion benefit is initiated by the Association member who accepts responsibility for it. Normal future design requires that member to be authenticated. 147:16- The authenticated Drupal UID is the durable identity. Account email is the authoritative contact value presented from Drupal; a changed email must be verified before becoming authoritative. 148-17: Once responsibility has been established, routine Reunion newsletter/source updates are performed through authenticated Ready Room access. A new Generic Intake token is not required for each update. 149-18- Existing token/request records remain immutable historical evidence of how earlier authority was established. The 2026 A-4 JULY bootstrap remains token-established history. 150-19- Each consequential Reunion update records the executing UID, time, previous current file, resulting current file, and verification outcome. Drupal revision history is preferred where it provides that evidence without another custom tracking subsystem. 151-20- Current Association membership is required to exercise production Reunion authority. Reliable generalized current-member eligibility must use the authoritative membership state after the documented roster reconciliation; it must not be guessed from unrelated data. -- 160-29- 161-30: The responsible authenticated member may provide Reunion source material either by uploading one ordinary source document through Drupal core managed_file or by pasting source text directly. 162-31- Uploaded source intake remains format-agnostic. PDF, DOC/DOCX, TXT and other ordinary source documents are not assigned business meaning from their filename or extension. Normal Drupal and hosting safety constraints still apply. 163-32- Pasted text is stored directly as submitted source content. The system does not manufacture a fake text file merely to force pasted material through a file-upload abstraction. 164:33- The submitted source is authoritative input. Parsing or model extraction produces proposed structured facts only. Extraction failure does not invalidate an otherwise preserved source. 165-34- A new self-service Reunion request creates an unpublished Reunion Event draft owned by the authenticated requester. That draft is the durable occurrence identity; later parsing/review updates the same entity rather than creating a duplicate Event. 166-35- General production activation still requires authoritative current-membership eligibility and the required primary/continuity-member relationship. Until the membership-roster reconciliation provides that deterministic contract, creation of a private draft does not itself grant publication/update authority. 167-36- Replacement/update sources reconcile the existing Event. Prior accepted sources and relevant source history remain associated with the same Event. 168--- -- 171-153-styled so that a user is unlikely to miss required action. Generic 172-154-Drupal messenger popups are not the target UX for these custom 173-155-member-facing workflows. 174-156- 175:157:CURRENT STATE - GENERIC INTAKE SYSTEMProject: Generic Intake SystemStatus: In developmentUltimate goal: A self-service, reusable, aesthetically integrated intake framework that lets authorized nontechnical Ready Room users create purpose-specific public file requests without webmaster assistance. The underlying upload engine remains generic for future uses.Current accepted functionality:Drupal core managed_file owns automatic initial file transfer.Generic file acceptance is proven. Format-specific diagnosis is closed absent contradictory evidence.Token-specific private storage under private://uploads/[token]/ is proven.Finish submission and permanent-file finalization are proven.Reusable token behavior is proven.The current Pixel/Chrome public upload presentation is accepted.The redundant generic Upload title is closed work.Public Drupal status-popup behavior was corrected toward the established inline PageMessage pattern.Accepted request/invitation gate: real Ready Room testing proved explicit recipient routing, request-data persistence, the canonical https://skyhawk.org/upload/{token} invitation, the same stored request instructions in the actual email and public upload page, and on-page Ready Room request confirmation. Accepted by Report-ID 20260830T161100Z-2299062. Current implementation slice: prove the shared Event framework with the real 2026 A-4 Skyhawk Reunion corpus. JULY creates exactly one Event; AUGUST reconciles that same Event; SEPTEMBER reconciles the same Event to the current pre-event state while preserving prior updates. No duplicate Event nodes.Next implementation principle: preserve the proven uploader/finalization engine and evolve the surrounding request-management system. Do not rewrite the working upload path merely to implement the broader framework.Closed work: extension and MIME enumeration, image-versus-video diagnosis, synthetic upload triggering, custom serializer/queue transfer experiments, generic Upload page title, and repeated reproving of accepted core transfer/finalization behavior.Reopen closed work only when: new contradictory functional evidence demonstrates that the accepted behavior is no longer true.Current Agreed Product DecisionsThe Ready Room menu links directly to an Upload Requests dashboard. Individual public requests do not become menu entries.Granular Drupal permissions, assigned to roles, govern creation, management, reassignment, lifecycle actions, viewing submissions, and permanent deletion.Request-specific instructions are entered once and dynamically reused in both the invitation email and public upload page. The live page is authoritative when instructions change.The underlying uploader remains format-agnostic even when a request expects ZIP files, photographs, video, documents, or other material.Public size language uses industry-standard decimal MB where 1 MB equals 1,000,000 bytes, plus the exact comma-separated byte count where useful.The configured limit is per individual file, not the aggregate of multiple files in a submission.Large collections are split among multiple files or ZIP archives rather than reducing original photo or video quality merely to fit a limit.Removal before Finish submission is required. Each file gets a clear individual Remove action rather than Drupal selection checkboxes.The pre-finish manifest shows filename, MB, exact bytes, status, and Remove, plus file count and aggregate size.Resumable transfer is desirable for large files if a maintained Drupal-compatible solution can provide it simply. Do not build a custom resumable-upload platform.SA controls stored/internal filenames for sortable, collision-resistant recovery. Original contributor filenames remain preserved as metadata. Database fields, not filename parsing, remain authoritative for Views.Each request has an immutable human-friendly ID and each Finish submission has a batch identity.Useful provenance is retained, including original/generated filename, request, batch, known source/contributor information, timestamps, size, and relevant supplied metadata.Exact duplicate hashes may be retained for integrity and later duplicate identification, but exact duplicates are not automatically rejected because provenance can differ.The responsible party determines the intended disposition of each request. Receipt and automatic publication are separate concepts.Original files are preserved by default, while storage and retention policy may be revisited if storage becomes a material constraint.ZIP preservation or extraction depends on purpose, permissions, and downstream workflow rather than one universal rule.Copyright remains with whoever legally owns it. Upload does not itself transfer copyright to SA.Contributors should represent, to the best of their knowledge, that they are entitled to provide the material and are not knowingly violating another persons rights.Applicable photo policy grants SA appropriate continuing non-exclusive permission to preserve, reproduce, migrate or convert, adapt for presentation, publish, and use contributed material in Association activities and publications.SA remains the sole arbiter of whether and under what conditions photographs administered or distributed through the SA website are provided or authorized for third-party use, without claiming copyright SA does not own.Known photographer/source and SA credit may both be used publicly as appropriate, while full provenance remains preserved internally.The upload system does not ask contributors to manage future contact requests. SA may forward a legitimate contact request to the known owner/source. The requester is told that no response within the defined period means no permission or contact. Silence is never consent.Photo-oriented requests may support both a batch description and optional per-photo descriptions plus other appropriate configurable metadata.The exact applicable rights/agreement version, request, batch, and acceptance time are retained.The existing photo-contribution workflow is superseded only after the generic framework proves equivalent or better required functionality.Successful submission normally produces one internal summary per completed batch.Requests may generate up to two sensible expiration reminders, but any successful submission cancels outstanding reminder prompting for that request.The system does not automatically nag the contributor. The creator can resend the active request and current dynamically generated instructions.Successful received material is not automatically deleted. Truly abandoned temporary material may be cleaned up conservatively under documented policy.Arbitrary contributed files are treated as untrusted until appropriately reviewed or scanned. Prefer a simple maintained scanning mechanism rather than custom antivirus infrastructure.Desktop, tablet, and mobile are supported where practical. Device parity must not make important functionality unreasonably complex or impossible.After Finish submission, show a meaningful receipt before offering Upload another batch while the request remains active.Errors remain inline and explain what happened, why, and what the contributor should do. Successfully transferred files are not needlessly retransmitted because another file failed.KISS governs implementation.Implementation order: request data model and Ready Room dashboard; shared instructions and email workflow; public manifest/removal/size/receipt/error UX; naming/batch/history/accounting/provenance/hash; permissions/expiration/reminders/lifecycle; then evaluate maintained resumable upload and malware scanning; replace photo-contribute only after parity is proven.Deterministic AI instruction: routine work on this project must begin by rereading the ACTIVE RULES block and this CURRENT STATE block. Deeper historical or diagnostic material is supporting evidence and must not override current accepted truth unless new evidence changes that truth. 176-158-Upload Token System 177-159- 178-160-This is the authoritative reference for the generic public upload-token product implemented in skyhawk_site_fixes. 179-161- -- 222-218-Functional acceptance remains pending until the Pixel test verifies: legal multi-file upload, final submission, private storage, history rows, notification, reuse of the same token, explicit revocation, expiry rejection, and oversize rejection. 223-219- 224-220-Current Functional State 225-221:Generic initial upload: ACCEPTED. Drupal core managed_file selection and automatic AJAX transfer to token-scoped private storage are proven. File-format diagnosis is closed. 226:222:Finish submission permanent-file transition: ACCEPTED. Direct Pixel testing proved selection, automatic upload, Finish submission, permanent managed-file state in private://uploads/[token]/, and reset of the form for another batch. 227:223-Public upload-page UX: ACCEPTED on Pixel/Chrome. The redundant generic Upload title is absent. Upload Files: [label] remains as the identifying heading. The repaired public-page presentation has passed direct browser inspection. This branch is closed absent contradictory evidence. 228-224:Current acceptance boundary: upload history. The first remaining unproven transition is whether Finish submission creates the required skyhawk_upload_file history row for each finalized file. Do not reopen generic upload, permanent-file finalization, or the accepted Pixel UX while resolving history. 229-225- 230-226-Current Regression Token 231:227-No token label is permanently reserved as the regression token. Use a currently active, unexpired test token from the existing token system. Do not create a replacement token merely because an upload test fails. 232-228- 233-229-Reunion Keeper Communication and Acknowledgment 234-230- 235- -- 237-1- 238-2- 239-3-LOST-D 240-4- 241:5:Current implementation slice: The 2026 A-4 acceptance corpus remains complete on Event 49464 with JULY and AUGUST retained as history and SEPTEMBER current. Reunion self-service source intake and Request a Reunion are installed. The established Ready Room management destination is My Reunion Events; the redundant My Reunions entry is retired. The next consequential boundary is the proof-of-concept keeper handoff: verify the intended primary and continuity member email/account relationships first. Do not rename Event 49464, reassign it, change authoritative account email, establish keeper authority, or send keeper instructions until those identity/email checks pass. 242-6- 243-7- 244-8-Member Communications 245-9-Improve logged-in member communication while protecting personal -- 294-55-raven_journal_index_534.csv is retained as the historical Raven source data. 295-56-Do not recreate the standalone raw journal_index SQL table unless a future proven requirement specifically requires it. 296-57- 297-58- 298:59:Drupal Environment - Live Technical MapPurpose: Durable current architecture needed to continue Skyhawk.org work without rediscovery. Transient diagnostics and rapidly aging update availability are generated when needed rather than stored here.Runtime and PlatformDrupal core: 11.4.5PHP: 8.4.20Drush: Composer: Composer version 2.9.4 2026-01-22 14:08:50Drupal document root: /home/darwus/drupalbeta/webDatabase driver: mysql; server version: 11.4.11-MariaDBCurrent Drupal DB-session isolation: REPEATABLE-READHTTP server header: server: LiteSpeedCommand-Line AccessNormal command-line work occurs interactively at the A2 prompt.Canonical Pixel connection: ssh -p 22 darwus@65.181.120.151.Do not invent or assume an SSH alias. Pixel file transfers use the same explicit host/user/port.Normal work leaves the A2 session open. Exit/reconnect is reserved for required local downloads such as verified database backups.Themes and Asset DeliveryDefault theme: bootstrap_barrioAdmin theme: bootstrap_barrioCSS aggregation: enabled; JS aggregation: enabled.Aggregated browser filenames are delivery artifacts and are not authoritative evidence of source ownership.Installed/enabled themes (2)Bootstrap Barrio [bootstrap_barrio] | themes/contrib/bootstrap_barrio | DEFAULT, ADMINClaro [claro] | core/themes/claroCanonical Skyhawk CSS / JS OwnershipGlobal Skyhawk CSS owner: modules/custom/skyhawk_site_fixes/css/skyhawk-global.css - present.Site-specific integration belongs under modules/custom/skyhawk_site_fixes, not inside contributed projects.Semantic visual vocabulary: skyhawk-focus, skyhawk-feature, skyhawk-context, skyhawk-note, skyhawk-reference, skyhawk-navy, skyhawk-marine, skyhawk-joint, skyhawk-heritage.Bold colors are punctuation; muted colors are prose. Color is never the sole indicator of meaning.LOST-D is the proving page for the semantic visual system.Custom CSS / JS files (27)modules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/upload_token_public.cssmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/upload_transition_observer.jsmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/serial_managed_file_upload.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/managed_file_queue.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/upload_token_mobile_fix.jsmodules/custom/skyhawk_site_fixes/css/legacy.cssmodules/custom/skyhawk_site_fixes/css/model-build.cssmodules/custom/skyhawk_site_fixes/css/modeling-review.cssmodules/custom/skyhawk_site_fixes/css/skyhawk-global.cssmodules/custom/skyhawk_site_fixes/css/squadron.cssmodules/custom/skyhawk_site_fixes/css/upload_token_public.cssmodules/custom/skyhawk_site_fixes/js/gabby-unit-autocomplete.jsmodules/custom/skyhawk_site_fixes/js/pixel_execution_probe.jsmodules/custom/skyhawk_site_fixes/js/squadron.jsmodules/custom/skyhawk_site_fixes/js/upload_transition_observer.jsEnabled Drupal ModulesDescriptions below come from the installed extension metadata. Current update availability is intentionally not stored here; query Composer/Drupal live.Enabled modules (99)Actions Permissions [actions_permissions] | Views Bulk Operations | Adds access permissions on all actions allowing admins to restrict access on a per-role basis.Automated Cron [automated_cron] | Core | Provides an automated way to run cron jobs, by executing them at the end of a server response.Automatic Entity Labels [auto_entitylabel] | Entity | Allows hiding of entity label fields and automatic label creation.Ban [ban] | Core | Allows banning visits from specific IP addresses.BigPipe [big_pipe] | Core | Sends pages using the BigPipe technique that allows browsers to show them much faster.Block Content [block_content] | Core | Allows the creation of content blocks and block types.Block [block] | Core | Allows users to configure blocks (containing content, forms, etc.) and to place them in the regions of a theme.Breakpoint [breakpoint] | Core | Manages breakpoints and breakpoint groups for responsive designs.Chaos Tools [ctools] | Chaos tool suite | Provides a number of utility and helper APIs for Drupal developers and site builders.CKEditor5 Table Fix [ckeditor5_table_fix] | CKEditor 5 | Adds support for tables in CKEditor5, including and other elements.CKEditor 5 [ckeditor5] | Core | Provides the CKEditor 5 rich text editor.Configuration Manager [config] | Core | Allows importing and exporting configuration changes.Contact storage [contact_storage] | Other | Provides storage and edit capability for contact messages.Contact [contact] | Core | Provides site-wide contact forms and forms to contact individual users.Content Moderation [content_moderation] | Core | Provides additional publication states that can be used by other modules to moderate content.Contextual Links [contextual] | Core | Provides contextual links to directly access tasks related to page elements.CSV Importer [csv_importer] | CSV | Import content from CSV.Custom Menu Links [menu_link_content] | Core | Allows users to create menu links.Database Logging [dblog] | Core | Logs system events in the database.Datetime Range [datetime_range] | Field types | Provides the ability to store end dates.Datetime [datetime] | Field types | Defines field types for storing dates and times.Devel [devel] | Development | Various blocks, pages, and functions for developers.DropzoneJS entity browser widget [dropzonejs_eb_widget] | Media | DropzoneJS Entity browser widget.dropzonejs [dropzonejs] | Media | The Drupal integration for DropzoneJS.Embed [embed] | Filters | Provides a framework for different types of embeds in text editors.Entity Browser Block [entity_browser_block] | Media | Derives block plugins for every Entity Browser on your siteEntity Browser [entity_browser] | Media | Provide a generic entity browser/picker/selector.Entity Embed [entity_embed] | Filters | Allows entities to be embedded using a text editor.Entity Mask [ctools_entity_mask] | Other | Allows an entity type to borrow the fields and display configuration of another entity type.Entity [entity] | Other | Provides expanded entity APIs, which will be moved to Drupal core one day.Feeds [feeds] | Feeds | Aggregates RSS/Atom/RDF feeds, imports CSV files and more.Field UI [field_ui] | Core | Provides a user interface for the Field module.Field [field] | Core | Provides the capabilities to add fields to entities.File Download Link Media [file_download_link_media] | Field | Adds field formatter to render Media reference fields as download link very directly.File Download Link [file_download_link] | Field | Adds field formatter to render file field as configurable download link.File metadata - EXIF [file_mdm_exif] | File metadata | Provides a file metadata plugin for EXIF image information.File metadata - Font [file_mdm_font] | File metadata | Provides a file metadata plugin for TTF/OTF/WOFF font information.File metadata manager [file_mdm] | File metadata | Provides a service to manage file metadata.File [file] | Field types | Provides a field type for files and defines a "managed_file" Form API element.Filter [filter] | Core | Filters text content in preparation for display.Image Effects [image_effects] | Media | Provides effects and operations for the Image API.Image [image] | Field types | Defines a field type for image media and provides display configuration tools.Inline Entity Form [inline_entity_form] | Fields | Provides a widget for inline management (creation, modification, removal) of referenced entities.Inline Form Errors [inline_form_errors] | Core | Places error messages adjacent to form inputs, for improved usability and accessibility.Internal Dynamic Page Cache [dynamic_page_cache] | Core | Caches pages, including those with dynamic content, for all users.Internal Page Cache [page_cache] | Core | Caches pages for anonymous users and can be used when external page cache is not available.Layout Builder Expose All Field Blocks [layout_builder_expose_all_field_blocks] | Core | When enabled, this module exposes all fields for all entity view displays. When disabled, only entity type bundles that have layout builder enabled will have their fields exposed. Enabling this module could significantly decrease performance on sites with a large number of entity types and bundles.Layout Builder Restrictions [layout_builder_restrictions] | Layout Builder | Manage which fields & layouts are available in Layout BuilderLayout Builder Styles [layout_builder_styles] | Layout Builder | Apply styles to blocks in Layout Builder.Layout Builder [layout_builder] | Core | Allows users to add and arrange blocks and content fields directly on the content.Layout Discovery [layout_discovery] | Core | Provides a way for modules or themes to register layouts.Libraries [libraries] | Other | Allows version-dependent and shared usage of external libraries.Link [link] | Field types | Provides a field type for internal and external URLs.Media Library [media_library] | Core | Enhances the media list with additional features to more easily find and use existing media items.Media [media] | Core | Manages the creation, configuration, and display of media items.Menu UI [menu_ui] | Core | Provides a user interface for managing menus.MySQL [mysql] | Core | Provides the MySQL database driver.Node [node] | Core | Manages the creation, configuration, and display of the main site content.Options [options] | Field types | Defines field types with select lists, checkboxes, and radio buttons to select values from fixed lists of options.Password Compatibility [phpass] | Core | Provides the password checking algorithm for user accounts created with Drupal prior to version 10.1.0.Path alias [path_alias] | Core | Provides the API allowing to rename URLs.Pathauto [pathauto] | Other | Provides a mechanism for modules to automatically generate aliases for the content they manage.Path [path] | Core | Allows users to create custom URLs for existing paths on the site.Redirect [redirect] | Other | Allows users to redirect from old URLs to new URLs.RESTful Web Services [rest] | Web services | Provides a framework for exposing REST resources.Search node [search_node] | Core | Provides a search plugin for searching content.Search [search] | Core | Allows users to create search pages based on plugins provided by other modules.Serialization (CSV) [csv_serialization] | Web services | Provides CSV as a serialization format.Serialization [serialization] | Web services | Provides a service for converting data to and from formats such as JSON and XML.Serial [serial] | Field types | Defines atomic auto increment (serial) field type.Simplenews [simplenews] | Mail | Send newsletters to subscribed email addresses. For uninstall go to Configuration > Web services > Simplenews > Settings and hit "Prepare uninstall".Simple XML Sitemap [simple_sitemap] | SEO | Generates standard-compliant hreflang XML sitemaps to enhance your site's SEO, notifies search engines of website changes via IndexNow and sitemap ping protocols, and provides a framework for developing other sitemap types.Skyhawk Gallery [skyhawk_gallery] | Custom | Renders dir_listing nodes as filesystem image galleries.Skyhawk Site Fixes [skyhawk_site_fixes] | Custom | Site-specific CSS fixes for Skyhawk Drupal 10.Sophron [sophron] | Other | Provides an extensive MIME types management API.Standard [standard] | Other | Install with commonly used features pre-configured.Syslog [syslog] | Core | Logs events to the web server's system log.System [system] | Core | Provides user interfaces for core systems.Taxonomy [taxonomy] | Core | Enables the categorization of content.Telephone [telephone] | Field types | Defines a field type for telephone numbers.Text Editor [editor] | Core | Provides a framework to associate text editors (like WYSIWYGs) and toolbars with text formats.Text [text] | Field types | Defines field types for short and long text with optional summaries.Token Filter [token_filter] | Other | Allows token values to be used as filters.Token [token] | Other | Provides a user interface for the Token API and some missing core tokens.Toolbar [toolbar] | Core | Provides an administration toolbar to display links provided by modules.Typed Data [typed_data] | Other | Extends the core Typed Data API with new APIs and features.Update Status [update] | Core | Checks for updates and can notify users if there are new releases available.User [user] | Core | Allows users to register and log in, and manages user roles and permissions.Video Embed Field [video_embed_field] | Video Embed Field | Provides a field type for displaying videos from 3rd party providers such as YouTube and Vimeo.Views Bootstrap 5 [views_bootstrap] | Views | Allows for different styles to be used in views to work with Bootstrap 5 components.Views Bulk Operations [views_bulk_operations] | Views | Adds an ability to perform bulk operations on selected entities from view results.Views Data Export [views_data_export] | Views | Plugin to export views data into various file formats.Views Infinite Scroll [views_infinite_scroll] | Views | A pager which allows an infinite scroll effect for views.Views UI [views_ui] | Core | Provides a user interface for creating and managing views.Views [views] | Core | Provides a framework to fetch information from the database and to display it in different formats.Webform UI [webform_ui] | Webform | Provides a user interface for building and maintaining webforms.Webform [webform] | Webform | Enables the creation of webforms and questionnaires.Workflows [workflows] | Core | Provides an interface to create workflows with transitions between different states (for example publication or user status) provided by other modules.YP Memorial [yp_memorial] | Custom | Displays YP memorial memories from Webform submissions.Custom Modules and PurposeSkyhawk Gallery [skyhawk_gallery] - Renders dir_listing nodes as filesystem image galleries. - modules/custom/skyhawk_gallerySkyhawk Site Fixes [skyhawk_site_fixes] - Site-specific CSS fixes for Skyhawk Drupal 10. - modules/custom/skyhawk_site_fixesYP Memorial [yp_memorial] - Displays YP memorial memories from Webform submissions. - modules/custom/yp_memorialCustom architecture files (57)modules/custom/skyhawk_gallery/skyhawk_gallery.info.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.modulemodules/custom/skyhawk_gallery/skyhawk_gallery.permissions.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlmodules/custom/skyhawk_gallery/skyhawk_gallery.services.ymlmodules/custom/skyhawk_site_fixes/backups/attach-managed-file-queue-20260825T215707Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-handoff-20260825T194442Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/core-managed-file-control-20260825T165546Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-20260825T144330Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/deployment-gate-reconcile-20260825T145100Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/fix-two-proven-defects-20260825T205540Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/generic-uploader-reconcile-20260826T012923Z-1245077/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/live-observer-integration-20260825T145539Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-queue-20260825T215118Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/managed-file-server-trace-20260825T210301Z-3404996/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/multipart-ingress-20260825T182043Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/native-serial-cleanup-20260825T202106Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/observer-execution-proof-20260825T150130Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/observer-standalone-20260825T150751Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-direct-probe-20260825T151003Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-observer-20260825T140951Z-2676184/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/pixel-picker-transition-20260825T151419Z-2795997/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-inline-status-20260826T023619Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-three-failures-20260826T030142Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/public-upload-ux-owner-fix-20260826T025756Z-1245077/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-20260825T203611Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/remove-serializer-artifacts-20260825T203955Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/request-size-probe-20260825T181121Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/rollback-ingress-observer-20260825T212918Z-3404996/skyhawk_site_fixes.services.ymlmodules/custom/skyhawk_site_fixes/backups/runtime-route-rebuild-20260825T145745Z-2795997/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/serial-managed-file-20260825T184306Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/serial-three-trace-20260825T195352Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-discovery-fix-20260825T195928Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/trace-prereq-20260825T195657Z-3404996/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T233305Z-3404996/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/universal-uploader-20260825T234003Z/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T005953Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/backups/upload-product-replacement-20260825T013552Z-2471164/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.info.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.modulemodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlmodules/custom/skyhawk_site_fixes/skyhawk_site_fixes.services.ymlmodules/custom/yp_memorial/yp_memorial.info.ymlmodules/custom/yp_memorial/yp_memorial.routing.ymlCustom routes (14)skyhawk_gallery.photo_contribute | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.photo_review | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_gallery.unknowns | modules/custom/skyhawk_gallery/skyhawk_gallery.routing.ymlskyhawk_site_fixes.journal_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.managed_file_core_control | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_manage | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_upload | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.reunion_verify | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.system_status | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_admin | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_token_view | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlskyhawk_site_fixes.upload_transition_observation | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.routing.ymlyp_memorial.memories | modules/custom/yp_memorial/yp_memorial.routing.ymlCustom services (0)Custom libraries (8)skyhawk_site_fixes/gabby_unit_autocomplete | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/global | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/legacy | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/model_build | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/modeling_review | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/squadron | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_token_public | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlskyhawk_site_fixes/upload_transition_observer | modules/custom/skyhawk_site_fixes/skyhawk_site_fixes.libraries.ymlContent ArchitectureNode content types (26)155242-155289 [155242_155289]Article [article]Article-Board [article_board]Article-Journal-Private [article_journal_private]Article-Journal-Public [article_journal_public]article-modeling [article_modeling]article-readyroom [article_readyroom]article-unit [article_unit]Attendee Memory [attendee_memory]Book page [book]BuNo Purchase Batch [buno_batch]Bureau Numbers [bureau_numbers]Directory listing [dir_listing]Gabby's Histories [gabby_s_histories]Journal [journal]Journal Index [journal_index]Model Build [model_build]Modeling Review Page [modeling_review_page]Newsletter Issue [newsletter_issue]Basic page [page]PDF [pdf]Reunion Event [reunion_event]Newsletter Issue [simplenews_issue]Skyhawk Association Journal Index [skyhawk_association_journal_inde]Song [song]State Abbreviations [state_abbreviations]Node fields by bundle (92)155242_155289 | body | text_with_summary | Body155242_155289 | feeds_item | feeds_item | Feeds item155242_155289 | field_buno_image | image | Buno Imagearticle_board | body | text_with_summary | Bodyarticle_journal_private | body | text_with_summary | Bodyarticle_journal_public | body | text_with_summary | Bodyarticle_modeling | body | text_with_summary | Bodyarticle_readyroom | body | text_with_summary | Bodyarticle_unit | body | text_with_summary | Bodyarticle | body | text_with_summary | Bodyattendee_memory | field_attendee_name | string | Your Nameattendee_memory | field_memory_photo | image | Photoattendee_memory | field_memory_story | text_long | Memorybook | body | text_with_summary | Bodybuno_batch | field_batch_end | integer | field_batch_endbuno_batch | field_batch_start | integer | field_batch_startbuno_batch | field_batch_variant | string | field_batch_variantbureau_numbers | body | text_with_summary | Bodybureau_numbers | field_bureau_number | list_integer | Bureau Numberdir_listing | body | text_with_summary | Bodydir_listing | field_directory_uri | string | Directory URIgabby_s_histories | body | text_with_summary | Bodygabby_s_histories | feeds_item | feeds_item | Feeds itemgabby_s_histories | field_buno | string | BUNOgabby_s_histories | field_count | serial | Countgabby_s_histories | field_custodian | string | Custodiangabby_s_histories | field_date | datetime | Dategabby_s_histories | field_description | string | Descriptiongabby_s_histories | field_location | string | Locationgabby_s_histories | field_manufacturer_serial_number | integer | Manufacturer Serial Numbergabby_s_histories | field_model | string | Modelgabby_s_histories | field_notes | string | Notesgabby_s_histories | field_record | integer | Recordjournal_index | field_journal_index | list_string | Journal Indexjournal | body | text_with_summary | Bodyjournal | field_journal_issue | integer | Issuejournal | field_journal_is_print | boolean | Print-Friendly Versionjournal | field_journal_label | string | Season Labeljournal | field_journal_thumbnail | image | Cover Thumbnailjournal | field_journal_volume | integer | Volumejournal | field_journal_year | integer | Yearjournal | field_pdf_print | file | Spreads PDFjournal | field_pdf | file | PDFmodeling_review_page | body | text_with_summary | Review Contentmodel_build | body | text_with_summary | Description / Build Notesmodel_build | field_aircraft_variant | string | Aircraft Variantmodel_build | field_bureau_number | list_integer | BuNo / Serial Numbermodel_build | field_carrier | string | Carriermodel_build | field_kit_manufacturer | string | Kit Manufacturermodel_build | field_model_builder | string | Buildermodel_build | field_model_event_year | string | Event / Yearmodel_build | field_model_images | image | Model Photographsmodel_build | field_model_scale | string | Scalemodel_build | field_squadron_operator | string | Squadron / Operatornewsletter_issue | field_issue_date | datetime | Issue Datenewsletter_issue | field_issue_pdf | file | Newsletter PDFpage | body | text_with_summary | Bodypdf | body | text_with_summary | Bodypdf | field_journal_index | list_string | Journal Indexpdf | field_journal_pdf | file | Journal PDFpdf | field_pdf_thumbnail | entity_reference | PDF Thumbnailpdf | layout_builder__layout | layout_section | Layoutreunion_event | body | text_with_summary | Bodyreunion_event | field_event_date | datetime | Event Datereunion_event | field_event_location | string | Locationreunion_event | field_hotel_link | link | Hotel Booking Linkreunion_event | field_lost_comm | text_long | Lost Comm Listreunion_event | field_manage_token | string | Management Tokenreunion_event | field_organizer_email | email | Organizer Emailreunion_event | field_registration_link | link | Registration Linkreunion_event | field_reunion_newsletter | file | Newsletter PDFreunion_event | field_taps | text_long | Tapsreunion_event | field_verify_expiry | integer | Verification Expiryreunion_event | field_verify_token | string | Verification Tokensimplenews_issue | body | text_with_summary | Bodysimplenews_issue | simplenews_issue | simplenews_issue | Newsletterskyhawk_association_journal_inde | body | text_with_summary | Bodyskyhawk_association_journal_inde | field_article | string | Articleskyhawk_association_journal_inde | field_author_last_name | string | Author Last Nameskyhawk_association_journal_inde | field_category | list_string | Categoryskyhawk_association_journal_inde | field_first_name | string | First Nameskyhawk_association_journal_inde | field_issue | list_string | Issueskyhawk_association_journal_inde | field_journal_number | list_float | Journal Numberskyhawk_association_journal_inde | field_page | integer | Pageskyhawk_association_journal_inde | field_pdf_access | link | PDF Accessskyhawk_association_journal_inde | field_record | integer | Recordskyhawk_association_journal_inde | field_year | list_integer | Yearsong | body | text_with_summary | Lyricssong | field_song_audio | entity_reference | Audiosong | field_song_byline | string | Bylinestate_abbreviations | body | text_with_summary | Bodystate_abbreviations | field_two_letter_state_id_s | list_string | Two Letter State ID'sTaxonomy vocabularies (1)Skyhawk Units [skyhawk_units]Enabled Views and exposed paths (30)BuNo Search [buno_search] | /buno-searchBureau Number 159778-159790 [bureau_number_159778_159790] | /bureau-number-159778-159790Contact messages [contact_messages] | /admin/structure/contact/messagesContent [content] | /admin/content/node, /admin/content/node/editDrupal 10 Gabby's Histories [drupal_10_gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restDuplicate of People [duplicate_of_people] | /admin/people/listFiles [files] | /admin/content/files, /admin/content/files/usage/%Gabby's Histories [gabby_s_histories] | /gabby-s-histories, /gabby-s-histories/restGlossary [glossary] | /site-glossaryJournal Grid [journal_grid] | /journalsMailing Lists [mailing_lists] | /mailing-listsMedia library [media_library] | /admin/content/media-grid, /admin/content/media-widget, /admin/content/media-widget-tableMedia [media] | /admin/content/mediaModeling Builds [modeling_builds_review] | /modeling/buildsModerated content [moderated_content] | /admin/content/moderatedNewsletter issues [simplenews_newsletters] | /admin/content/simplenewsPDF Image Entity [pdf_image_entity] | /admin/media-pdf-thumbnail/settings/listPeople [user_admin_people] | /admin/people/listPublic Skyhawk Journal Index [public_skyhawk_journal_index] | /download/views, /skyhawk-public-journal-index, /skyhawk-public-journal-index-page2Redirect [redirect] | /admin/config/search/redirectReunion Index [reunion_index] | /reunionSA Journal Grid [sa_journal_grid] | /sa-journalSDO Directory Review [sdo_directory_review] | /admin/people/sdo-directory-reviewSDO User Email Reference [sdo_user_email_reference]Skyhawk Journal Index [skyhawk_journal_index] | /skyhawk-journal-indexSkyhawk Songs [skyhawk_songs] | /skyhawk-songsSkyhawk Videos [skyhawk_videos]Subscribers [simplenews_subscribers] | /admin/people/simplenewsWatchdog [watchdog] | /admin/reports/dblogWebform submissions [webform_submissions]Image styles (12)full960 [full960]Journal Cover (480px no watermark) [journal_cover]Journal Thumb (160px no watermark) [journal_thumb]Media Library thumbnail (220×220) [media_library]onehalf480 [onehalf480]onethird320 [onethird320]skyhawk_gallery_large [skyhawk_gallery_large]skyhawk_gallery_thumb [skyhawk_gallery_thumb]thumbnail192 [thumbnail192]thumbnail [thumbnail]twothirds640 [twothirds640]Watermark [watermark]Storage and ConfigurationPublic files: sites/default/filesPrivate files: /home/darwus/drupalbeta/web/privateTemporary files: /tmpConfiguration sync: sites/default/files/config_Ubo9gqxEHpoMEZNKbhJkVBUc9sN2NnzSV17M10F5hE7w77uws5OFNHtqnAAjUCO9dChbQn6-2A/syncMaintenance/debug reports: web/downloads/chatgpt-debug*.txt. These are operational artifacts, not architecture.Composer and Reconstructioncomposer.json: present.composer.lock: present.Composer-managed code and the lock file define reconstructable Drupal/core/contrib dependencies.Do not store rapidly aging latest-version or update-availability lists here. Generate them with Composer when maintenance begins.Do not patch Drupal core or contributed projects for permanent Skyhawk customization.Backup ArchitectureA2 maintenance database-backup directory: /home/darwus/skyhawk_backups - present.Before destructive or material database work, create a full A2 database backup, download it to the local machine being used, compare SHA-256 hashes, and require an exact match before mutation.After successful local SHA verification, temporary/superseded A2 database backups are removed; the verified local copy is the rollback copy for that maintenance operation.Normal database/files backups remain separate from future Git version control.Journal Index ArchitectureThe Drupal-native journal_index content type and Drupal Views are authoritative.The obsolete standalone raw SQL journal_index import table is retired / absent.Historical Raven CSV: /home/darwus/drupalbeta/journal_index_work/raven_journal_index_534.csv - present.Do not recreate the retired standalone SQL table without a new proven requirement.Generated on Demand - Do Not Maintain as ProseComposer/Drupal update availability.Current cache state and temporary diagnostics.Disk usage and transient file counts.Current log entries, warnings, token activity, request traces, and temporary report filenames/hashes.Architecture Rules That Prevent RediscoveryLet Drupal be Drupal: prefer core, established contrib, fields, taxonomy, Views, Webform, revisions, permissions, services, configuration and themes before custom mechanisms.KISS governs architecture and collaboration.Know and replace in toto rather than layering conflicting CSS/configuration.Preserve completed decisions unless new evidence or explicit direction requires reopening them.Use LOST-D for unfinished work and NEXT; use this reference for durable technical truth.Last live reconciliation: 2026-08-28 17:05:12 UTC. 299-60- 300-61- 301-62-A2 Shell Execution Constraints 302-63- 303-64-Normal Skyhawk command-line work occurs interactively at the A2 prompt. 304:65-On this A2 environment, do not use Bash process substitution such as < <(...) for Skyhawk work. It has repeatedly failed through /dev/fd/*. 305- 306- 307-===== ACTIVE SOURCE HISTORY OWNERS ===== 308-ACTIVE_SKYHAWK_UPLOAD_FILE_SOURCE_HITS=1 -- 518-564- } 519-565- 520-566- $this->setPageMessage( 521-567- $this->t( 522:568- 'Reunion PDF verified and published: @file', 523--- 524-585- return; 525-586- } 526-587- -- 992-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-890- ) { 993-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-891- @unlink($targetPath); 994-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-892- 995-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-893- throw new \RuntimeException( 996:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-894- 'The public copy failed checksum verification.' 997-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-895- ); 998-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-896- } 999-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-897- } 1000-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/ReunionIntake.php-898- -- 1127-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php:88: $private = \Drupal::service('file_system')->realpath('private://uploads'); 1128-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-89- $add( 1129-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-90- 'Private upload destination', 1130-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-91- is_string($private) && $private !== '' && is_dir($private) && is_writable($private), 1131:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-92- $private ?: 'UNRESOLVED' 1132-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-93- ); 1133-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-94- 1134:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-95- $failed = array_filter($checks, static fn(array $check): bool => $check['status'] !== 'PASS'); 1135:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-96- $overall = empty($failed) ? 'PASS' : 'FAIL'; 1136-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-97- 1137-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-98- $rows = []; 1138-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-99- 1139-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Controller/SystemStatusController.php-100- foreach ($checks as $check) { -- 1188-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-96- } 1189-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-97- 1190-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-98- public function validateForm(array &$form, FormStateInterface $form_state) { 1191-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-99- $mode = $form_state->getValue('mode'); 1192:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-100- if ($mode === 'missing' && !$form_state->getValue('missing_issue')) { 1193:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-101- $form_state->setErrorByName('missing_issue', 'Please select a missing issue.'); 1194-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-102- } 1195-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-103- } 1196-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-104- 1197-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php:105: public function submitForm(array &$form, FormStateInterface $form_state) { 1198-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-106- $mode = $form_state->getValue('mode'); 1199:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-107- $missing = $form_state->getValue('missing_issue'); 1200-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-108- 1201-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-109- // Store selections in session for the upload form to pick up 1202-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-110- $session = \Drupal::request()->getSession(); 1203-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-111- $session->set('journal_upload_mode', $mode); 1204:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-112- $session->set('journal_upload_missing', $missing); 1205-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-113- 1206-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-114- $form_state->setRedirect('skyhawk_site_fixes.journal_upload'); 1207-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-115- } 1208-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadLanding.php-116- -- 1419-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php:457: $node->save(); 1420-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-458- 1421-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-459- $this->setPageMessage("Journal created: $label (nid:{$node->id()})"); 1422-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-460- if (!$thumb_file) { 1423:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-461- $this->setPageMessage("Thumbnail generation failed. Add one manually via the node edit page.", "warning"); 1424-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-462- } 1425-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-463- 1426-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-464- $form_state->setRedirect('entity.node.canonical', ['node' => $node->id()]); 1427-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/JournalUploadForm.php-465- } -- 1487-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-421- !$copied_real || 1488-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-422- !is_file($copied_real) || 1489-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-423- hash_file('sha256', $copied_real) !== $source_hash 1490-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-424- ) { 1491:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-425- throw new \RuntimeException('PUBLIC_COPY_HASH_VERIFICATION_FAILED'); 1492-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-426- } 1493-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-427- 1494-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-428- $file->setFileUri($copied_uri); 1495-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php:429: $file->setPermanent(); -- 1524-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-458- $node_saved = TRUE; 1525-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-459- 1526-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-460- /* 1527-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-461- * The private source can now be removed because the same FID 1528:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-462- * points to the verified public copy and the Event revision has 1529-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-463- * persisted the accepted relationship. 1530-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-464- */ 1531-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-465- if ($source_real && is_file($source_real)) { 1532-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-466- @unlink($source_real); -- 1547-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-664- $rollback_file->setTemporary(); 1548-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php:665: $rollback_file->save(); 1549-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-666- } 1550-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-667- 1551:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-668- $report[] = 'ROLLBACK=PASS'; 1552-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-669- } 1553-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-670- catch (\Throwable $rollback_error) { 1554:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-671- $report[] = 'ROLLBACK=FAIL'; 1555-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-672- $report[] = 1556-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-673- 'ROLLBACK_ERROR=' . 1557-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-674- str_replace( 1558-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionNewsletterUpdateForm.php-675- ["\r", "\n"], -- 2362-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-420- if (!$file) { 2363-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-421- $node->delete(); 2364-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-422- 2365-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-423- throw new \RuntimeException( 2366:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-424- 'SOURCE_FILE_MISSING_AFTER_DRAFT_CREATE' 2367-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-425- ); 2368-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-426- } 2369-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php-427- 2370-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/ReunionRequestForm.php:428: $file->setPermanent(); -- 2825-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-229- } 2826-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-230- 2827-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-231- if (!(bool) $form_state->getValue('recipient_confirmed')) { 2828-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-232- $this->messenger()->addError( 2829:/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-233- $this->t('Confirm that the recipient email address was verified.') 2830-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-234- ); 2831-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-235- return; 2832-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-236- } 2833-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-237- -- 2886-/home/darwus/drupalbeta/web/modules/custom/skyhawk_site_fixes/src/Form/UploadTokenAdminForm.php-290- $this->messenger()->addError( NO_MATCHES ===== CLASSIFICATION ===== AUTOMATIC_CLASSIFICATION=NOT_ATTEMPTED REASON=Evidence extracted for independent human/model interpretation NEXT=Read this concise report and classify the skyhawk_upload_file history-row gate as VERIFIED, CONTRADICTED, or UNRESOLVED. ===== PROCESS CHECKSUM ===== SOURCE_REPORT_MODIFIED: NO DRUPAL_STATE_CHANGED: NO DOCUMENTATION_CHANGED: NO MAIL_SENT: NO FILES_DELETED: NO NEW_EVIDENCE_REPORT_CREATED: YES ===== END =====