This is an automated email from the ASF dual-hosted git repository.

asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git


The following commit(s) were added to refs/heads/asf-site-production by this 
push:
     new 49c2cd04684 Deploying to documentation branch - 13:53:52
49c2cd04684 is described below

commit 49c2cd04684703e0423861dea72f2cb492035e80
Author: codeconsole <[email protected]>
AuthorDate: Fri Aug 21 13:53:55 2026 +0000

    Deploying to documentation branch - 13:53:52
---
 docs/snapshot/api/index-all.html                   |  25 ++--
 .../api/org/grails/gsp/GroovyPageMetaInfo.html     | 130 +++++++++---------
 .../org/grails/gsp/compiler/GroovyPageParser.html  | 145 ++++++++++++---------
 .../developer-manual/gettingStarted.html           |   2 +-
 .../grails-data/developer-manual/introduction.html |   2 +-
 .../grails-data/developer-manual/stepByStep.html   |   2 +-
 .../grails-data/developer-manual/testing.html      |   2 +-
 .../developer-manual/understandingApi.html         |   2 +-
 .../understandingApi/datastoreBasics.html          |   2 +-
 .../understandingApi/gormApis.html                 |   2 +-
 .../understandingApi/gormEnhancer.html             |   2 +-
 .../understandingApi/implementingCrud.html         |   2 +-
 .../understandingApi/implementingQueries.html      |   2 +-
 .../understandingApi/secondaryIndexes.html         |   2 +-
 .../grails-data/whats-new-manual/index.html        |   2 +-
 docs/snapshot/guide/single.html                    |  51 +++++++-
 docs/snapshot/guide/theWebLayer.html               |  10 +-
 docs/snapshot/guide/upgrading.html                 |  41 ++++++
 18 files changed, 260 insertions(+), 166 deletions(-)

diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 5db4662f2ab..2107968a45e 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -2503,8 +2503,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/cli/compiler/autoconfigure/TransactionManagementCompilerAutoConfiguration.html#applyImports(org.codehaus.groovy.control.customizers.ImportCustomizer)"
 title="Method in 
TransactionManagementCompilerAutoConfiguration">applyImports(org.codehaus.groovy.control.customizers.ImportCustomizer)</a></span>
 - Method in <a 
href="org/grails/cli/compiler/autoconfigure/TransactionManagementCompilerAutoConfiguration.html">TransactionManagementCompilerAutoConf
 [...]
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/GroovyPageMetaInfo.html#applyLastModifiedFromResource(org.springframework.core.io.Resource)"
 title="Method in 
GroovyPageMetaInfo">applyLastModifiedFromResource(org.springframework.core.io.Resource)</a></span>
 - Method in <a 
href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/plugins/web/taglib/RenderGrailsLayoutTagLib.html#applyLayout" 
title="Property in RenderGrailsLayoutTagLib">applyLayout</a></span> - Property 
in <a 
href="org/grails/plugins/web/taglib/RenderGrailsLayoutTagLib.html">RenderGrailsLayoutTagLib</a>
 </dt><dd> <div class="block">Apply a layout to a particular block of text or 
to the given view or template.</div></dd>
 <dt><span class="strong"><a 
href="org/grails/plugins/web/taglib/RenderSitemeshTagLib.html#applyLayout(java.util.Map,
 groovy.lang.Closure)" title="Method in 
RenderSitemeshTagLib">applyLayout(java.util.Map, 
groovy.lang.Closure)</a></span> - Method in <a 
href="org/grails/plugins/web/taglib/RenderSitemeshTagLib.html">RenderSitemeshTagLib</a>
@@ -5862,6 +5860,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 <dt><span class="strong"><a 
href="org/apache/grails/buildsrc/GrailsCodeStyleExtension.html#checkstyleDirectory"
 title="Property in GrailsCodeStyleExtension">checkstyleDirectory</a></span> - 
Property in <a 
href="org/apache/grails/buildsrc/GrailsCodeStyleExtension.html">GrailsCodeStyleExtension</a>
 </dt><dd> <div class="block">Defaults to 
rootProject.layout.buildDirectory/code-style/checkstyle.
  </div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#checksumOf(byte[])" 
title="Method in GroovyPageParser">checksumOf(byte[])</a></span> - Method in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block">Computes the checksum recorded in the 
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.</div></dd>
 <dt><span class="strong"><a 
href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html#checksumString"
 title="Property in GroovyChange">checksumString</a></span> - Property in <a 
href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html">GroovyChange</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/apache/grails/data/testing/tck/domains/Child.html" title="Class in 
org.apache.grails.data.testing.tck.domains">Child</a></span> - Class in <a 
href="./org/apache/grails/data/testing/tck/domains/package-summary.html">org.apache.grails.data.testing.tck.domains</a>
@@ -7884,12 +7884,12 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_JSP_TAGS" 
title="Field in GroovyPageParser">CONSTANT_NAME_JSP_TAGS</a></span> - Field in 
<a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_LAST_MODIFIED"
 title="Field in GroovyPageParser">CONSTANT_NAME_LAST_MODIFIED</a></span> - 
Field in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_MODEL_FIELDS_MODE"
 title="Field in GroovyPageParser">CONSTANT_NAME_MODEL_FIELDS_MODE</a></span> - 
Field in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_OUT_CODEC" 
title="Field in GroovyPageParser">CONSTANT_NAME_OUT_CODEC</a></span> - Field in 
<a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_SOURCE_CHECKSUM"
 title="Field in GroovyPageParser">CONSTANT_NAME_SOURCE_CHECKSUM</a></span> - 
Field in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_STATIC_CODEC" 
title="Field in GroovyPageParser">CONSTANT_NAME_STATIC_CODEC</a></span> - Field 
in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#CONSTANT_NAME_TAGLIB_CODEC" 
title="Field in GroovyPageParser">CONSTANT_NAME_TAGLIB_CODEC</a></span> - Field 
in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
@@ -22331,10 +22331,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="grails/plugin/springsecurity/SpringSecurityUtils.html#getLastException(jakarta.servlet.http.HttpSession)"
 title="Method in 
SpringSecurityUtils">getLastException(jakarta.servlet.http.HttpSession)</a></span>
 - Method in <a 
href="grails/plugin/springsecurity/SpringSecurityUtils.html">SpringSecurityUtils</a>
 </dt><dd> <div class="block">Get the last auth exception.</div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/GroovyPageMetaInfo.html#getLastModified()" title="Method 
in GroovyPageMetaInfo">getLastModified()</a></span> - Method in <a 
href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#getLastModified()" 
title="Method in GroovyPageParser">getLastModified()</a></span> - Method in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html#getLastOffset(java.lang.Integer,
 java.lang.Integer)" title="Method in 
DefaultJsonViewHelper">getLastOffset(java.lang.Integer, 
java.lang.Integer)</a></span> - Method in <a 
href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html">DefaultJsonViewHelper</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/core/util/StopWatch.html#getLastTaskInfo()" title="Method in 
StopWatch">getLastTaskInfo()</a></span> - Method in <a 
href="org/grails/core/util/StopWatch.html">StopWatch</a>
@@ -25759,6 +25755,10 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/events/spring/SpringEventBusEvent.html#getSource()" 
title="Method in SpringEventBusEvent">getSource()</a></span> - Method in <a 
href="org/grails/events/spring/SpringEventBusEvent.html">SpringEventBusEvent</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/GroovyPageMetaInfo.html#getSourceChecksum()" title="Method 
in GroovyPageMetaInfo">getSourceChecksum()</a></span> - Method in <a 
href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the checksum of 
the GSP source this page was compiled from, or <CODE>null</CODE> if none was 
recorded</DD></DL></div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#getSourceChecksum()" 
title="Method in GroovyPageParser">getSourceChecksum()</a></span> - Method in 
<a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>a checksum of 
the GSP source this page was generated from, or <CODE>null</CODE> if none was 
recorded</DD></DL></div></dd>
 <dt><span class="strong"><a 
href="grails/views/WritableScript.html#getSourceFile()" title="Method in 
WritableScript">getSourceFile()</a></span> - Method in <a 
href="grails/views/WritableScript.html">WritableScript</a>
 </dt><dd> <div class="block">Obtains the source file</div></dd>
 <dt><span class="strong"><a 
href="org/grails/gradle/plugin/core/TestPhase.html#getSourceFolderName()" 
title="Method in TestPhase">getSourceFolderName()</a></span> - Method in <a 
href="org/grails/gradle/plugin/core/TestPhase.html">TestPhase</a>
@@ -49401,10 +49401,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/orm/hibernate/cfg/JoinTable.html#setKeys(List<ColumnConfig>)" 
title="Method in JoinTable">setKeys(List&lt;ColumnConfig&gt;)</a></span> - 
Method in <a href="org/grails/orm/hibernate/cfg/JoinTable.html">JoinTable</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/GroovyPageMetaInfo.html#setLastModified(long)" 
title="Method in GroovyPageMetaInfo">setLastModified(long)</a></span> - Method 
in <a href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#setLastModified(long)" 
title="Method in GroovyPageParser">setLastModified(long)</a></span> - Method in 
<a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/plugins/sitemesh3/Sitemesh3LayoutFinder.html#setLayoutCacheExpirationMillis(long)"
 title="Method in 
Sitemesh3LayoutFinder">setLayoutCacheExpirationMillis(long)</a></span> - Method 
in <a 
href="org/grails/plugins/sitemesh3/Sitemesh3LayoutFinder.html">Sitemesh3LayoutFinder</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/datastore/mapping/config/Property.html#setLazy(java.lang.Boolean)"
 title="Method in Property">setLazy(java.lang.Boolean)</a></span> - Method in 
<a href="org/grails/datastore/mapping/config/Property.html">Property</a>
@@ -50297,6 +50293,11 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html#setSource(java.lang.Object)"
 title="Method in 
GroovyPageForkCompileTask">setSource(java.lang.Object)</a></span> - Method in 
<a 
href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html">GroovyPageForkCompileTask</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/GroovyPageMetaInfo.html#setSourceChecksum(java.lang.String)"
 title="Method in 
GroovyPageMetaInfo">setSourceChecksum(java.lang.String)</a></span> - Method in 
<a href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
+</dt><dd> <div class="block"> 
<DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> -  the checksum 
of the GSP source this page was compiled from</DD></DL></div></dd>
+<dt><span class="strong"><a 
href="org/grails/gsp/compiler/GroovyPageParser.html#setSourceChecksum(java.lang.String)"
 title="Method in 
GroovyPageParser">setSourceChecksum(java.lang.String)</a></span> - Method in <a 
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block">Records a checksum of the GSP source, emitted as 
the <CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification 
time.</div></dd>
 <dt><span class="strong"><a 
href="grails/views/WritableScript.html#setSourceFile(java.io.File)" 
title="Method in WritableScript">setSourceFile(java.io.File)</a></span> - 
Method in <a href="grails/views/WritableScript.html">WritableScript</a>
 </dt><dd> <div class="block"> 
<DL><DT><B>Parameters:</B></DT><DD><code>file</code> -  Sets the source 
file</DD></DL></div></dd>
 <dt><span class="strong"><a 
href="grails/spring/BeanBuilder.html#setSpringConfig(org.grails.spring.RuntimeSpringConfiguration)"
 title="Method in 
BeanBuilder">setSpringConfig(org.grails.spring.RuntimeSpringConfiguration)</a></span>
 - Method in <a href="grails/spring/BeanBuilder.html">BeanBuilder</a>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html 
b/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
index b4550059a08..e04f3bba192 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
+++ b/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
@@ -220,77 +220,65 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#applyLastModifiedFromResource(org.springframework.core.io.Resource)">applyLastModifiedFromResource</a></strong>(<a
 href='../../../org.springframework.core.io.Resource.html'>Resource</a> 
resource)</code><br></td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org.springframework.core.io.Resource.html'>Resource</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#call()">call</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org.springframework.core.io.Resource.html'>Resource</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#checkIfReloadableResourceHasChanged(PrivilegedAction)">checkIfReloadableResourceHasChanged</a></strong>(java.security.PrivilegedAction&lt;Resource&gt;
 resourceCallable)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getCompilationException()">getCompilationException</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getContentType()">getContentType</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getExpressionEncoder()">getExpressionEncoder</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getGrailsApplication()">getGrailsApplication</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.io.InputStream</code></td>
                             <td class="colLast"><code><strong><a 
href="#getGroovySource()">getGroovySource</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String[]</code></td>
                             <td class="colLast"><code><strong><a 
href="#getHtmlParts()">getHtmlParts</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getJspTagLibraryResolver()">getJspTagLibraryResolver</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.util.Map</code></td>
                             <td class="colLast"><code><strong><a 
href="#getJspTags()">getJspTags</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;long</code></td>
-                            <td class="colLast"><code><strong><a 
href="#getLastModified()">getLastModified</a></strong>()</code><br></td>
-                        </tr>
-                        
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;int[]</code></td>
@@ -334,111 +322,111 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
+                            <td class="colLast"><code><strong><a 
href="#getSourceChecksum()">getSourceChecksum</a></strong>()</code><br> 
<DL><DT><B>Returns:</B></DT><DD>the checksum of the GSP source this page was 
compiled from, or <CODE>null</CODE> if none was recorded</DD></DL></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getStaticEncoder()">getStaticEncoder</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getTagLibraryLookup()">getTagLibraryLookup</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a 
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
                             <td class="colLast"><code><strong><a 
href="#getTaglibEncoder()">getTaglibEncoder</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#initialize()">initialize</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a 
href="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a 
href="#isModelFieldsMode()">isModelFieldsMode</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a 
href="#isPrecompiledMode()">isPrecompiledMode</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#removePageMetaClass()">removePageMetaClass</a></strong>()</code><br></td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setCompilationException(org.grails.gsp.GroovyPagesException)">setCompilationException</a></strong>(<a
 
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a>
 e)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#removePageMetaClass()">removePageMetaClass</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setCompileStaticMode(boolean)">setCompileStaticMode</a></strong>(boolean 
compileStaticMode)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setCompilationException(org.grails.gsp.GroovyPagesException)">setCompilationException</a></strong>(<a
 
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a>
 e)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setContentType(java.lang.String)">setContentType</a></strong>(java.lang.String
 contentType)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setCompileStaticMode(boolean)">setCompileStaticMode</a></strong>(boolean 
compileStaticMode)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setExpressionCodecName(java.lang.String)">setExpressionCodecName</a></strong>(java.lang.String
 expressionCodecName)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setContentType(java.lang.String)">setContentType</a></strong>(java.lang.String
 contentType)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a
 href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a> 
grailsApplication)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setExpressionCodecName(java.lang.String)">setExpressionCodecName</a></strong>(java.lang.String
 expressionCodecName)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setGroovySource(java.io.InputStream)">setGroovySource</a></strong>(java.io.InputStream
 groovySource)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a
 href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a> 
grailsApplication)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setHtmlParts(java.lang.String)">setHtmlParts</a></strong>(java.lang.String[]
 htmlParts)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setGroovySource(java.io.InputStream)">setGroovySource</a></strong>(java.io.InputStream
 groovySource)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setJspTagLibraryResolver(org.grails.gsp.jsp.TagLibraryResolver)">setJspTagLibraryResolver</a></strong>(<a
 
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a>
 jspTagLibraryResolver)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setHtmlParts(java.lang.String)">setHtmlParts</a></strong>(java.lang.String[]
 htmlParts)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setJspTags(java.util.Map)">setJspTags</a></strong>(java.util.Map 
jspTags)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setJspTagLibraryResolver(org.grails.gsp.jsp.TagLibraryResolver)">setJspTagLibraryResolver</a></strong>(<a
 
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a>
 jspTagLibraryResolver)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setLastModified(long)">setLastModified</a></strong>(long 
lastModified)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setJspTags(java.util.Map)">setJspTags</a></strong>(java.util.Map 
jspTags)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
@@ -468,29 +456,35 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setStaticCodecName(java.lang.String)">setStaticCodecName</a></strong>(java.lang.String
 staticCodecName)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setSourceChecksum(java.lang.String)">setSourceChecksum</a></strong>(java.lang.String
 sourceChecksum)</code><br> 
<DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> -  the checksum 
of the GSP source this page was compiled from</DD></DL></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setTagLibraryLookup(org.grails.taglib.TagLibraryLookup)">setTagLibraryLookup</a></strong>(<a
 href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> 
tagLibraryLookup)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setStaticCodecName(java.lang.String)">setStaticCodecName</a></strong>(java.lang.String
 staticCodecName)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setTaglibCodecName(java.lang.String)">setTaglibCodecName</a></strong>(java.lang.String
 taglibCodecName)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setTagLibraryLookup(org.grails.taglib.TagLibraryLookup)">setTagLibraryLookup</a></strong>(<a
 href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> 
tagLibraryLookup)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td 
class="colLast"><code>public&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a 
href="#setTaglibCodecName(java.lang.String)">setTaglibCodecName</a></strong>(java.lang.String
 taglibCodecName)</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a 
href="#shouldReload(PrivilegedAction)">shouldReload</a></strong>(java.security.PrivilegedAction&lt;Resource&gt;
 resourceCallable)</code><br>Checks if this GSP has expired and should be 
reloaded (there is a newer source gsp available)
  PrivilegedAction is used so that locating the Resource is lazily 
evaluated.</td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#writeToFinished(java.io.Writer)">writeToFinished</a></strong>(java.io.Writer
 out)</code><br></td>
@@ -614,14 +608,6 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                 </a>
                     <h3>Method Detail</h3>
                     
-                        <a 
name="applyLastModifiedFromResource(org.springframework.core.io.Resource)"><!-- 
--></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>public&nbsp;void 
<strong>applyLastModifiedFromResource</strong>(<a 
href='../../../org.springframework.core.io.Resource.html'>Resource</a> 
resource)</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
                         <a name="call()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -702,14 +688,6 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                             </li>
                         </ul>
                     
-                        <a name="getLastModified()"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>public&nbsp;long 
<strong>getLastModified</strong>()</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
                         <a name="getLineNumbers()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -766,6 +744,15 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                             </li>
                         </ul>
                     
+                        <a name="getSourceChecksum()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;java.lang.String 
<strong>getSourceChecksum</strong>()</h4>
+                                <p>
+      <DL><DT><B>Returns:</B></DT><DD>the checksum of the GSP source this page 
was compiled from, or <CODE>null</CODE> if none was 
recorded</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+                            </li>
+                        </ul>
+                    
                         <a name="getStaticEncoder()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -902,14 +889,6 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                             </li>
                         </ul>
                     
-                        <a name="setLastModified(long)"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>public&nbsp;void 
<strong>setLastModified</strong>(long lastModified)</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
                         <a name="setLineNumbers(int[])"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -942,6 +921,15 @@ implements <a 
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
                             </li>
                         </ul>
                     
+                        <a name="setSourceChecksum(java.lang.String)"><!-- 
--></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;void 
<strong>setSourceChecksum</strong>(java.lang.String sourceChecksum)</h4>
+                                <p>
+      <DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> -  the 
checksum of the GSP source this page was compiled 
from</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+                            </li>
+                        </ul>
+                    
                         <a name="setStaticCodecName(java.lang.String)"><!-- 
--></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html 
b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
index 0b49a6b434c..52d543e0ab9 100644
--- a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
+++ b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
@@ -224,19 +224,19 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                         
                         <tr class="rowColor">
                             <td 
class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_LAST_MODIFIED">CONSTANT_NAME_LAST_MODIFIED</a></code></td>
+                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_MODEL_FIELDS_MODE">CONSTANT_NAME_MODEL_FIELDS_MODE</a></code></td>
                             <td class="colLast"></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td 
class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_MODEL_FIELDS_MODE">CONSTANT_NAME_MODEL_FIELDS_MODE</a></code></td>
+                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_OUT_CODEC">CONSTANT_NAME_OUT_CODEC</a></code></td>
                             <td class="colLast"></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td 
class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_OUT_CODEC">CONSTANT_NAME_OUT_CODEC</a></code></td>
+                            <td class="colLast"><code><a 
href="#CONSTANT_NAME_SOURCE_CHECKSUM">CONSTANT_NAME_SOURCE_CHECKSUM</a></code></td>
                             <td class="colLast"></td>
                         </tr>
                         
@@ -355,89 +355,89 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                         </tr>
                         
                         <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td 
class="colLast"><code>public&nbsp;static&nbsp;java.lang.String</code></td>
+                            <td class="colLast"><code><strong><a 
href="#checksumOf(byte[])">checksumOf</a></strong>(byte[] 
source)</code><br>Computes the checksum recorded in the 
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#flushTagBuffering()">flushTagBuffering</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#generateGsp(java.io.Writer)">generateGsp</a></strong>(java.io.Writer 
target)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#generateGsp(java.io.Writer, 
boolean)">generateGsp</a></strong>(java.io.Writer target, boolean 
precompileMode)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getClassName()">getClassName</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getContentType()">getContentType</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;int</code></td>
                             <td class="colLast"><code><strong><a 
href="#getCurrentOutputLineNumber()">getCurrentOutputLineNumber</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getExpressionCodecDirectiveValue()">getExpressionCodecDirectiveValue</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getExpressionText(java.lang.String)">getExpressionText</a></strong>(java.lang.String
 text)</code><br>Returns an expression text for the given expression</td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getExpressionText(java.lang.String, 
boolean)">getExpressionText</a></strong>(java.lang.String text, boolean 
_safeDereference)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;static&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a 
href="#getGspEncoding()">getGspEncoding</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.util.List&lt;java.lang.String&gt;</code></td>
                             <td class="colLast"><code><strong><a 
href="#getHtmlParts()">getHtmlParts</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String[]</code></td>
                             <td class="colLast"><code><strong><a 
href="#getHtmlPartsArray()">getHtmlPartsArray</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.util.Map&lt;java.lang.String, 
java.lang.String&gt;</code></td>
                             <td class="colLast"><code><strong><a 
href="#getJspTags()">getJspTags</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;long</code></td>
-                            <td class="colLast"><code><strong><a 
href="#getLastModified()">getLastModified</a></strong>()</code><br></td>
-                        </tr>
-                        
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;int[]</code></td>
@@ -465,67 +465,67 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a 
href="#getStaticCodecDirectiveValue()">getStaticCodecDirectiveValue</a></strong>()</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#getSourceChecksum()">getSourceChecksum</a></strong>()</code><br> 
<DL><DT><B>Returns:</B></DT><DD>a checksum of the GSP source this page was 
generated from, or <CODE>null</CODE> if none was recorded</DD></DL></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a 
href="#getTaglibCodecDirectiveValue()">getTaglibCodecDirectiveValue</a></strong>()</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#getStaticCodecDirectiveValue()">getStaticCodecDirectiveValue</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;boolean</code></td>
-                            <td class="colLast"><code><strong><a 
href="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</code><br></td>
+                            <td 
class="colLast"><code>public&nbsp;java.lang.String</code></td>
+                            <td class="colLast"><code><strong><a 
href="#getTaglibCodecDirectiveValue()">getTaglibCodecDirectiveValue</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
-                            <td class="colLast"><code><strong><a 
href="#isInClosure()">isInClosure</a></strong>()</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;boolean</code></td>
-                            <td class="colLast"><code><strong><a 
href="#isModelFieldsMode()">isModelFieldsMode</a></strong>()</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#isInClosure()">isInClosure</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;java.io.InputStream</code></td>
-                            <td class="colLast"><code><strong><a 
href="#parse()">parse</a></strong>()</code><br></td>
+                            <td 
class="colLast"><code>public&nbsp;boolean</code></td>
+                            <td class="colLast"><code><strong><a 
href="#isModelFieldsMode()">isModelFieldsMode</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setClassName(java.lang.String)">setClassName</a></strong>(java.lang.String
 className)</code><br></td>
+                            <td 
class="colLast"><code>public&nbsp;java.io.InputStream</code></td>
+                            <td class="colLast"><code><strong><a 
href="#parse()">parse</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setEnableGrailsLayoutProcessing(boolean)">setEnableGrailsLayoutProcessing</a></strong>(boolean
 enableGrailsLayoutProcessing)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setClassName(java.lang.String)">setClassName</a></strong>(java.lang.String
 className)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setExpressionCodecDirectiveValue(java.lang.String)">setExpressionCodecDirectiveValue</a></strong>(java.lang.String
 expressionCodecDirectiveValue)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setEnableGrailsLayoutProcessing(boolean)">setEnableGrailsLayoutProcessing</a></strong>(boolean
 enableGrailsLayoutProcessing)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setKeepGeneratedDirectory(java.io.File)">setKeepGeneratedDirectory</a></strong>(java.io.File
 keepGeneratedDirectory)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setExpressionCodecDirectiveValue(java.lang.String)">setExpressionCodecDirectiveValue</a></strong>(java.lang.String
 expressionCodecDirectiveValue)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setLastModified(long)">setLastModified</a></strong>(long 
lastModified)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setKeepGeneratedDirectory(java.io.File)">setKeepGeneratedDirectory</a></strong>(java.io.File
 keepGeneratedDirectory)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
@@ -543,22 +543,29 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setStaticCodecDirectiveValue(java.lang.String)">setStaticCodecDirectiveValue</a></strong>(java.lang.String
 staticCodecDirectiveValue)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setSourceChecksum(java.lang.String)">setSourceChecksum</a></strong>(java.lang.String
 sourceChecksum)</code><br>Records a checksum of the GSP source, emitted as the 
<CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification 
time.</td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#setTaglibCodecDirectiveValue(java.lang.String)">setTaglibCodecDirectiveValue</a></strong>(java.lang.String
 taglibCodecDirectiveValue)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setStaticCodecDirectiveValue(java.lang.String)">setStaticCodecDirectiveValue</a></strong>(java.lang.String
 staticCodecDirectiveValue)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a 
href="#writeHtmlParts(java.io.File)">writeHtmlParts</a></strong>(java.io.File 
filename)</code><br></td>
+                            <td class="colLast"><code><strong><a 
href="#setTaglibCodecDirectiveValue(java.lang.String)">setTaglibCodecDirectiveValue</a></strong>(java.lang.String
 taglibCodecDirectiveValue)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td 
class="colLast"><code>public&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a 
href="#writeHtmlParts(java.io.File)">writeHtmlParts</a></strong>(java.io.File 
filename)</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a 
href="#writeLineNumbers(java.io.File)">writeLineNumbers</a></strong>(java.io.File
 filename)</code><br></td>
@@ -709,26 +716,26 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                             </li>
                         </ul>
                     
-                        <a name="CONSTANT_NAME_LAST_MODIFIED"><!-- --></a>
+                        <a name="CONSTANT_NAME_MODEL_FIELDS_MODE"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_LAST_MODIFIED</strong></h4>
+                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_MODEL_FIELDS_MODE</strong></h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="CONSTANT_NAME_MODEL_FIELDS_MODE"><!-- --></a>
+                        <a name="CONSTANT_NAME_OUT_CODEC"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_MODEL_FIELDS_MODE</strong></h4>
+                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_OUT_CODEC</strong></h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="CONSTANT_NAME_OUT_CODEC"><!-- --></a>
+                        <a name="CONSTANT_NAME_SOURCE_CHECKSUM"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_OUT_CODEC</strong></h4>
+                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>CONSTANT_NAME_SOURCE_CHECKSUM</strong></h4>
                                 <p></p>
                             </li>
                         </ul>
@@ -858,6 +865,23 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                 </a>
                     <h3>Method Detail</h3>
                     
+                        <a name="checksumOf(byte[])"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;static&nbsp;java.lang.String 
<strong>checksumOf</strong>(byte[] source)</h4>
+                                <p> Computes the checksum recorded in the 
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.
+ <p>
+ Both the compiler that writes the constant and the runtime that compares 
against it use this method, so
+ that the two can never disagree on how a GSP source is digested.
+ <p>
+ The argument must be the <strong>raw stored bytes</strong> of the page, 
exactly as they sit on disk or in
+ the jar entry — not the decoded, re-encoded or otherwise decorated source the 
runtime parse path works
+ with. That is the invariant that lets a checksum taken at compile time be 
compared against one taken by
+ re-reading the resource at reload time.
+      <DL><DT><B>Parameters:</B></DT><DD><code>source</code> -  the raw bytes 
of the GSP source</DD></DL><DL><DT><B>Returns:</B></DT><DD>the checksum as a 
lower-case hex string</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+                            </li>
+                        </ul>
+                    
                         <a name="flushTagBuffering()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -963,14 +987,6 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                             </li>
                         </ul>
                     
-                        <a name="getLastModified()"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>public&nbsp;long 
<strong>getLastModified</strong>()</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
                         <a name="getLineNumberMatrix()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -1003,6 +1019,15 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                             </li>
                         </ul>
                     
+                        <a name="getSourceChecksum()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;java.lang.String 
<strong>getSourceChecksum</strong>()</h4>
+                                <p>
+      <DL><DT><B>Returns:</B></DT><DD>a checksum of the GSP source this page 
was generated from, or <CODE>null</CODE> if none was 
recorded</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+                            </li>
+                        </ul>
+                    
                         <a name="getStaticCodecDirectiveValue()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -1083,27 +1108,29 @@ implements <a 
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
                             </li>
                         </ul>
                     
-                        <a name="setLastModified(long)"><!-- --></a>
+                        <a 
name="setOutCodecDirectiveValue(java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>public&nbsp;void 
<strong>setLastModified</strong>(long lastModified)</h4>
+                                <h4>public&nbsp;void 
<strong>setOutCodecDirectiveValue</strong>(java.lang.String 
outCodecDirectiveValue)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a 
name="setOutCodecDirectiveValue(java.lang.String)"><!-- --></a>
+                        <a name="setPackageName(java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>public&nbsp;void 
<strong>setOutCodecDirectiveValue</strong>(java.lang.String 
outCodecDirectiveValue)</h4>
+                                <h4>public&nbsp;void 
<strong>setPackageName</strong>(java.lang.String packageName)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="setPackageName(java.lang.String)"><!-- --></a>
+                        <a name="setSourceChecksum(java.lang.String)"><!-- 
--></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>public&nbsp;void 
<strong>setPackageName</strong>(java.lang.String packageName)</h4>
-                                <p></p>
+                                <h4>public&nbsp;void 
<strong>setSourceChecksum</strong>(java.lang.String sourceChecksum)</h4>
+                                <p> Records a checksum of the GSP source, 
emitted as the <CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification 
time.
+      <DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> -  the 
checksum, or <CODE>null</CODE> to record 
none</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html 
b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index f89c0c36566..6c50c9e2710 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html 
b/docs/snapshot/grails-data/developer-manual/introduction.html
index a636b8edfdc..c346e9e346e 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html 
b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index e6d7c1367aa..d39184b76eb 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html 
b/docs/snapshot/grails-data/developer-manual/testing.html
index 2cadd3c507d..bafbfbdaded 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index 1b79c48ddcd..3a8e21e732c 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index 6fbba3d92f5..b8163c1a8ef 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver 
connDetails) {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index 352b68cef15..c1e1eaddd15 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements 
GormEntityTraitProvider {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index d27e1f5bd48..fffaeef1cd1 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index a07e0f8fac8..ffe5f5c6ca8 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key, 
final Object entry)
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index 58f2b5d7c25..c336273f3ad 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support 
the calculation of a
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index 6e5b17cba65..73028c30daf 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then 
it is ok to just ret
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html 
b/docs/snapshot/grails-data/whats-new-manual/index.html
index 6e132f65d92..c10acf605c3 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index c3c74d15710..936dc54ef84 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -6512,6 +6512,47 @@ from the CAS plugin, so enabling 
<code>cas.useSingleSignout</code> now has the d
 <p>The Spring Security CAS configuration reference in this guide documents the 
setting in full.</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_49_gsps_record_a_source_checksum_instead_of_a_modification_time">49. 
GSPs Record a Source Checksum Instead of a Modification Time</h4>
+<div class="paragraph">
+<p>A GSP used to carry the modification time of its <code>.gsp</code> source, 
precompiled pages baking it into the
+generated class as a <code>LAST_MODIFIED</code> constant. Git stores no 
modification times, so every fresh clone or CI
+checkout gave each source a new one, and the generated classes differed on 
every checkout even when the
+sources were byte-for-byte identical. Because <code>LAST_MODIFIED</code> was a 
compile-time constant it was part of the
+class&#8217;s ABI, so the difference survived even Gradle&#8217;s 
compile-classpath normalization and every task
+downstream of a jar containing precompiled GSPs missed the build cache.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 records a <code>SOURCE_CHECKSUM</code> of the page source instead, 
for pages compiled at build time and at
+runtime alike. Identical sources now compile to identical bytes on every 
machine.</p>
+</div>
+<div class="paragraph">
+<p>Runtime reloading, described in
+<a href="#makingChangesToADeployedApplication">Making Changes to a Deployed 
Application</a>, is unaffected: a page is
+reloaded when its source no longer matches the recorded checksum. Detection is 
more accurate than it was.
+An edit is caught whenever the source&#8217;s modification time or length 
moves, which any ordinary save does;
+previously a save landing within the old granularity window went unnoticed 
until a later edit moved it
+clear. In the other direction, a page whose modification time moves without 
its content changing is no
+longer recompiled, so touching a file — or a build step copying views into 
place — no longer reloads pages
+that did not actually change. If you were using <code>touch</code> to force a 
page to recompile, edit the page instead.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed API.</strong> 
<code>GroovyPageMetaInfo.getLastModified()</code>, 
<code>setLastModified(long)</code> and
+<code>applyLastModifiedFromResource(Resource)</code> are gone, as are 
<code>GroovyPageParser.getLastModified()</code> and
+<code>setLastModified(long)</code>. Use 
<code>GroovyPageMetaInfo.getSourceChecksum()</code> to identify the source a 
page was
+compiled from. Generated page classes no longer declare a 
<code>LAST_MODIFIED</code> constant.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed setting.</strong> 
<code>grails.gsp.reload.granularity</code> is gone. It existed to absorb 
rounding differences
+between modification times, which comparing content does not need; setting it 
now has no effect.
+<code>grails.gsp.reload.interval</code> is unchanged.</p>
+</div>
+<div class="paragraph">
+<p>A GSP precompiled by Grails 7 and shipped inside a binary plugin carries no 
checksum. Such a page is served
+normally; it is simply never reload-checked, which was already the case for 
views resolved out of a plugin
+jar.</p>
+</div>
+</div>
 </div>
 
 
@@ -22097,19 +22138,17 @@ cp -R grails-app/views/* 
/var/www/grails/my-app/grails-app/views</pre>
 </tr>
 <tr>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">grails.gsp.reload.interval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">interval 
between checking the lastmodified time of the gsp source file, unit is 
milliseconds</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">interval 
between checks of the gsp source file, unit is milliseconds</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">5000</p></td>
 </tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">grails.gsp.reload.granularity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">the number 
of milliseconds leeway to give before deciding a file is out of date. this is 
needed because different roundings usually cause a 1000ms difference in 
lastmodified times</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">1000</p></td>
-</tr>
 </tbody>
 </table>
 <div class="paragraph">
 <p>GSP reloading is supported for precompiled GSPs since Grails 1.3.5.</p>
 </div>
+<div class="paragraph">
+<p>A GSP records a checksum of the page it was compiled from, and is reloaded 
when the source no longer matches that checksum. Comparing content rather than 
modification times means a page that was copied or checked out afresh — and so 
carries a new modification time but the same content — is not needlessly 
recompiled, and an edit is detected however close together two writes fall. 
Precompiled and runtime-compiled pages are compared the same way.</p>
+</div>
 
 <a name="7.3 Tag Libraries"><!-- Legacy link --></a>
 <h2 id="taglibs">8.2.7 Tag Libraries</h2>
diff --git a/docs/snapshot/guide/theWebLayer.html 
b/docs/snapshot/guide/theWebLayer.html
index d2cb914242a..390cd2e30e6 100644
--- a/docs/snapshot/guide/theWebLayer.html
+++ b/docs/snapshot/guide/theWebLayer.html
@@ -4784,19 +4784,17 @@ cp -R grails-app/views/* 
/var/www/grails/my-app/grails-app/views</pre>
 </tr>
 <tr>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">grails.gsp.reload.interval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">interval 
between checking the lastmodified time of the gsp source file, unit is 
milliseconds</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">interval 
between checks of the gsp source file, unit is milliseconds</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">5000</p></td>
 </tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">grails.gsp.reload.granularity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">the number 
of milliseconds leeway to give before deciding a file is out of date. this is 
needed because different roundings usually cause a 1000ms difference in 
lastmodified times</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">1000</p></td>
-</tr>
 </tbody>
 </table>
 <div class="paragraph">
 <p>GSP reloading is supported for precompiled GSPs since Grails 1.3.5.</p>
 </div>
+<div class="paragraph">
+<p>A GSP records a checksum of the page it was compiled from, and is reloaded 
when the source no longer matches that checksum. Comparing content rather than 
modification times means a page that was copied or checked out afresh — and so 
carries a new modification time but the same content — is not needlessly 
recompiled, and an edit is detected however close together two writes fall. 
Precompiled and runtime-compiled pages are compared the same way.</p>
+</div>
 
 <a name="7.3 Tag Libraries"><!-- Legacy link --></a>
 <h2 id="taglibs">8.2.7 Tag Libraries</h2>
diff --git a/docs/snapshot/guide/upgrading.html 
b/docs/snapshot/guide/upgrading.html
index 7e8dd7f5fbf..b73ef5a3564 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -3999,6 +3999,47 @@ from the CAS plugin, so enabling 
<code>cas.useSingleSignout</code> now has the d
 <p>The Spring Security CAS configuration reference in this guide documents the 
setting in full.</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_49_gsps_record_a_source_checksum_instead_of_a_modification_time">49. 
GSPs Record a Source Checksum Instead of a Modification Time</h4>
+<div class="paragraph">
+<p>A GSP used to carry the modification time of its <code>.gsp</code> source, 
precompiled pages baking it into the
+generated class as a <code>LAST_MODIFIED</code> constant. Git stores no 
modification times, so every fresh clone or CI
+checkout gave each source a new one, and the generated classes differed on 
every checkout even when the
+sources were byte-for-byte identical. Because <code>LAST_MODIFIED</code> was a 
compile-time constant it was part of the
+class&#8217;s ABI, so the difference survived even Gradle&#8217;s 
compile-classpath normalization and every task
+downstream of a jar containing precompiled GSPs missed the build cache.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 records a <code>SOURCE_CHECKSUM</code> of the page source instead, 
for pages compiled at build time and at
+runtime alike. Identical sources now compile to identical bytes on every 
machine.</p>
+</div>
+<div class="paragraph">
+<p>Runtime reloading, described in
+<a href="#makingChangesToADeployedApplication">Making Changes to a Deployed 
Application</a>, is unaffected: a page is
+reloaded when its source no longer matches the recorded checksum. Detection is 
more accurate than it was.
+An edit is caught whenever the source&#8217;s modification time or length 
moves, which any ordinary save does;
+previously a save landing within the old granularity window went unnoticed 
until a later edit moved it
+clear. In the other direction, a page whose modification time moves without 
its content changing is no
+longer recompiled, so touching a file — or a build step copying views into 
place — no longer reloads pages
+that did not actually change. If you were using <code>touch</code> to force a 
page to recompile, edit the page instead.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed API.</strong> 
<code>GroovyPageMetaInfo.getLastModified()</code>, 
<code>setLastModified(long)</code> and
+<code>applyLastModifiedFromResource(Resource)</code> are gone, as are 
<code>GroovyPageParser.getLastModified()</code> and
+<code>setLastModified(long)</code>. Use 
<code>GroovyPageMetaInfo.getSourceChecksum()</code> to identify the source a 
page was
+compiled from. Generated page classes no longer declare a 
<code>LAST_MODIFIED</code> constant.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed setting.</strong> 
<code>grails.gsp.reload.granularity</code> is gone. It existed to absorb 
rounding differences
+between modification times, which comparing content does not need; setting it 
now has no effect.
+<code>grails.gsp.reload.interval</code> is unchanged.</p>
+</div>
+<div class="paragraph">
+<p>A GSP precompiled by Grails 7 and shipped inside a binary plugin carries no 
checksum. Such a page is served
+normally; it is simply never reload-checked, which was already the case for 
views resolved out of a plugin
+jar.</p>
+</div>
+</div>
 </div>
 
 

Reply via email to